纯 JS 实现放大缩小拖拽功能(完整代码)

yizhihongxing

现在我们来详细讲解如何使用纯 JS 实现放大缩小拖拽功能,并提供完整的代码。

1. 实现原理

放大缩小和拖拽功能的实现需要用到一些基础的 CSS 和 JS 知识:

  1. position 属性来设置元素的定位方式
  2. transform 属性来实现元素的放大缩小
  3. mousemove 事件来实现元素的拖拽
  4. mouseup 事件来实现鼠标释放后停止拖拽

2. 必要的准备工作

首先,我们需要在 HTML 文件中创建一个容器元素,用于装载要实现放大缩小和拖拽的元素。容器元素的样式可以根据需求进行自定义,代码如下:

<div id="container" style="width: 500px; height: 500px; border: 1px solid #000;"></div>

接着,在页面中引入 CSS 和 JS 文件:

<link rel="stylesheet" href="styles.css">
<script src="script.js"></script>

3. 实现放大缩小功能

放大缩小功能的实现主要依赖于 JS 中的 transform 属性和鼠标滚轮事件。代码如下:

// 获取容器元素
const container = document.querySelector('#container');

// 定义元素缩放比例
let scale = 1;

// 监听鼠标滚轮事件
container.addEventListener('wheel', function(event) {
  // 计算缩放比例
  scale = scale + event.deltaY * -0.01;
  scale = Math.min(Math.max(0.125, scale), 4);

  // 设置元素样式
  container.style.transform = `scale(${scale})`;
});

首先,我们通过 document.querySelector() 方法获取到容器元素,并定义一个初始的缩放比例 scale,默认为 1。

接着,我们使用 addEventListener() 方法监听容器元素上的鼠标滚轮事件,利用 event.deltaY 属性获取鼠标滚轮滚动的值,并根据此值来计算出缩放比例。

然后,我们使用 Math.min()Math.max() 方法来限制缩放比例的最小值和最大值,以免缩放超过范围。

最后,我们使用 style.transform 属性将缩放比例应用到容器元素上,实现元素的放大缩小。

4. 实现拖拽功能

拖拽功能的实现主要依赖于 JS 中的 mousemovemouseup 事件,以及 mousedown 事件来启动拖拽。代码如下:

// 获取容器元素
const container = document.querySelector('#container');

// 定义变量来存储鼠标位置和元素位置的差值
let diffX, diffY;

// 添加 mousedown 事件监听器
container.addEventListener('mousedown', function(event) {
  // 计算鼠标位置和元素位置的差值
  diffX = event.clientX - container.offsetLeft;
  diffY = event.clientY - container.offsetTop;

  // 添加 mousemove 事件监听器
  document.addEventListener('mousemove', onMouseMove);
});

// 添加 mouseup 事件监听器
document.addEventListener('mouseup', function() {
  // 移除 mousemove 事件监听器
  document.removeEventListener('mousemove', onMouseMove);
});

// 定义 mousemove 事件监听器的回调函数
function onMouseMove(event) {
  // 计算元素新的位置
  const left = event.clientX - diffX;
  const top = event.clientY - diffY;

  // 设置元素样式
  container.style.left = `${left}px`;
  container.style.top = `${top}px`;
}

首先,我们用 document.querySelector() 方法获取到容器元素,并定义两个变量 diffXdiffY 来存储鼠标位置和元素位置的差值。

然后,我们使用 addEventListener() 方法在容器元素上添加 mousedown 事件监听器,当鼠标在容器元素上按下时,计算鼠标位置和元素位置的差值。

接着,我们使用 document.addEventListener() 方法在整个页面上添加 mousemove 事件监听器,并将之前定义的 onMouseMove() 函数作为回调函数,实现拖拽效果。

最后,我们使用 document.addEventListener() 方法在整个页面上添加 mouseup 事件监听器,当鼠标释放时,移除 mousemove 事件监听器,以停止拖拽。

5. 完整代码

