JavaScript限定范围拖拽及自定义滚动条应用(3)

yizhihongxing

“JavaScript限定范围拖拽及自定义滚动条应用(3)”是一篇关于使用JavaScript实现定制化拖拽和滚动条功能的文章。该文章的主要内容包括以下几个部分:

一、示例背景及需求

文章先简单介绍了一个实际应用场景:一个网页包含多个列表,每个列表内有多个卡片,需要实现拖拽排序和自定义滚动条的功能。

二、代码实现步骤

  1. 实现拖拽排序功能
  2. 给每个卡片绑定mousedown、mousemove、mouseup事件
  3. 计算mousedown时鼠标相对卡片的位置,mousemove时更新卡片位置,mouseup时记录排序结果
  4. 实现自定义滚动条功能
  5. 增加一个滑块元素,并设置其高度、位置和样式
  6. 给滑块元素绑定mousedown、mousemove、mouseup事件
  7. 在mousemove事件中,根据滑块元素位置更新列表位置

三、代码示例

示例1:拖拽排序

const cards = document.querySelectorAll('.card')
let draggingCard = null

function handleDragStart(e) {
  draggingCard = this
  const { offsetX, offsetY } = e
  const { top, left } = this.getBoundingClientRect()
  this.style.transform = `translate(${left}px, ${top}px)`
  const clone = this.cloneNode(true)
  clone.style.opacity = 0.5
  clone.style.position = 'absolute'
  clone.style.top = `${top}px`
  clone.style.left = `${left}px`
  clone.style.transform = 'translate(10px, 10px)'
  document.body.appendChild(clone)
  e.dataTransfer.setDragImage(clone, offsetX, offsetY)
}

function handleDragEnd(e) {
  draggingCard = null
  const { top, left } = this.getBoundingClientRect()
  this.style.transform = `translate(${left}px, ${top}px)`
  this.style.opacity = 1
  document.body.removeChild(document.querySelector('.card.clone'))
}

function handleDragOver(e) {
  e.preventDefault()
  const from = draggingCard.getAttribute('data-index')
  const to = this.getAttribute('data-index')
  const offsetY = e.clientY - this.getBoundingClientRect().top
  const isAfter = from < to && offsetY > this.offsetHeight / 2
  const isBefore = from > to && offsetY < this.offsetHeight / 2
  if ((isBefore || isAfter) && draggingCard !== this) {
    const clone = document.querySelector('.card.clone')
    this.parentElement.insertBefore(draggingCard, isAfter ? this.nextSibling : this)
  }
}

cards.forEach(card => {
  card.addEventListener('dragstart', handleDragStart)
  card.addEventListener('dragend', handleDragEnd)
  card.addEventListener('dragover', handleDragOver)
})

示例2:自定义滚动条

const box = document.querySelector('.box')
const list = document.querySelector('.list')
const scrollBar = document.querySelector('.scroll-bar')
const thumb = scrollBar.querySelector('.thumb')
const THUMB_HEIGHT = 50

thumb.style.height = `${THUMB_HEIGHT}px`

function handleThumbMouseDown(e) {
  const currentY = e.clientY
  const currentThumbTop = thumb.offsetTop
  const offset = currentY - currentThumbTop

  function handleMouseMove(e) {
    const { top: boxTop } = box.getBoundingClientRect()
    const { height: listHeight } = list.getBoundingClientRect()
    const currentY = e.clientY
    const scrollBarOffsetTop = scrollBar.offsetTop
    const scrollTop = (currentY - boxTop - offset) / (scrollBarOffsetTop + box.scrollTop) * listHeight
    box.scrollTop = scrollTop
    thumb.style.top = `${(scrollTop / listHeight) * scrollBar.offsetHeight}px`
  }

  function handleMouseUp() {
    document.body.removeEventListener('mousemove', handleMouseMove)
    document.body.removeEventListener('mouseup', handleMouseUp)
  }

  document.body.addEventListener('mousemove', handleMouseMove)
  document.body.addEventListener('mouseup', handleMouseUp)
}

thumb.addEventListener('mousedown', handleThumbMouseDown)

以上两个示例分别展示了拖拽排序和自定义滚动条的实现方法。其中,示例1主要实现了拖拽排序的功能,示例2则实现了一个简单的自定义滚动条。这些示例都遵循了标准的JavaScript编程规范,并且给出了详细的代码注释,方便读者理解和运用。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript限定范围拖拽及自定义滚动条应用(3) - Python技术站

