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实现的简单在线计算器功能
May 11 jQuery
jQuery Validate表单验证插件实现代码
Jun 08 jQuery
jquery版轮播图效果和extend扩展
Jul 18 jQuery
jQuery Ajax向服务端传递数组参数值的实例代码
Sep 03 jQuery
Vue中正确使用jQuery的方法
Oct 30 jQuery
JQuery实现table中tr上移下移的示例(超简单)
Jan 08 jQuery
jQuery实现鼠标移入移出事件切换功能示例
Sep 06 jQuery
jquery简单实现纵向的无缝滚动代码实例
Apr 01 jQuery
jQuery实现input[type=file]多图预览上传删除等功能
Aug 02 jQuery
jQuery实现的记住帐号密码功能完整示例
Aug 03 jQuery
jQuery实现form表单基于ajax无刷新提交方法实例代码
Nov 04 jQuery
JQuery样式与属性设置方法分析
Dec 07 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在程序中将网页生成word文档并提供下载的代码
2012/10/09 PHP
如何使用PHP给图片加水印
2016/10/12 PHP
解决thinkPHP 5 nginx 部署时,只跳转首页的问题
2019/10/16 PHP
laravel清除视图缓存的代码
2019/10/23 PHP
baidu博客的编辑友情链接的新的层窗口!经典~支持【FF】
2007/02/09 Javascript
让JavaScript 轻松支持函数重载 (Part 1 - 设计)
2009/08/04 Javascript
JavaScript表达式:URL 协议介绍
2013/03/10 Javascript
JS操作图片(增,删,改) 例子
2013/04/17 Javascript
JS实现网页滚动条感应鼠标变色的方法
2015/02/26 Javascript
jQuery bt气泡实现悬停显示及移开隐藏功能的方法
2016/07/12 Javascript
每个程序员都需要学习 JavaScript 的7个理由小结
2016/09/03 Javascript
通过js修改input、select默认字体颜色
2017/04/19 Javascript
JavaScript中立即执行函数实例详解
2017/11/04 Javascript
vue富文本框(插入文本、图片、视频)的使用及问题小结
2018/08/17 Javascript
vue-cli监听组件加载完成的方法
2018/09/07 Javascript
改变layer confirm弹窗按钮的颜色方法
2019/09/12 Javascript
在nuxt中使用路由重定向的实例
2020/11/06 Javascript
Node.js文本文件BOM头的去除方法
2020/11/22 Javascript
[03:11]DOTA2上海特锦赛小组赛第一日recap精彩回顾
2016/02/28 DOTA
更改Ubuntu默认python版本的两种方法python-&gt; Anaconda
2016/12/18 Python
python实现冒泡排序算法的两种方法
2018/03/10 Python
Python3之简单搭建自带服务器的实例讲解
2018/06/04 Python
django_orm查询性能优化方法
2018/08/20 Python
Python整数与Numpy数据溢出问题解决
2019/09/11 Python
flask 框架操作MySQL数据库简单示例
2020/02/02 Python
宿舍违规检讨书
2014/01/12 职场文书
2014高考励志标语
2014/06/05 职场文书
2014年安全生产目标责任书
2014/07/23 职场文书
大一新生期末自我评价
2014/09/12 职场文书
2015年小学生新年寄语
2014/12/08 职场文书
工程催款通知书
2015/04/17 职场文书
关于五一放假的通知
2015/08/18 职场文书
搞笑欢迎词大全
2015/09/30 职场文书
HR必备:销售经理聘用合同范本
2019/08/21 职场文书
高一作文之乐趣
2019/11/21 职场文书
redis 限制内存使用大小的实现
2021/05/08 Redis