下面是完整的 HTML 和 JS 代码:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>放大缩小拖拽实例</title>
    <style>
      #container {
        width: 500px;
        height: 500px;
        border: 1px solid #000;
        position: absolute;
        left: 50%;
        top: 50%;
        transform: translate(-50%, -50%);
      }
    </style>
  </head>
  <body>
    <div id="container"></div>
    <script>
      // 获取容器元素
      const container = document.querySelector('#container');

      // 定义元素缩放比例
      let scale = 1;

      // 监听鼠标滚轮事件
      container.addEventListener('wheel', function(event) {
        // 计算缩放比例
        scale = scale + event.deltaY * -0.01;
        scale = Math.min(Math.max(0.125, scale), 4);

        // 设置元素样式
        container.style.transform = `scale(${scale})`;
      });

      // 定义变量来存储鼠标位置和元素位置的差值
      let diffX, diffY;

      // 添加 mousedown 事件监听器
      container.addEventListener('mousedown', function(event) {
        // 计算鼠标位置和元素位置的差值
        diffX = event.clientX - container.offsetLeft;
        diffY = event.clientY - container.offsetTop;

        // 添加 mousemove 事件监听器
        document.addEventListener('mousemove', onMouseMove);
      });

      // 添加 mouseup 事件监听器
      document.addEventListener('mouseup', function() {
        // 移除 mousemove 事件监听器
        document.removeEventListener('mousemove', onMouseMove);
      });

      // 定义 mousemove 事件监听器的回调函数
      function onMouseMove(event) {
        // 计算元素新的位置
        const left = event.clientX - diffX;
        const top = event.clientY - diffY;

        // 设置元素样式
        container.style.left = `${left}px`;
        container.style.top = `${top}px`;
      }
    </script>
  </body>
</html>

6. 示例说明

这里提供两个示例来说明这个完整代码的使用。

示例一:移动、放大和缩小圆形

首先,我们可以将容器元素中插入一个圆形元素,并使用 CSS 设置其样式:

<div id="container">
  <div class="circle"></div>
</div>

<style>
  #container {
    width: 500px;
    height: 500px;
    border: 1px solid #000;
    position: absolute;
    left: 50%;
    top: 50%;
    transform: translate(-50%, -50%);
  }
  .circle {
    width: 100px;
    height: 100px;
    background-color: red;
    border-radius: 50%;
  }
</style>

接着,我们在 JS 中根据需要修改元素的选择器和 CSS 样式,实现元素的拖拽和放大缩小功能:

// 获取容器元素和圆形元素
const container = document.querySelector('#container');
const circle = document.querySelector('.circle');

// 定义圆形元素缩放比例
let scale = 1;

// 监听鼠标滚轮事件
container.addEventListener('wheel', function(event) {
  // 计算缩放比例
  scale = scale + event.deltaY * -0.01;
  scale = Math.min(Math.max(0.125, scale), 4);

  // 设置圆形元素样式
  circle.style.transform = `scale(${scale})`;
});

// 定义变量来存储鼠标位置和元素位置的差值
let diffX, diffY;

// 添加 mousedown 事件监听器
circle.addEventListener('mousedown', function(event) {
  // 计算鼠标位置和元素位置的差值
  diffX = event.clientX - circle.offsetLeft;
  diffY = event.clientY - circle.offsetTop;

  // 添加 mousemove 事件监听器
  document.addEventListener('mousemove', onMouseMove);
});

// 添加 mouseup 事件监听器
document.addEventListener('mouseup', function() {
  // 移除 mousemove 事件监听器
  document.removeEventListener('mousemove', onMouseMove);
});

// 定义 mousemove 事件监听器的回调函数
function onMouseMove(event) {
  // 计算元素新的位置
  const left = event.clientX - diffX;
  const top = event.clientY - diffY;

  // 设置圆形元素样式
  circle.style.left = `${left}px`;
  circle.style.top = `${top}px`;
}

这样,我们就可以通过鼠标滚轮放大缩小圆形,通过鼠标拖拽圆形元素实现移动。

示例二:显示图像并实现拖拽、放大和缩小功能

我们也可以将容器元素中插入一个图像元素,通过 JS 实现图像的拖拽和放大缩小功能。

首先,在 HTML 中插入图像元素:

<div id="container">
  <img src="https://picsum.photos/500" alt="随机图像">
</div>

<style>
  #container {
    width: 500px;
    height: 500px;
    border: 1px solid #000;
    position: absolute;
    left: 50%;
    top: 50%;
    transform: translate(-50%, -50%);
    overflow: hidden;
  }
  img {
    width: 100%;
    height: 100%;
    object-fit: contain;
  }
</style>

接着,我们在 JS 中修改元素的选择器和 CSS 样式:

// 获取容器元素和图像元素
const container = document.querySelector('#container');
const img = document.querySelector('img');

// 定义图像元素缩放比例
let scale = 1;

// 监听鼠标滚轮事件
container.addEventListener('wheel', function(event) {
  // 计算缩放比例
  scale = scale + event.deltaY * -0.01;
  scale = Math.min(Math.max(0.125, scale), 4);

  // 设置图像元素样式
  img.style.transform = `scale(${scale})`;
});

// 定义变量来存储鼠标位置和元素位置的差值
let diffX, diffY;

// 添加 mousedown 事件监听器
img.addEventListener('mousedown', function(event) {
  // 计算鼠标位置和元素位置的差值
  diffX = event.clientX - img.offsetLeft;
  diffY = event.clientY - img.offsetTop;

  // 添加 mousemove 事件监听器
  document.addEventListener('mousemove', onMouseMove);
});