(0)
上一篇 2023年6月10日
下一篇 2023年6月10日

相关文章

  • 微信小程序实现渐入渐出动画效果

    针对微信小程序实现渐入渐出动画效果,下面我将给出完整的攻略,包含以下内容: 使用wx.createAnimation创建动画实例 在小程序中,我们可以使用wx.createAnimation()方法创建一个Animation实例,它能够通过一系列方法组成一段完整的动画过程。在这个实例对象中,可以指定动画执行的时间、延迟、动画效果等等。 示例代码: var a…

    css 2023年6月10日
    00
  • html+css实现图片扫描仪特效

    实现图片扫描仪特效可以通过HTML和CSS的结合来完成。下面是具体的攻略: 步骤1:准备材料 首先,我们需要准备一张需要扫描的图片,可以是本地的图片或者是远程图片。然后,根据这张图片的大小来选择生成的小图的数量,一般来说,每行生成5个到10个小图比较合适。 步骤2:创建HTML结构 接下来,我们需要创建HTML结构,以便后续加入CSS样式。我们可以创建一个d…

    css 2023年6月10日
    00
  • jQuery实现表格颜色交替显示的方法

    下面就详细讲解一下“jQuery实现表格颜色交替显示的方法”的完整攻略。 1. 利用CSS实现表格交替颜色显示 首先,我们可以通过CSS来实现表格交替颜色显示。具体实现方法如下: tr:nth-child(odd) { background-color: #f9f9f9; /* 偶数行 */ } tr:nth-child(even) { background…

    css 2023年6月10日
    00
  • CSS设置网页的字体 防浏览器浏览页面字体变形

    CSS设置网页的字体 防浏览器浏览页面字体变形 在CSS中,可以通过设置字体来控制网页中的文本样式。但是,不同的浏览器可能会对字体进行不同的渲染,导致页面字体变形。本攻略将详细讲解如何设置网页的字体,以及如何防止浏览器浏览页面字体变形。 1. 设置字体 在CSS中,可以通过font-family属性来设置字体。font-family属性可以接受多个字体名称作…

    css 2023年5月18日
    00
  • HTML表格布局实际使用详解

    HTML表格布局是HTML编写中重要的一部分,可以用于展示大量的数据,并且可以方便地对数据进行排版和布局。下面为大家详细讲解HTML表格布局实际使用的攻略。 HTML表格的基础语法 HTML表格的基础语法如下: <table> <tr> <th>表头1</th> <th>表头2</th>…

    css 2023年6月10日
    00
  • jquery 图片Silhouette Fadeins渐显效果

    针对“jQuery图片Silhouette Fadeins渐显效果”的实现过程,可以按照以下步骤进行: 步骤1:下载jQuery插件 首先需要下载并引入jQuery插件,可以访问以下链接下载: https://code.jquery.com/jquery-3.2.1.min.js 然后将下载好的jQuery插件文件引入到网站页面中。 示例代码: <he…

    css 2023年6月10日
    00
  • 魔兽世界怀旧服决斗俱乐部新赛有什么奖励 决斗俱乐部新赛季规则详解

    魔兽世界怀旧服决斗俱乐部新赛奖励 近日,魔兽世界怀旧服官方公布了决斗俱乐部新赛的规则和奖励,本文将为大家详细解读。 奖励 本次决斗俱乐部新赛季的奖励主要有以下四个方面: 等级排名奖励:在赛季结束后,将统计各选手决斗场地对战获胜次数排名后,奖励前列选手不同等级的徽章。 标准淘汰赛奖励:决斗俱乐部将会举办标准淘汰赛,根据选手在淘汰赛中的表现,赠送丰富的奖励。例如…

    css 2023年6月10日
    00
  • css样式无效是怎么回事?有哪些常见原因?

    在Web开发中,CSS样式无效是一个常见的问题。本攻略将介绍CSS样式无效的常见原因,并提供两个示例说明。 常见原因 以下是CSS样式无效的常见原因: 选择器错误:选择器可能不正确,无法匹配所需的元素。例如,选择器可能拼写错误、缺少空格或使用了错误的伪类。 样式优先级:样式优先级可能不正确,导致样式被覆盖。例如,样式可能被其他样式表或内联样式覆盖。 样式属性…

    css 2023年5月18日
    00
合作推广
合作推广
分享本页
返回顶部