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

“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日

相关文章

  • bootstrap3.0教程之栅格系统原理(布局)

    Bootstrap3.0教程之栅格系统原理(布局) 什么是栅格系统 栅格系统是指网页布局中网页的行列布局,将页面划分为若干列,每个部分都包含若干列,通过使用栅格系统可以让网页中的内容更加清晰,明确,使用户更加方便地使用页面。 Bootstrap将栅格系统看做是其设计的核心,在Bootstrap中,按钮、表格、表单以及整个网站都可以通过栅格系统来设计和排版。 …

    css 2023年6月10日
    00
  • javascript设置页面背景色及背景图片的方法

    首先我们来学习如何使用JavaScript设置页面的背景色。 设置背景色 步骤1: 定义HTML文件,我们需要先定义一个HTML文件,例如这里的index.html文件。 <!DOCTYPE html> <html> <head> <title>JavaScript设置页面背景色</title> &…

    css 2023年6月9日
    00
  • chrome表单自动填充导致input文本框背景变成偏黄色问题解决

    针对这个问题,我将提供以下攻略,包括问题背景、原因探究、解决方案等。 问题背景 在使用Chrome浏览器自动填充表单时,有时可能会发现表单中的文本框背景变成了偏黄色,而且无法用css样式覆盖。 原因探究 造成这个问题的原因有很多,其中一种最常见的原因是Chrome浏览器表单自动填充功能的特殊性质。自动填充会在文本框内生成一个额外的元素,这个元素的样式不受cs…

    css 2023年6月11日
    00
  • js编写一个简单的产品放大效果代码

    让我们来详细讲解如何编写一个简单的产品放大效果代码。 1. 准备工作 在编写代码前,需要先准备好以下两项: 目标元素的图片。 一个容器元素,用来包裹目标元素。 2. 容器与目标元素的搭建 首先,我们需要使用HTML和CSS来搭建容器元素和目标元素。代码如下: <div class="container"> <img sr…

    css 2023年6月10日
    00
  • 简单的CSS 下拉导航菜单实现代码

    让我来详细讲解一下CSS下拉导航菜单的实现攻略。首先,我将会解释如何使用简单的CSS代码实现下拉导航菜单。然后,我会通过两个示例演示如何实现多级下拉菜单和在鼠标悬停时显示下拉菜单。 基础实现 要实现一个简单的CSS下拉菜单首先需要创建一个HTML结构来表示菜单。这是一个基本结构: <nav> <ul> <li><a …

    css 2023年6月10日
    00
  • 微信小程序按钮去除边框线分享页面功能

    要去除微信小程序按钮的边框线并添加分享页面功能,可以按照以下步骤操作。 1. 在小程序中添加分享功能 在小程序的app.json文件中配置window节点的**-i //自定义属性名,该属性控制分享功能的显示。例如: { "window": { "navigationBarTitleText": "Demo&…

    css 2023年6月11日
    00
  • 关于Vite项目打包后浏览器兼容性问题的解决方案

    下面是关于Vite项目打包后浏览器兼容性问题的解决方案完整攻略。 1. 问题描述 在使用Vite进行开发时,因为Vite本身支持es6的语法,导致项目中使用一些es6语法或者API时,项目能够在最新版本的浏览器上正常运行,但是在一些旧版本的浏览器上则可能出现兼容性问题,从而导致项目无法正常运行。 2. 解决方案 针对上述问题,我们需要采取以下措施: 2.1 …

    css 2023年6月9日
    00
  • css让table不显示边框的代码在火狐和谷歌浏览器中无效

    要使表格不显示边框,一般可以设置table的border为0,或者使用CSS的border-collapse属性来控制表格边框的合并。但是在某些情况下,这种设置在火狐和谷歌浏览器中可能会无效。以下为解决方法: 方法一:添加样式“border-style:none !important;” 可以在CSS中额外添加一个样式,来明确指定边框样式为“none”。这个…

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