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


相关文章
|
6月前
|
JavaScript 数据可视化 前端开发
基于 Vue 与 D3 的可拖拽拓扑图技术方案及应用案例解析
本文介绍了基于Vue和D3实现可拖拽拓扑图的技术方案与应用实例。通过Vue构建用户界面和交互逻辑,结合D3强大的数据可视化能力,实现了力导向布局、节点拖拽、交互事件等功能。文章详细讲解了数据模型设计、拖拽功能实现、组件封装及高级扩展(如节点类型定制、连接样式优化等),并提供了性能优化方案以应对大数据量场景。最终,展示了基础网络拓扑、实时更新拓扑等应用实例,为开发者提供了一套完整的实现思路和实践经验。
784 77
|
存储 缓存 前端开发
前端谷歌浏览器面版属性
【8月更文挑战第19天】前端谷歌浏览器面版属性
227 0
|
JavaScript
VUE中el-input阻止冒泡防止触发父级事件
VUE中el-input阻止冒泡防止触发父级事件
578 130
Vue3拖拽插件(vuedraggable@next)
vuedraggable 是一款 Vue2 拖拽插件,可轻松实现列表项的拖拽排序与交互。通过简单配置,即可在不同区域间拖动元素并实现数据同步。支持多种事件监听和自定义样式。
1442 2
Vue3拖拽插件(vuedraggable@next)
|
JavaScript
|
JavaScript
基于Vue2或Vue3实现任意上下左右拖拽悬浮的元素,且配置为自定义的全局指令
这篇文章介绍了如何在Vue 2或Vue 3项目中实现一个自定义的全局指令`v-dragSwitch`,用于创建可以任意方向拖拽并悬浮的元素,同时包含边界处理的逻辑。
3799 2
基于Vue2或Vue3实现任意上下左右拖拽悬浮的元素,且配置为自定义的全局指令
|
Web App开发
Chrome——谷歌浏览器chrome如何模拟其他客户端
Chrome——谷歌浏览器chrome如何模拟其他客户端
337 1
Chrome——谷歌浏览器chrome如何模拟其他客户端
|
Web App开发 存储 前端开发
《Chrome谷歌插件Top10》开发最好用的谷歌插件
本文介绍了多个实用的浏览器插件及其安装方法。包括CSDN浏览器助手,提供高效开发工具;FeHelper,前端必备工具,支持格式化、压缩等功能;uBlock Origin,有效屏蔽广告和弹窗;PageLiner,网页标尺工具,便于前端设计;Fatkun,批量下载图片;Smallpdf,文件转换工具;Octotree,GitHub代码树插件;Awesome Screenshot,截图与录屏工具;ColorZilla,颜色拾取器;Dark Reader,暗黑模式阅读插件。安装方式有通过Chrome商店搜索或下载crx插件本地安装。
405 11
|
JavaScript API
深入解析JS中的visibilitychange事件:监听浏览器标签间切换的利器
深入解析JS中的visibilitychange事件:监听浏览器标签间切换的利器
689 0