js实现div拖动动画运行轨迹效果代码分享

yizhihongxing

关于“js实现div拖动动画运行轨迹效果代码分享”的完整攻略,主要包含以下几个部分:

  1. 基本思路
  2. 实现步骤
  3. 示例说明

基本思路

实现div拖动动画运行轨迹效果,一般可以采用JS和CSS配合的方式。具体来说,主要实现以下几个步骤:

  1. 给div绑定mousedown事件,当鼠标按下时触发。
  2. 给document绑定mousemove事件,当鼠标移动时触发。
  3. 给document绑定mouseup事件,当鼠标抬起时触发。
  4. 随着鼠标移动,动态计算div的left和top值,实现拖动效果。
  5. 在mousemove事件中记录鼠标移动的位置,根据位置变化计算出div的偏移量(即left和top),并更新div的位置。
  6. 在mouseup事件中解绑document的mousemove和mouseup事件,停止拖动。

实现步骤

1. HTML结构

首先,需要在HTML文件中创建一个div元素,设置其class和id属性:

<div class="drag" id="drag-element"></div>

2. CSS样式

接下来,需要对div元素进行样式设置,在CSS文件中添加以下样式:

.drag {
  position: absolute;
  width: 50px;
  height: 50px;
  background-color: #ccc;
  cursor: move;
}

3. JS代码

接下来,就可以开始写JS代码了。我们可以将代码拆分为三个部分:事件绑定、拖动计算和动画效果。

事件绑定

首先,需要给div元素绑定mousedown事件,当鼠标按下时触发:

const dragElement = document.getElementById('drag-element')

let isDragging = false
let startX, startY, initialX, initialY, xOffset, yOffset

dragElement.addEventListener('mousedown', function(e) {
  isDragging = true

  startX = e.clientX
  startY = e.clientY

  dragElement.style.transition = ''

  initialX = dragElement.offsetLeft
  initialY = dragElement.offsetTop

  xOffset = startX - initialX
  yOffset = startY - initialY
})

这里先定义了一些变量,包括isDragging、startX、startY、initialX、initialY、xOffset和yOffset。当鼠标按下时,设置isDragging为true,记录当前鼠标位置的x和y坐标,以及div元素初始的left和top值和鼠标相对div元素的偏移量。

接下来,需要给document绑定mousemove事件,当鼠标移动时触发:

document.addEventListener('mousemove', function(e) {
  if (isDragging) {
    e.preventDefault()

    const currentX = e.clientX - xOffset
    const currentY = e.clientY - yOffset

    dragElement.style.left = currentX + 'px'
    dragElement.style.top = currentY + 'px'
  }
})

在mousemove事件中,如果当前正在拖动,就防止默认事件,计算新的div位置,更新div的left和top值。

最后,给document绑定mouseup事件,当鼠标抬起时触发:

document.addEventListener('mouseup', function() {
  isDragging = false

  if (dragElement.offsetLeft < 0) {
    dragElement.style.transition = '0.5s ease-out'
    dragElement.style.left = '0'
  }

  if (dragElement.offsetTop < 0) {
    dragElement.style.transition = '0.5s ease-out'
    dragElement.style.top = '0'
  }

  if (dragElement.offsetLeft + dragElement.offsetWidth > window.innerWidth) {
    const maxLeft = window.innerWidth - dragElement.offsetWidth
    dragElement.style.transition = '0.5s ease-out'
    dragElement.style.left = maxLeft + 'px'
  }

  if (dragElement.offsetTop + dragElement.offsetHeight > window.innerHeight) {
    const maxTop = window.innerHeight - dragElement.offsetHeight
    dragElement.style.transition = '0.5s ease-out'
    dragElement.style.top = maxTop + 'px'
  }
})

在mouseup事件中,需要将isDragging重新设置为false,同时对div的位置进行判断,如果超出窗口边界,就设置div的left和top值为窗口边界的最大值或最小值,并给div元素添加过渡效果。

拖动计算

