js实现拖动缓动效果

yizhihongxing

实现拖动缓动效果,需要用到JavaScript中的定时器和数学运算等技术。下面我来详细讲解一下整个过程。

第一步:获取元素位置

首先,我们需要获取需要拖动的元素以及它的位置。在代码中,我们通常会使用getBoundingClientRect()方法来获取元素的绝对位置。

const dragElem = document.querySelector('.drag-elem');
const rect = dragElem.getBoundingClientRect();
const startX = rect.x;
const startY = rect.y;

第二步:鼠标按下事件

接下来,我们需要绑定鼠标按下事件,这样才能够响应用户的拖动动作。在按下事件中,我们需要获取鼠标的初始位置,并且需要启动一个定时器来实现缓动效果。

let startX = 0;
let startY = 0;
let timer = null;

dragElem.addEventListener('mousedown', function(e) {
  startX = e.clientX;
  startY = e.clientY;

  clearInterval(timer);

  timer = setInterval(function() {
    // ...
  }, 10);
});

第三步:鼠标移动事件

在鼠标移动事件中,我们需要实时计算出当前鼠标的位置,并且根据拖动的距离计算出元素应该在的位置。这里需要注意的是,我们需要根据鼠标移动时的距离计算出拖动的距离,以便缓动效果的实现。

dragElem.addEventListener('mousemove', function(e) {
  const disX = e.clientX - startX;
  const disY = e.clientY - startY;
  const currentX = rect.x + disX;
  const currentY = rect.y + disY;

  dragElem.style.transform = `translate(${currentX}px, ${currentY}px)`;
});

第四步:定时器处理

在定时器处理函数中,我们需要计算出元素的目标位置,并且根据缓动效果逐渐将它移动到目标位置。这里需要使用一些数学运算。

timer = setInterval(function() {
  const targetX = startX + (distanceX / 2);
  const targetY = startY + (distanceY / 2);
  const currentX = rect.x + (targetX - rect.x) / 10;
  const currentY = rect.y + (targetY - rect.y) / 10;

  dragElem.style.transform = `translate(${currentX}px, ${currentY}px)`;

  if (Math.abs(currentX - targetX) < 1 && Math.abs(currentY - targetY) < 1) {
    clearInterval(timer);
  }
}, 10);

示例说明

下面是两个示例,分别演示了拖动一个矩形和拖动一个球的缓动效果。

示例一:拖动一个矩形

<div class="drag-elem" style="width: 100px; height: 100px; background-color: red;"></div>

<script>
  const dragElem = document.querySelector('.drag-elem');
  const rect = dragElem.getBoundingClientRect();
  let startX = 0;
  let startY = 0;
  let timer = null;

  dragElem.addEventListener('mousedown', function(e) {
    startX = e.clientX;
    startY = e.clientY;

    clearInterval(timer);

    timer = setInterval(function() {
      const distanceX = e.clientX - startX;
      const distanceY = e.clientY - startY;
      const targetX = startX + (distanceX / 2);
      const targetY = startY + (distanceY / 2);
      const currentX = rect.x + (targetX - rect.x) / 10;
      const currentY = rect.y + (targetY - rect.y) / 10;

      dragElem.style.transform = `translate(${currentX}px, ${currentY}px)`;

      if (Math.abs(currentX - targetX) < 1 && Math.abs(currentY - targetY) < 1) {
        clearInterval(timer);
      }
    }, 10);
  });

  dragElem.addEventListener('mousemove', function(e) {
    const disX = e.clientX - startX;
    const disY = e.clientY - startY;
    const currentX = rect.x + disX;
    const currentY = rect.y + disY;

    dragElem.style.transform = `translate(${currentX}px, ${currentY}px)`;
  });
</script>

示例二:拖动一个球

<style>
  .ball {
    width: 50px;
    height: 50px;
    background-color: orange;
    border-radius: 50%;
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
  }
</style>

<div class="ball"></div>

