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


相关文章
|
9月前
|
Web App开发 人工智能 JSON
AutoMouser:AI Chrome扩展程序,实时跟踪用户的浏览器操作,自动生成自动化操作脚本
AutoMouser是一款Chrome扩展程序,能够实时跟踪用户交互行为,并基于OpenAI的GPT模型自动生成Selenium测试代码,简化自动化测试流程。
534 17
AutoMouser:AI Chrome扩展程序,实时跟踪用户的浏览器操作,自动生成自动化操作脚本
|
9月前
|
Web App开发 数据采集 JavaScript
Chrome浏览器实例的TypeScript自动化脚本
Chrome浏览器实例的TypeScript自动化脚本
|
11月前
|
Web App开发 JavaScript 前端开发
使用 Chrome 浏览器的内存分析工具来检测 JavaScript 中的内存泄漏
【10月更文挑战第25天】利用 Chrome 浏览器的内存分析工具,可以较为准确地检测 JavaScript 中的内存泄漏问题,并帮助我们找出潜在的泄漏点,以便采取相应的解决措施。
1235 9
|
11月前
|
Web App开发 缓存 安全
WIN11 Chrome 双击打不开闪退及Chrome浏览器不能拖拽文件crx
【11月更文挑战第6天】本文介绍了 WIN11 系统中 Chrome 浏览器双击打不开闪退及不能拖拽文件 crx 的原因和解决方法。包括浏览器版本过旧、扩展程序冲突、硬件加速问题、缓存过多、安全软件冲突、系统文件损坏、用户配置文件损坏等问题的解决方案,以及 crx 文件的屏蔽、权限问题和文件格式问题的处理方法。
2800 2
|
11月前
|
Web App开发 Linux iOS开发
Chrome浏览器如何导出所有书签并导入书签
【11月更文挑战第4天】本文介绍了如何在 Chrome 浏览器中导出和导入书签。导出时,打开书签管理器,点击“整理”按钮选择“导出书签”,保存为 HTML 文件。导入时,同样打开书签管理器,点击“整理”按钮选择“导入书签”,选择之前导出的 HTML 文件即可。其他主流浏览器也支持导入这种格式的书签文件。
8336 2
|
13天前
|
JavaScript
Vue中如何实现兄弟组件之间的通信
在Vue中,兄弟组件可通过父组件中转、事件总线、Vuex/Pinia或provide/inject实现通信。小型项目推荐父组件中转或事件总线,大型项目建议使用Pinia等状态管理工具,确保数据流清晰可控,避免内存泄漏。
120 2
|
4月前
|
人工智能 JavaScript 算法
Vue 中 key 属性的深入解析:改变 key 导致组件销毁与重建
Vue 中 key 属性的深入解析:改变 key 导致组件销毁与重建
555 0
|
4月前
|
JavaScript UED
用组件懒加载优化Vue应用性能
用组件懒加载优化Vue应用性能
|
5月前
|
JavaScript 数据可视化 前端开发
基于 Vue 与 D3 的可拖拽拓扑图技术方案及应用案例解析
本文介绍了基于Vue和D3实现可拖拽拓扑图的技术方案与应用实例。通过Vue构建用户界面和交互逻辑,结合D3强大的数据可视化能力,实现了力导向布局、节点拖拽、交互事件等功能。文章详细讲解了数据模型设计、拖拽功能实现、组件封装及高级扩展(如节点类型定制、连接样式优化等),并提供了性能优化方案以应对大数据量场景。最终,展示了基础网络拓扑、实时更新拓扑等应用实例,为开发者提供了一套完整的实现思路和实践经验。
544 77