【Vue版】实现拖拽、排序效果(注意,这个方法在chrome谷歌浏览器上面不适用,dragend会情不自禁触发drag事件先执行,有点像浏览器的一个bug)

简介: 【Vue版】实现拖拽、排序效果(注意,这个方法在chrome谷歌浏览器上面不适用,dragend会情不自禁触发drag事件先执行,有点像浏览器的一个bug)
<div
 class='dragged'
 :index="$index"
 draggable='true'
 @dragstart="dragstart"
 @drag="drag"
 @dragend="dragend"
</div>

HTML5为所有HTML元素规定了一个draggable属性,表示元素是否可以拖动,图像和链接的draggable属性自动被设置成了true,而其他元素这个属性的默认值都是false。

[注意] Angular下必须设置draggable='true'才能生效,只设置draggable不起作用

methods: {
    // VUE解决拖拽、排序问题----------------------------------------------------------------
    // 开始拖拽
    dragstart(event) {
      var target = event.target;
      var event = event || window.event; //兼容IE浏览器
      // 鼠标点击物体那一刻相对于物体左侧边框的距离=点击时的位置相对于浏览器最左边的距离-物体左边框相对于浏览器最左边的距离
      target.diffX = event.clientX - target.offsetLeft;
      target.diffY = event.clientY - target.offsetTop;
    },
    //拖拽中…
    drag(event) {
      var target = event.target;
      target.setAttribute("dragging", "true"); //拖拽过程变成虚线的样子
      var event = event || window.event;
      var x = event.clientX - target.diffX;
      var y = event.clientY - target.diffY;
      if (x < 0) {
        x = 0;
      } else if (x > innerWidth - target.offsetWidth) {
        x = innerWidth - target.offsetWidth;
      }
      if (y < 0) {
        y = 0;
      } else if (y > innerHeight - target.offsetHeight) {
        y = innerHeight - target.offsetHeight;
      }
      target.style.left = x + "px"; //左右拖拽
      target.style.top = y + "px"; //上下拖拽
    },
    //拖拽结束
    dragend(event) {
      var target = event.target;
      target.removeAttribute("dragging"); //取消虚线样式
      var currentIndex = parseInt(target.getAttribute("index")); //被移动的索引
      var targetIndex = this.getSortSequenceBlockIndex(target); //即将移动到的索引
      this.$g.array.jumpQueue([被拖拽的doms数组], currentIndex, targetIndex); //插队
    },
    // ---------------------------------------------------------------- 
    // 获取将会被插入的sequence的block顺序
    getSortSequenceBlockIndex(currentTarget) {
      var shadowDis = 10; //阴影间距
      var arr = [被拖拽的doms数组];
      var currentTargetIndex = parseInt(currentTarget.getAttribute("index"));
      var currentTargetTop = parseInt(currentTarget.style.top);
      for (var i = 0, len = arr.length; i < len; i++) {
        var target  = arr[i];
        if (target) {
          var targetTop = parseInt(target.style.top);
          if (currentTarget != target) {
            if (
              currentTargetIndex === i - 1 &&
              currentTargetTop + currentTarget.offsetHeight + shadowDis <
                targetTop
            )
              return currentTargetIndex; 
            if (currentTargetTop - shadowDis < targetTop + target.offsetHeight)
              return i; 
          }
        }
      }
    },
}
div.dragged { 
  /*禁止选中文本*/
  -moz-user-select: none;
  -webkit-user-select: none;
  -ms-user-select: none;
  -khtml-user-select: none;
  user-select: none;
  cursor: grab !important;
  &:active {
    z-index: 1;
    cursor: grabbing !important;
    opacity: .618;
  }
  &[dragging] {
    background: white !important;
    border: 1px dashed gray !important;
    color: gray !important;
    opacity: 0.9 !important;
    transform: translate(-3px, -3px);
    box-shadow: 5px 10px 0 rgba(0, 0, 0, 0.05);
  }
  &[animate] {
    transition: 0.618s ease;
  }
}


目录
打赏
0
0
0
0
73
分享
相关文章
WIN11 Chrome 双击打不开闪退及Chrome浏览器不能拖拽文件crx
【11月更文挑战第6天】本文介绍了 WIN11 系统中 Chrome 浏览器双击打不开闪退及不能拖拽文件 crx 的原因和解决方法。包括浏览器版本过旧、扩展程序冲突、硬件加速问题、缓存过多、安全软件冲突、系统文件损坏、用户配置文件损坏等问题的解决方案,以及 crx 文件的屏蔽、权限问题和文件格式问题的处理方法。
428 2
vue学习:chrome 中 vuetools 开发插件 的下载、安装
这篇文章介绍了如何在Chrome浏览器中下载、安装并测试Vue.js开发插件——vue-devtools。
781 0
vue学习:chrome 中 vuetools 开发插件 的下载、安装
|
5月前
|
深入解析JS中的visibilitychange事件:监听浏览器标签间切换的利器
深入解析JS中的visibilitychange事件:监听浏览器标签间切换的利器
256 0
VUE中el-input阻止冒泡防止触发父级事件
VUE中el-input阻止冒泡防止触发父级事件
JS逆向浏览器脱环境专题:事件学习和编写、DOM和BOM结构、指纹验证排查、代理自吐环境通杀环境检测、脱环境框架、脱环境插件解决
JS逆向浏览器脱环境专题:事件学习和编写、DOM和BOM结构、指纹验证排查、代理自吐环境通杀环境检测、脱环境框架、脱环境插件解决
244 1
【Azure 存储服务】MP4视频放在Azure的Blob里面,用生成URL在浏览器中打开之后,视频可以正常播放却无法拖拽视频的进度
【Azure 存储服务】MP4视频放在Azure的Blob里面,用生成URL在浏览器中打开之后,视频可以正常播放却无法拖拽视频的进度
|
7月前
|
VUE——监听浏览器关闭及标签页关闭事件
VUE——监听浏览器关闭及标签页关闭事件
461 0
Chrome 安装 Vue Devtools 调试工具
Chrome 安装 Vue Devtools 调试工具
62 0
|
8月前
|
vue 组件封装 | 随鼠标移动的信息框 (含监听鼠标移动、移出事件,获取元素的宽高、获取浏览器的宽高)
vue 组件封装 | 随鼠标移动的信息框 (含监听鼠标移动、移出事件,获取元素的宽高、获取浏览器的宽高)
66 1

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等