我们需要在mousedown和mousemove事件中计算div元素的位置和偏移量。在mousedown事件中,代码如下:

initialX = dragElement.offsetLeft
initialY = dragElement.offsetTop

xOffset = startX - initialX
yOffset = startY - initialY

在mousemove事件中,代码如下:

const currentX = e.clientX - xOffset
const currentY = e.clientY - yOffset

动画效果

以上代码已经实现了基本的拖动效果,但还不够流畅。我们可以添加额外的动画效果,让div元素拖动更加自然。在mouseup事件中,可以添加以下代码:

dragElement.style.transition = '0.5s ease-out'
dragElement.style.left = currentX + 'px'
dragElement.style.top = currentY + 'px'

将div元素的过渡时间设置为0.5秒,并用缓动函数使移动更加平滑。

示例说明

下面给出两个示例,分别展示了如何实现纵向拖动和横向拖动的效果。

示例1:纵向拖动

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>JS实现div拖动动画运行轨迹效果-纵向拖动</title>
  <style>
    .drag {
      position: absolute;
      width: 50px;
      height: 50px;
      background-color: #ccc;
      cursor: move;
    }
  </style>
</head>
<body>
  <div class="drag" id="drag-element"></div>

  <script>
    const dragElement = document.getElementById('drag-element')

    let isDragging = false
    let startY, initialY, yOffset

    dragElement.addEventListener('mousedown', function(e) {
      isDragging = true

      startY = e.clientY

      dragElement.style.transition = ''

      initialY = dragElement.offsetTop

      yOffset = startY - initialY
    })

    document.addEventListener('mousemove', function(e) {
      if (isDragging) {
        e.preventDefault()

        const currentY = e.clientY - yOffset

        dragElement.style.top = currentY + 'px'
      }
    })

    document.addEventListener('mouseup', function() {
      isDragging = false

      if (dragElement.offsetTop < 0) {
        dragElement.style.transition = '0.5s ease-out'
        dragElement.style.top = '0'
      }

      if (dragElement.offsetTop + dragElement.offsetHeight > window.innerHeight) {
        const maxTop = window.innerHeight - dragElement.offsetHeight
        dragElement.style.transition = '0.5s ease-out'
        dragElement.style.top = maxTop + 'px'
      }

      dragElement.style.transition = '0.5s ease-out'
    })
  </script>
</body>
</html>

示例2:横向拖动

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>JS实现div拖动动画运行轨迹效果-横向拖动</title>
  <style>
    .drag {
      position: absolute;
      width: 50px;
      height: 50px;
      background-color: #ccc;
      cursor: move;
    }
  </style>
</head>
<body>
  <div class="drag" id="drag-element"></div>

  <script>
    const dragElement = document.getElementById('drag-element')

    let isDragging = false
    let startX, initialX, xOffset

    dragElement.addEventListener('mousedown', function(e) {
      isDragging = true

      startX = e.clientX

      dragElement.style.transition = ''

      initialX = dragElement.offsetLeft

      xOffset = startX - initialX
    })

    document.addEventListener('mousemove', function(e) {
      if (isDragging) {
        e.preventDefault()

        const currentX = e.clientX - xOffset

        dragElement.style.left = currentX + 'px'
      }
    })

    document.addEventListener('mouseup', function() {
      isDragging = false

      if (dragElement.offsetLeft < 0) {
        dragElement.style.transition = '0.5s ease-out'
        dragElement.style.left = '0'
      }

      if (dragElement.offsetLeft + dragElement.offsetWidth > window.innerWidth) {
        const maxLeft = window.innerWidth - dragElement.offsetWidth
        dragElement.style.transition = '0.5s ease-out'
        dragElement.style.left = maxLeft + 'px'
      }

      dragElement.style.transition = '0.5s ease-out'
    })
  </script>
</body>
</html>

以上就是js实现div拖动动画运行轨迹效果的完整攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:js实现div拖动动画运行轨迹效果代码分享 - Python技术站

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

