JQuery+drag.js上传图片并且实现图片拖曳


Posted in jQuery onNovember 18, 2020

外层的容器的id属性应为'container'

容器中有多个队列,这些队列之间可以随意拖动,class属性应为'queue'

队列中有多个拖动块,class属性应为'dragger'

把拖动块拖到队列的尾部空白处会使这个拖动块加到队列尾部

1.html部分:

<tr>
              <td><span class="colorred">* </span>商品展示图片:</td>
              <td style="padding:20px 20px 20px 0">
                <div id="container11" style="padding:20px 0; border: 1px #ededed solid;">
                  <ul class="shop_imgs queue" style="width: 746px;  height: 100px;">
                    <li class="dragger" data-id="1">
                      <input type="file" name="files[]" class="qy_yyzz1 f" onchange="handleFiles(this.files,this.parentNode)">
                    </li>
                    <li class="dragger" data-id="2"> <input type="file" name="files[]" class="qy_yyzz2 f" onchange="handleFiles(this.files,this.parentNode)">
                    </li>
                    <li class="dragger" data-id="3"> <input type="file" name="files[]" class="qy_yyzz3 f" onchange="handleFiles(this.files,this.parentNode)">
                      </li>
                    <li class="dragger" data-id="4"> <input type="file" name="files[]" class="qy_yyzz4 f" onchange="handleFiles(this.files,this.parentNode)">
                     </li>
                    <li class="dragger" data-id="5"> <input type="file" name="files[]" class="qy_yyzz5 f" onchange="handleFiles(this.files,this.parentNode)">
                      </li>

                  </ul>
                 
                </div>  
              </td>
            </tr>

js部分:

