【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;
  }
}


相关文章
|
JavaScript 数据可视化 前端开发
基于 Vue 与 D3 的可拖拽拓扑图技术方案及应用案例解析
本文介绍了基于Vue和D3实现可拖拽拓扑图的技术方案与应用实例。通过Vue构建用户界面和交互逻辑,结合D3强大的数据可视化能力,实现了力导向布局、节点拖拽、交互事件等功能。文章详细讲解了数据模型设计、拖拽功能实现、组件封装及高级扩展(如节点类型定制、连接样式优化等),并提供了性能优化方案以应对大数据量场景。最终,展示了基础网络拓扑、实时更新拓扑等应用实例,为开发者提供了一套完整的实现思路和实践经验。
1874 78
|
JavaScript
VUE中el-input阻止冒泡防止触发父级事件
VUE中el-input阻止冒泡防止触发父级事件
814 130
|
Web App开发 缓存 安全
WIN11 Chrome 双击打不开闪退及Chrome浏览器不能拖拽文件crx
【11月更文挑战第6天】本文介绍了 WIN11 系统中 Chrome 浏览器双击打不开闪退及不能拖拽文件 crx 的原因和解决方法。包括浏览器版本过旧、扩展程序冲突、硬件加速问题、缓存过多、安全软件冲突、系统文件损坏、用户配置文件损坏等问题的解决方案,以及 crx 文件的屏蔽、权限问题和文件格式问题的处理方法。
5599 2
Vue3拖拽插件(vuedraggable@next)
vuedraggable 是一款 Vue2 拖拽插件,可轻松实现列表项的拖拽排序与交互。通过简单配置,即可在不同区域间拖动元素并实现数据同步。支持多种事件监听和自定义样式。
2576 2
Vue3拖拽插件(vuedraggable@next)
|
JavaScript
基于Vue2或Vue3实现任意上下左右拖拽悬浮的元素,且配置为自定义的全局指令
这篇文章介绍了如何在Vue 2或Vue 3项目中实现一个自定义的全局指令`v-dragSwitch`,用于创建可以任意方向拖拽并悬浮的元素,同时包含边界处理的逻辑。
4609 2
基于Vue2或Vue3实现任意上下左右拖拽悬浮的元素,且配置为自定义的全局指令
|
JavaScript
|
Web App开发 JSON JavaScript
vue学习:chrome 中 vuetools 开发插件 的下载、安装
这篇文章介绍了如何在Chrome浏览器中下载、安装并测试Vue.js开发插件——vue-devtools。
4871 0
vue学习:chrome 中 vuetools 开发插件 的下载、安装
|
编解码 JavaScript 前端开发
JS逆向浏览器脱环境专题:事件学习和编写、DOM和BOM结构、指纹验证排查、代理自吐环境通杀环境检测、脱环境框架、脱环境插件解决
JS逆向浏览器脱环境专题:事件学习和编写、DOM和BOM结构、指纹验证排查、代理自吐环境通杀环境检测、脱环境框架、脱环境插件解决
1250 1
|
JavaScript 前端开发
【Vue 3】如何实现动态表单生成器的拖拽功能?
【Vue 3】如何实现动态表单生成器的拖拽功能?