js实现拖动缓动效果

实现拖动缓动效果,需要用到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的URL对象是什么

    下面是关于JavaScript的URL对象的详细讲解攻略。 什么是URL对象? URL(Uniform Resource Locator,统一资源定位符)是一个指向互联网上资源的指针。在JavaScript中,我们可以通过URL对象来获取和操作URL,URL对象可以让我们轻松地访问、解析和操作URL。 URL 对象的属性和方法 URL对象有许多属性和方法,下…

    JavaScript 2023年5月27日
    00
  • javascript中的作用域和上下文使用简要概述

    让我们来详细讲解Javascript中的作用域和上下文使用。 作用域和上下文 Javascript中的作用域和上下文是两个非常重要的概念。作用域指的是变量和函数使用的范围,而上下文则指的是函数被调用时所处的环境。 在Javascript中,变量和函数都可以使用全局或局部作用域。全局作用域可以被整个程序使用,而局部作用域则只能被函数内部使用。在ES6之前,Ja…

    JavaScript 2023年5月27日
    00
  • javascript判断网页是关闭还是刷新

    要判断网页是被关闭还是被刷新,需要使用onbeforeunload事件和event.currentTarget.performance.navigation.type属性。 onbeforeunload事件会在页面关闭或者刷新时被触发,可以作为判断依据。而event.currentTarget.performance.navigation.type属性在页面…

    JavaScript 2023年6月11日
    00
  • 原生js实现简易抽奖系统

    当我们需要在网站上添加一个简单的抽奖系统时,可以使用原生js进行实现。以下是实现简易抽奖系统的详细攻略: 第一步:创建HTML结构 首先,在HTML页面上创建必要的结构。我们可以使用以下代码: <div> <h1>抽奖系统</h1> <p>点击下面的按钮开始抽奖:</p> <button id…

    JavaScript 2023年6月11日
    00
  • 原生JS实现文件上传

    下面是“原生JS实现文件上传”的详细攻略: 1. HTML结构 在HTML文件中添加一个表单,包含一个文件输入和一个提交按钮。 <form enctype="multipart/form-data"> <input type="file" name="fileInput" id=&…

    JavaScript 2023年5月27日
    00
  • JavaScript 自定义对象方法汇总

    JavaScript 自定义对象方法汇总 在 JavaScript 中,我们可以通过自定义对象方法来为对象添加各种功能和行为。本文将详细讲解如何自定义对象方法。 一、创建对象 在 JavaScript 中创建对象可以使用构造函数和字面量两种方式。 构造函数方式创建对象 使用构造函数可以创建一个类,再通过实例化对象来使用这个类中的自定义方法。示例代码如下: /…

    JavaScript 2023年5月27日
    00
  • 详解Bootstrap创建表单的三种格式(一)

    我可以给你详细讲解一下“详解Bootstrap创建表单的三种格式(一)”的完整攻略。 标题 首先,我们需要了解Bootstrap是什么以及它的作用。Bootstrap是Twitter公司开源的一款前端开发框架,主要用于快速实现响应式布局和美化各类界面。特别是在表单的开发中,它们的优势会显得更加明显。Bootstrap提供了三种创建表单的格式,接下来分别进行详…

    JavaScript 2023年6月10日
    00
  • jquery中cookie用法实例详解(获取,存储,删除等)

    针对jquery中cookie用法的实例详解,请参考以下内容。 1. 引入jquery.cookie插件 在使用jquery.cookie插件前,需要先将该插件引入到HTML文件中。可以通过CDN引入,也可以将该插件下载到本地后再引入。 <!–通过CDN引入jquery和jquery.cookie插件–> <script src=&qu…

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