相关文章

  • JavaScript Length 属性的总结

    我们来讲解一下JavaScript Length 属性的总结。 什么是JavaScript Length属性 在JavaScript中,Length属性是Array对象的一个属性,用来返回该数组的元素个数。当Length属性被调用时,它的返回值是一个表示数组中元素个数的数字。 JavaScript Length属性的使用方法 可以使用以下语法来获得数组的长度…

    JavaScript 2023年5月28日
    00
  • JavaScript中解决多浏览器兼容性23个问题的快速解决方法

    作为网站作者,我们需要考虑到不同浏览器的兼容性问题。在 JavaScript 中,不同浏览器的兼容性问题比较常见,为了解决这些问题,我们需要使用一些常见的解决方法。下面是解决 JavaScript 中多浏览器兼容性问题的完整攻略: 1. 选择合适的文档模式 文档模式用于指定浏览器在解析网页时所采用的渲染模式,包括“标准模式”和“兼容模式”。在 HTML5 中…

    JavaScript 2023年6月10日
    00
  • JavaScript控制各种浏览器全屏模式的方法、属性和事件介绍

    JavaScript控制各种浏览器全屏模式的方法、属性和事件介绍 1. 方法 在 JavaScript 中,我们可以使用 requestFullscreen 方法将网页全屏。该方法是在 document 对象上定义的,通过该方法可以完全控制浏览器的全屏模式。 document.documentElement.requestFullscreen() 类似的还有…

    JavaScript 2023年6月11日
    00
  • 常用JavaScript代码提示公共类封装

    下面是常用JavaScript代码提示公共类封装的完整攻略: 1. 确定需求 在封装一个常用JavaScript代码提示公共类之前,首先需要确定要实现的功能和使用场景。例如,我们可以考虑封装一个可以在用户输入框中实时提示补全内容的功能,或者封装一个可以在输入框输入时自动生成常用短语的功能。根据不同的需求和场景,我们可以选择不同的实现方式和封装方法。 2. 设…

    JavaScript 2023年6月11日
    00
  • JavaScript自定义事件介绍

    以下是JavaScript自定义事件的详细介绍: 什么是JavaScript自定义事件? 在JavaScript中,自定义事件是指可以自定义触发和监听的事件,以便根据需要执行某些操作。 如何定义自定义事件? 我们可以使用原生JavaScript或者第三方库(例如jQuery)来定义自定义事件。以下是几种定义自定义事件的方式: 1. 使用Event对象 con…

    JavaScript 2023年6月10日
    00
  • LazyLoad 延迟加载(按需加载)

    LazyLoad 延迟加载(按需加载)是一种在页面加载时,只加载当前视窗内所需要的部分内容,避免不必要的资源浪费和页面加载时间过长的现象。这种技术在网站中的应用非常常见。 实现方式 实现LazyLoad延迟加载的方式有多种,其中最常见的是使用JavaScript库。以下是一些常见的JavaScript库:- Layzr.js:轻量级、易扩展和可定制,可用于图…

    JavaScript 2023年6月11日
    00
  • javascript中break,continue和return语句用法小结

    接下来我将为你详细讲解“JavaScript中break,continue和return语句用法小结”。 1. break语句 在循环结构中,break语句可以让程序停止当前循环并跳出循环结构。在for循环和while循环中,break语句的使用方法相同。 示例1 下面的示例演示如何在for循环中使用break语句,当循环到i为2时,停止循环并跳出循环结构。…

    JavaScript 2023年5月28日
    00
  • javascript入门·对象属性方法大总结

    下面是关于“Javascript入门·对象属性方法大总结”的完整攻略。 Javascript入门·对象属性方法大总结 什么是对象? 在Javascript中,对象是一种复合数据类型,用于将数据和功能组织成逻辑单元。Javascript中的对象可以看作是属性(属性名-属性值的键值对)的集合,以及一些可以操作这些属性的方法。 创建一个对象可以使用两种方法:对象字…

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