// 添加 mouseup 事件监听器
document.addEventListener('mouseup', function() {
  // 移除 mousemove 事件监听器
  document.removeEventListener('mousemove', onMouseMove);
});

// 定义 mousemove 事件监听器的回调函数
function onMouseMove(event) {
  // 计算元素新的位置
  const left = event.clientX - diffX;
  const top = event.clientY - diffY;

  // 设置图像元素样式(注意考虑缩放的影响)
  img.style.left = `${left}px`;
  img.style.top = `${top}px`;
}

这样,我们就可以拖拽图像元素实现移动,通过鼠标滚轮放大缩小图像。同时,为了防止图像超出容器元素的范围,我们可以在 CSS 样式中设置容器元素的 overflow 属性为 hidden

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:纯 JS 实现放大缩小拖拽功能(完整代码) - Python技术站

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

相关文章

  • 网上应用的一个不错common.js脚本

    让我来为你详细讲解一下“网上应用的一个不错common.js脚本”的完整攻略。 什么是 common.js CommonJS 是一种模块化规范,旨在提供一种 JavaScript 代码组织和复用的标准方法。它定义了一种模块加载机制,允许开发人员将 JavaScript 代码分割成若干个独立的、可维护的单元。 通过使用 CommonJS,您可以将代码模块化,然…

    JavaScript 2023年6月11日
    00
  • 通过url查找a元素并点击

    要通过url查找a元素并点击, 我们可以使用Selenium WebDriver来实现。以下是完整攻略的步骤: 1. 安装Selenium WebDriver 在终端中输入以下命令,安装Selenium WebDriver: pip install selenium 2. 导入依赖包 from selenium import webdriver from s…

    JavaScript 2023年6月11日
    00
  • 全面介绍javascript实用技巧及单竖杠

    全面介绍JavaScript实用技巧及单竖杠攻略 为何需要掌握JavaScript实用技巧? JavaScript是一门功能强大的编程语言,广泛应用于Web开发,数据可视化,游戏开发等领域。掌握JavaScript实用技巧能够极大提高开发效率,让代码更为简洁、优雅、易于阅读。 JavaScript实用技巧之单竖杠 在JavaScript语言中,单竖杠 “|”…

    JavaScript 2023年5月27日
    00
  • JavaScript中reduce()详解及使用方法

    那么接下来我将给您介绍“JavaScript中reduce()详解及使用方法”的完整攻略。 简介 reduce()是JavaScript中的一个高阶函数,用于对数组中的元素进行累加求和、累加乘积、字符串拼接、对象计数等操作。 它有两个主要的参数: callback:用于迭代数组中每个元素的函数,包含四个参数:accumulator、currentValue、…

    JavaScript 2023年6月10日
    00
  • 通过JavaScript下载文件到本地的方法(单文件)

    以下是通过JavaScript下载文件到本地的方法的完整攻略: 标准的下载方法 通过标准的HTML a标签和download属性可以实现文件的下载。该属性用于指定资源的下载地址,将会生成一个下载的链接。 <a href="文件地址" download="文件名">下载文件</a> 其中,href…

    JavaScript 2023年5月27日
    00
  • js获取判断上传文件后缀名的示例代码

    当需要上传文件时,有时我们需要判断文件的后缀名是否符合规范,例如只支持上传jpg、png、gif等图片格式。这时我们可以通过 JavaScript 来获取并判断上传文件的后缀名是否符合要求。下面是获取判断上传文件后缀名的示例代码的完整攻略: 1. 获取上传的文件信息 在 HTML 中,我们需要使用 <input> 标签的 type 属性为 “fi…

    JavaScript 2023年5月27日
    00
  • 微信JS接口汇总及使用详解

    微信JS接口汇总及使用详解 微信JS-SDK是微信公众平台面向网页开发者提供的基于微信内的网页开发工具包。本文将详细讲解微信JS-SDK的封装使用以及开发中常用到的接口。 1. 前置准备 1.1 获取授权 在使用微信JS-SDK之前,你需要先申请一个公众号并获得授权。具体流程请查看微信公众平台文档。 1.2 引入JS文件 <script src=&qu…

    JavaScript 2023年6月10日
    00
  • ES6新特征数字、数组、字符串

    ES6(ECMAScript 2015)是JavaScript的一项更新,在数字、数组、字符串等方面引入了许多新特性。本文将详细讲解ES6的数字、数组、字符串新特性。 ES6新特性:数字 二进制和八进制字面量 ES6引入了二进制和八进制字面量,分别使用0b或0B以及0o或0O前缀表示。例如: let binary = 0B1101; // 13 let oc…

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