js拖拽排序

该文章介绍了一个名为Draggable的JavaScript类,该类允许用户对具有特定类名的HTML元素进行拖放排序。它通过监听dragstart、dragover、dragenter、dragend等事件,动态调整元素的位置,实现元素间的顺序变化。当元素开始拖动时,会添加拖动中的样式,拖放结束后移除。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

class Draggable {
  el: HTMLElement | null
  children: HTMLElement[] | null
  draggingElement: HTMLElement | null
  constructor(className: string) {
    this.el = document.querySelector(className)
    if (!this.el) {
      console.warn(`cant'find the element of ${className}`)
    }
    this.children = this.el && Array.prototype.slice.call(this.el?.children)
    this.children?.forEach(v => {
      v.draggable = true
    })
    this.bindEvents()
    this.draggingElement = null
  }
  bindEvents() {
    this.el?.addEventListener('dragover', (e) => e.preventDefault())
    document.addEventListener('dragover', (e) => e.preventDefault())
    this.children?.forEach(v => {
      v.addEventListener('dragstart', (e) => this.handlerDragstart(e, v))
      v.addEventListener('dragover', (e) => this.dragover(e))
      v.addEventListener('dragenter', (e) => this.dragenter(e))
      v.addEventListener('dragend', (e) => this.dragend(e, v))

    })
  }
  handlerDragstart(e: DragEvent, element: HTMLElement) {
    this.draggingElement = element
    setTimeout(() => {
      element.classList.add('dragging')
    }, 10);
  }
  dragover(e: DragEvent) {
    e.preventDefault()
    const current_pos = e.clientY
    const otherElement = this.children?.filter(v => v != this.draggingElement)
    const referenceHeights = []
    otherElement?.forEach(item => {
      referenceHeights.push({ height: item.offsetTop + item.offsetHeight / 2, e: item })
    })
    referenceHeights.push({ height: current_pos, e: this.draggingElement, dragging: true })
    // 排序
    referenceHeights.sort((a, b) => a.height - b.height)
    const res = referenceHeights.map(v => v.e) as Node[]
    this.el?.replaceChildren(...res)
  }
  dragenter(e: DragEvent) {
    e.preventDefault()
  }
  dragend(e: DragEvent, element: HTMLElement) {
    e.preventDefault()
    element.classList.remove('dragging')
  }

}

const drag = new Draggable('.container')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鲤余

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值