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

关于“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高性能的数据存储

    当我们在实现JavaScript应用程序时,经常需要存储数据。但是不同的数据存储方式对应的性能也不同。为了实现JavaScript高性能的数据存储,我们需要采用一些优化技巧来提高数据存储的性能。下面就分享一下实现JavaScript高性能的数据存储的攻略: 1. 选择合适的数据结构 常见的JavaScript数据结构包括数组、对象、Map和Set等。不同的数…

    JavaScript 2023年5月28日
    00
  • nicedit 轻量级编辑器 使用心得

    Nicedit 轻量级编辑器使用心得 Nicedit是一款轻量级的富文本编辑器,它使用简单,易于集成在任何项目中。在本篇文章中,我们将深入探讨Nicedit的使用,包括基本使用、自定义设置和集成到网站中的过程。 基本使用 Nicedit的基本使用非常容易,只需要在HTML文件中引入相关的JS和CSS文件,然后在页面中添加一个div元素作为编辑器即可: &lt…

    JavaScript 2023年6月10日
    00
  • JS 密码强度校验的正则表达式(简单且好用)

    下面是详细讲解“JS 密码强度校验的正则表达式(简单且好用)”的完整攻略。 1. 背景和需求 现在几乎所有的网站都需要用户进行注册和登录操作,为了保障用户账号的安全,往往都需要在密码设置时进行一定的限制和校验,例如要求密码长度不少于6位,必须包含数字、字母和特殊字符等。 这时候,就可以使用正则表达式来进行密码强度的校验。而在实际应用中,可以针对不同的强度要求…

    JavaScript 2023年6月10日
    00
  • JS获取当前时间戳方法解析

    JS获取当前时间戳方法解析 在JavaScript中,我们可以使用多种方法来获取当前的时间戳。本文将会介绍其中比较常用的三种方法:使用Date对象、使用时间戳函数和使用性能API。 使用Date对象 Date对象是JavaScript中提供的一个内置对象,我们可以通过该对象获取当前的时间戳。Date对象的getTime方法会返回一个13位的时间戳,以毫秒为单…

    JavaScript 2023年5月27日
    00
  • async/await实现Promise.acll()简介

    async/await实现Promise.acll()简介 在ES8中(或者称为ES2017),异步函数(async/await)被正式加入ECMAScript标准中,它们是一种更加简单、更容易阅读的异步编程语言,相较于Promise更方便实用。在本文中,我们将会详细讲解如何使用async/await实现Promise.acll()的效果。 Promise.…

    JavaScript 2023年5月27日
    00
  • JavaScript判断变量是否为数组的方法(Array)

    JavaScript提供了多种方法来判断一个变量是否为数组。下面是两种常见的方式: 1. 使用Array.isArray()方法 Array.isArray()是ES5中添加的一个方法,用于判断一个变量是否为数组类型。它接受一个参数,该参数可以是任何类型的变量,如果是数组,则返回true;否则返回false。 var arr = [1, 2, 3]; con…

    JavaScript 2023年5月27日
    00
  • vue elementUI 表单校验的实现代码(多层嵌套)

    实现Vue ElementUI表单校验的过程一般包含以下步骤: 引入ElementUI的表单组件和校验规则 在HTML模板中编写相应的表单代码 在Vue实例中定义表单数据和验证规则 编写验证方法并将其绑定到表单组件中 下面将详细讲解这些步骤。 引入ElementUI表单组件和校验规则 在使用ElementUI进行表单校验之前,需要先引入相应的表单组件和校验规…

    JavaScript 2023年6月10日
    00
  • javascript iframe跨域详解

    下面详细讲解 JavaScript Iframe 跨域的完整攻略,说到 iframe,一定要涉及到跨域问题。当 iframe 页面和父页面处于不同域时,由于同源策略的限制,JavaScript 无法获取到 iframe 页面的内容,也无法操作 iframe 页面中的元素。但是,在某些场景下,我们需要在父页面中嵌入一个 iframe 来展示一个来自不同域的页面…

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