<script>
  const ball = document.querySelector('.ball');
  const rect = ball.getBoundingClientRect();
  let startX = 0;
  let startY = 0;
  let timer = null;

  ball.addEventListener('mousedown', function(e) {
    startX = e.clientX;
    startY = e.clientY;

    clearInterval(timer);

    timer = setInterval(function() {
      const distanceX = e.clientX - startX;
      const distanceY = e.clientY - startY;
      const targetX = startX + (distanceX / 2);
      const targetY = startY + (distanceY / 2);
      const currentX = rect.x + (targetX - rect.x) / 10;
      const currentY = rect.y + (targetY - rect.y) / 10;

      ball.style.transform = `translate(${currentX}px, ${currentY}px)`;

      if (Math.abs(currentX - targetX) < 1 && Math.abs(currentY - targetY) < 1) {
        clearInterval(timer);
      }
    }, 10);
  });

  ball.addEventListener('mousemove', function(e) {
    const disX = e.clientX - startX;
    const disY = e.clientY - startY;
    const currentX = rect.x + disX;
    const currentY = rect.y + disY;

    ball.style.transform = `translate(${currentX}px, ${currentY}px)`;
  });
</script>

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:js实现拖动缓动效果 - Python技术站

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

相关文章

  • JavaScript转换数据库DateTime字段类型方法

    下面是JavaScript转换数据库DateTime字段类型的完整攻略。 背景介绍 在开发过程中,我们经常会遇到需要将后端返回的时间戳或字符串类型的时间转换为JavaScript的Date对象,以方便在前端进行处理。这里介绍一种转换数据库DateTime字段类型的方法。 解决方案 在JavaScript中,可以通过正则表达式将数据库DateTime类型的时间…

    JavaScript 2023年5月27日
    00
  • JavaScript实现打字游戏

    下面是JavaScript实现打字游戏的完整攻略: 1. 准备工作 在HTML文件中添加一个文本框和一个按钮 引入jQuery库 引入word-list.js文件,该文件包含了所有的单词列表 2. 获取输入的单词 当用户在文本框中进行输入后,点击按钮,会触发事件,调用checkWord()函数,该函数获取文本框中的输入值,将其和随机生成的单词进行比较,判断是…

    JavaScript 2023年5月19日
    00
  • JS正则表达式验证账号、手机号、电话和邮箱是否合法

    下面我将介绍使用JavaScript正则表达式来验证账号、手机号、电话和邮箱是否合法的方法。 验证账号 账号的验证规则是由字母、数字、下划线组成的,长度为4-16位。我们可以使用正则表达式来进行验证。具体代码如下: function validateUsername(username) { var pattern = /^[a-zA-Z0-9_]{4,16}…

    JavaScript 2023年6月10日
    00
  • javascript实时获取鼠标坐标值并显示的方法

    下面就详细讲解一下“JavaScript实时获取鼠标坐标值并显示的方法”。 方法一:使用mousemove事件 我们可以通过mousemove事件实时获取鼠标的坐标值,然后将其显示在页面上。这里给出一个示例代码: <div id="mouse">鼠标坐标:</div> <script> var mous…

    JavaScript 2023年6月11日
    00
  • JavaScript 数据结构之字典方法

    当我们使用JavaScript编写代码时,经常会用到JavaScript数据结构中的字典结构,也称键值对结构。在JavaScript中,字典是一种用于存储值的无序集合。字典基于键值对,其中每个键都映射到一个值。在本篇攻略中,我们将深入了解JavaScript数据结构之字典(键值对)方法。 创建字典 要创建一个字典,可以使用JavaScript对象来存储键值对…

    JavaScript 2023年5月27日
    00
  • Javascript的严格模式strict mode详细介绍

    Javascript的严格模式(Strict Mode)是ES5引入的一种新模式。它主要针对一些不规范的代码加强了规范性,以避免开发中一些隐形错误、提高代码质量和安全性。在Javascript中启用严格模式的方法是在代码开头添加”use strict”;即可。 使用严格模式,将会导致Javascript的一些默认行为发生变化。 下面,我们将逐一讲解在使用Ja…

    JavaScript 2023年5月18日
    00
  • Java实战之用Spring开发条形码和验证码

    Java实战之用Spring开发条形码和验证码 为了保证网站的安全性和便捷性,很多网站都会使用验证码来防止机器人恶意攻击,而条形码也是在电子商务中常用的一种表示商品信息的方式。本文将详细介绍如何使用Spring框架开发实用的条形码和验证码功能。 准备工作 首先,为了使用Spring框架,需要引入Spring的相关依赖,如下所示: <dependenci…

    JavaScript 2023年5月28日
    00
  • 用js进行url编码后用php反解以及用php实现js的escape功能函数总结

    以下是使用 JavaScript 进行 URL 编码并在 PHP 中进行反解码的攻略: JS 中的 URL 编码 在 JavaScript 中,可以使用 encodeURIComponent() 函数来对 URL 进行编码。 举例来说,如果想将以下字符串进行编码: var str = "hello world"; 可以使用以下代码进行编码…

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