<script type="text/javascript" src="jquery-1.9.1.min.js"></script>
<script type="text/javascript" src="/drag/drag.js"></script>
<script type="text/javascript" src="/drag/main.js"></script>
 //构建预览上传图片的函数,并接收传递过来的2个变量参数
  function handleFiles(file, obj) {
    var val=file[0].name
    if (!/.(gif|jpg|jpeg|png|GIF|JPG|bmp)$/.test(val)) {
        layer.msg('图片类型必须是.gif,jpeg,jpg,png,bmp中的一种', {icon: 0,time: 2000, title: '提示'});
        return false;
    }
    //获取当前点击的元素的所有同级元素的html内容
    var con = obj.innerHTML;
    //判断当前点击元素内是否已经存在img图片元素,如果有则先全部清除后再添加,如果没有就直接添加
    if (con.indexOf("img") > 0) {
      var pic = obj.getElementsByTagName("img");
      for (var i = 0; i < pic.length; i++) {
        obj.removeChild(pic[i]);
      }
      //调用添加img图片的函数
      creatImg();
    } else {
      creatImg();
    }

    function creatImg() {
      //创建一个img元素
      var img = document.createElement("img");
      // 创建一个删除img
      var del =document.createElement("span")
      //设置img元素的源文件路径,window.URL.createObjectURL() 方法会根据传入的参数创建一个指向该参数对象的URL. 这个URL的生命仅存在于它被创建的这个文档里
      img.src = window.URL.createObjectURL(file[0]);
      //window.URL.revokeObjectURL() 释放一个通过URL.createObjectURL()创建的对象URL,在图片被显示出来后,我们就不再需要再次使用这个URL了,因此必须要在加载后释放它
      img.onload = function () {
        window.URL.revokeObjectURL(this.src);
      }
      //在当前点击的input元素后添加刚刚创建的img图片元素
      obj.appendChild(img);
      obj.appendChild(del);

    }
    // 删除图片
    $(".shop_imgs li span").bind("click",function(){
      $(this).siblings("input[type='file']").val('')
      $(this).siblings('img').remove()
      $(this).remove()
    });
  }
  // 图片禁止拖拽
  $('.shop_imgs li').on('mousedown',function (e) {
  e.preventDefault()

css部分:

.div1-table tr {
  width: 100%;
  height: 68px;
  line-height: 68px;
  border-bottom: 1px solid #eaeaea;
}
.div1-table tr td:first-child {
  padding-left: 30px;
  width: 16%;
}
.shop_imgs {
  display: flex;
  justify-content: space-around;
  margin: 20px 0;
}
.shop_imgs li {
  position: relative;
  width: 100px;
  height: 100px;
  background: url(../../images/user/shell/plus_sp_img.jpg) no-repeat center;
  text-align: center;
  cursor: move;
  list-style: none;
}
.shop_imgs input[type="file"] {
  position: absolute;
  left: 0;
  bottom: 0;
  /* z-index: 3; */
  display: inline-block;
  width: 100%;
  height: 100%;
  cursor: pointer;
  border: none;
  opacity: 0;
  padding-left: 10px;
}
.shop_imgs li span {
  position: absolute;
  right: 6px;
  top: 7px;
  width: 23px;
  height: 23px;
  background: url(../../images/close.png) no-repeat center;
  background-size: 100%;
  cursor: pointer;
}
.shop_imgs li img {
  position: absolute;
  top: 10px;
  left: 10px;
  width: 80px;
  height: 80px;
}

main.js:

// main.js里面的内容是调用:

(function(){registerDrag($('#container11'));})();

drag.js:

var queueArr = []; var draggers = []; var isDragging = false; var isMouseDown = false; var dragger = null; var mouseX; var mouseY; var draggerLeft; var draggerTop; var clone = null; var DRAG_THRESHOLD = 5; var queueContainer; var queueActive = { }; var queueUnActive = { }; var registerDrag = function (container) {
  queueContainer = container; $.each(container.find('.queue'), function (index, value) { queueArr[index] = $(value); draggers[index] = []; elements = $(value).find('.dragger'); $.each(elements, function (_index, _value) { draggers[index][_index] = $(_value); }); }); for (var i = 0; i < draggers.length; i++)
    for (var j = 0; j < draggers[i].length; j++) { draggers[i][j].on('mousedown', dragStart); }
  $(document).on('mousemove', dragMove); $(document).on('mouseup', dragEnd);
}
var dragStart = function (e) { e.stopPropagation(); isMouseDown = true; mouseX = e.clientX; mouseY = e.clientY; dragger = $(this); }
var dragMove = function (e) { e.stopPropagation(); if (!isMouseDown) return; var dx = e.clientX - mouseX; var dy = e.clientY - mouseY; if (isDragging) { clone.css({ left: draggerLeft + dx, top: draggerTop + dy }); arrangeDragger(); } else if (Math.abs(dx) > DRAG_THRESHOLD || Math.abs(dy) > DRAG_THRESHOLD) { clone = makeClone(dragger); draggerLeft = dragger.offset().left - parseInt(dragger.css('margin-left')) - parseInt(dragger.css('padding-left')); draggerTop = dragger.offset().top - parseInt(dragger.css('margin-top')) - parseInt(dragger.css('padding-top')); clone.css({ left: draggerLeft, top: draggerTop }); queueContainer.append(clone); dragger.css('visibility', 'hidden'); isDragging = true; } }
var dragEnd = function (e) {
  e.stopPropagation(); if (isDragging) { isDragging = false; clone.remove(); dragger.css('visibility', 'visible'); }
  for (var i = 0; i < queueArr.length; i++)
    queueArr[i].css(queueUnActive); isMouseDown = false;
}
// 复制出来移动的图片的样式
var makeClone = function (source) { var res = source.clone(); res.addClass('cloneimg');res.children('img').attr('src','/static/index/images/user/shell/tuozhuai.png');res.css({ position: 'absolute', 'z-index': 100000 }); return res; }
var arrangeDragger = function () {
  for (var i = 0; i < queueArr.length; i++)
    queueArr[i].css(queueUnActive); var queueIn = findQueue(); if (queueIn != -1)
    queueArr[queueIn].css(queueActive); var hover = findHover(queueIn); if (hover == null)
    return; var _hover = hover.hover; var _insert = hover.insert; var queueIdOriginal, drggerIdOriginal; var queueIdHover, drggerIdHover; for (var i = 0; i < draggers.length; i++)
    for (var j = 0; j < draggers[i].length; j++) { if (draggers[i][j][0] == dragger[0]) { queueIdOriginal = i; drggerIdOriginal = j; } }
  draggers[queueIdOriginal].splice(drggerIdOriginal, 1); if (_hover) {
    for (var i = 0; i < draggers.length; i++)
      for (var j = 0; j < draggers[i].length; j++) { if (_hover && draggers[i][j][0] == _hover[0]) { queueIdHover = i; drggerIdHover = j; } }
    if (_insert == 'left') { _hover.before(dragger); draggers[queueIdHover].splice(drggerIdHover, 0, dragger); }
    else { _hover.after(dragger); draggers[queueIdHover].splice(drggerIdHover + 1, 0, dragger); }
  } else { draggers[queueIn].push(dragger); queueArr[queueIn].append(dragger); }
  // console.log('******************'); for (var i = 0; i < draggers.length; i++)
  //   for (var j = 0; j < draggers[i].length; j++)
  //     console.log(draggers[i][j][0]); console.log('******************');
}
var findQueue = function () {
  var mx = -1, pos = -1; var cloneTop = clone.offset().top; var cloneHeight = clone.height(); for (var i = 0; i < queueArr.length; i++) { var queueTop = queueArr[i].offset().top; var queueHeight = queueArr[i].height(); var val = Math.min(queueTop + queueHeight, cloneTop + cloneHeight) - Math.max(queueTop, cloneTop); if (val > mx) { mx = val; pos = i; } }
  return pos;
}
var findHover = function (queueIn) {
  if (queueIn == -1)
    return null; var mx = -1, pos = null; var cloneTop = clone.offset().top; var cloneHeight = clone.height(); var cloneLeft = clone.offset().left; var cloneWidth = clone.width(); var isOwn = false; for (var i = 0; i < draggers[queueIn].length; i++) {
      var _draggerTop = draggers[queueIn][i].offset().top; var _draggerHeight = draggers[queueIn][i].height(); var vertical = Math.min(_draggerTop + _draggerHeight, cloneTop + cloneHeight) - Math.max(_draggerTop, cloneTop); var _draggerLeft = draggers[queueIn][i].offset().left; var _draggerWidth = draggers[queueIn][i].width(); var horizontal = Math.min(_draggerLeft + _draggerWidth, cloneLeft + cloneWidth) - Math.max(_draggerLeft, cloneLeft); if (vertical <= 0 || horizontal <= 0) continue; var s = vertical * horizontal; if (s <= cloneHeight * cloneWidth / 3)
        continue; if (draggers[queueIn][i][0] == dragger[0]) { isOwn = true; continue; }
      if (s > mx) { mx = s; pos = draggers[queueIn][i]; }
    }
  if (mx < 0) {
    if (isOwn) return null; if (draggers[queueIn].length == 0) { return { 'hover': null }; } else {
      var last, index = draggers[queueIn].length - 1; while (index >= 0 && draggers[queueIn][index][0] == dragger[0])
        index--; if (index >= 0)
        last = draggers[queueIn][index]; else
        return { 'hover': null }; if (cloneLeft >= last.offset().left + last.width())
        return { 'hover': last, 'insert': 'right' }; else
        return null;
    }
  }
  else {
    var posMid = (2 * pos.offset().left + pos.width()) / 2; var cloneMid = (2 * clone.offset().left + clone.width()) / 2; if (posMid > cloneMid)
      return { 'hover': pos, 'insert': 'left' }; else
      return { 'hover': pos, 'insert': 'right' };
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

jQuery 相关文章推荐
jquery实现图片平滑滚动详解
Mar 22 jQuery
JQuery 进入页面默认给已赋值的复选框打钩
Mar 23 jQuery
jQuery表单验证之密码确认
May 22 jQuery
简述jQuery Easyui一些用法
Aug 01 jQuery
基于jQuery实现Ajax验证用户名是否可用实例
Mar 25 jQuery
jQuery 实现倒计时天,时,分,秒功能
Jul 31 jQuery
jQuery实现图片简单轮播功能示例
Aug 13 jQuery
jQuery+css last-child实现选择最后一个子元素操作示例
Dec 10 jQuery
JavaScript表格隔行变色和Tab标签页特效示例【附jQuery版】
Jul 11 jQuery
jQuery带控制按钮轮播图插件
Jul 31 jQuery
基于jQuery拖拽事件的封装
Nov 29 jQuery
jQuery实现tab栏切换效果
Dec 22 jQuery
JavaScript枚举选择jquery插件代码实例
Nov 17 #jQuery
如何在vue 中引入使用jquery
Nov 10 #jQuery
jquery实现加载更多&quot;转圈圈&quot;效果(示例代码)
Nov 09 #jQuery
jQuery实现移动端扭蛋机抽奖
Nov 08 #jQuery
Jquery Fade用法详解
Nov 06 #jQuery
jQuery列表动态增加和删除的实现方法
Nov 05 #jQuery
使用jQuery实现购物车
Oct 29 #jQuery
You might like
php数组合并array_merge()函数使用注意事项
2014/06/19 PHP
php使用递归函数实现数字累加的方法
2015/03/16 PHP
PHP使用Curl实现模拟登录及抓取数据功能示例
2018/04/27 PHP
Laravel框架实现的记录SQL日志功能示例
2018/06/19 PHP
thinkphp5框架实现数据库读取的数据转换成json格式示例
2019/10/10 PHP
PHP执行系统命令函数实例讲解
2021/03/03 PHP
extJs 文本框后面加上说明文字+下拉列表选中值后触发事件
2009/11/27 Javascript
jQuery timers计时器简单应用说明
2010/10/28 Javascript
jQuery实现验证码功能
2017/03/17 Javascript
js HTML5 canvas绘制图片的方法
2017/09/08 Javascript
ES6使用Set数据结构实现数组的交集、并集、差集功能示例
2017/10/31 Javascript
Vue实现点击后文字变色切换方法
2018/02/11 Javascript
解决vue无法设置滚动位置的问题
2018/10/07 Javascript
Bootstarp在pycharm中的安装及简单的使用方法
2019/04/19 Javascript
深入理解令牌认证机制(token)
2019/08/22 Javascript
layerui代码控制tab选项卡,添加,关闭的实例
2019/09/04 Javascript
js使用文档就绪函数动态改变页面内容示例【innerHTML、innerText】
2019/11/07 Javascript
解决Antd Table表头加Icon和气泡提示的坑
2020/11/17 Javascript
一键搞定python连接mysql驱动有关问题(windows版本)
2016/04/23 Python
Python验证文件是否可读写代码分享
2017/12/11 Python
Python 中@property的用法详解
2020/01/15 Python
python用pip install时安装失败的一系列问题及解决方法
2020/02/24 Python
Django admin 实现search_fields精确查询实例
2020/03/30 Python
解决Keras 自定义层时遇到版本的问题
2020/06/16 Python
python 第三方库paramiko的常用方式
2021/02/20 Python
HTML5 canvas实现雪花飘落特效
2016/03/08 HTML / CSS
晚宴邀请函范文
2014/01/15 职场文书
气象学专业个人求职信
2014/03/15 职场文书
带刀到教室的检讨书
2014/10/04 职场文书
青春雷锋观后感
2015/06/10 职场文书
文艺委员竞选稿
2015/11/19 职场文书
Go语言切片前或中间插入项与内置copy()函数详解
2021/04/27 Golang
利用python Pandas实现批量拆分Excel与合并Excel
2021/05/23 Python
图解排序算法之希尔排序Java实现
2021/06/26 Java/Android
python中Pyqt5使用Qlabel标签播放视频
2022/04/22 Python
mysql sql常用语句大全
2022/06/21 MySQL