原生js实现左右页签拖拽draggable=true

背景介绍

如下图,实现这样的页签拖拽效果 

1、首先定义拖拽div,给每一个要拖拽的元素加draggable=true

<ul class="tab-ccl-list">
   <li
        draggable="true"
        :data-title="tab.value"
        v-for="(tab, index) in headerTabs"
        :key="index" 
        :class="{'active': tab.value == tabcheck}"
         @click="tabcheckFun(tab.value)">
        <span>{{tab.label}}</span>
      </li>
    </ul>

2、 给拖拽区域div绑定事件

getDragEvent(){
      let list=document.queryselector(".tab-test-list")
      //currentItem存放将要拖动的元素
      let currentItem;
      list.ondragover =e =>{
        e.preventDefault()
      }
        // 拖动开始
      list.ondragstart=e=>{// 延迟被拖动的原始元素样式
        setTimeout(()=>{
          e.target.classList.add('moving')
        },0)
        // 存储被拖动元素
        currentItem=e.target
        //拖动时默认行为是复制,此处改为移动
        e.dataTransfer.effectAllowed='move'
      }

      // 拖动中
      list.ondragenter= e =>{
        e.preventDefault()
        if(e.target == currentItem||e.target == list)return
        // 1ist.children获取的是类数组
        let itemList=Array.from(list.children);
        //获取当前拖动元素位置的下标
        let curItemIndex=itemList.indexOf(currentItem)
        //当前拖动元素所移动到的位置的元素的下标
        let targetIndex= itemList.indexOf(e.target)
        if(curItemIndex<targetIndex){
          list.insertBefore(currentItem,e.target.nextElementsibling)
        }else{
          list.insertBefore(currentItem,e.target)
        }
      }
      // 拖动结束
      list.ondragend = e =>{
        //结束移除移动样式
        e.target.classList.remove('moving')
        let listArr=Array.from(list.children);
        let tabArr=[]
        tabArr=listArr.map(item=>item.attributes[1].value)
        this.reqSave(tabArr)//保存页签顺序位置
      }

    }

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值