JavaScript实现拖拽和缩放效果


Posted in Javascript onAugust 24, 2020

本文实例为大家分享了JavaScript实现拖拽和缩放效果的具体代码,供大家参考,具体内容如下

<!DOCTYPE html>
<html>

<head>
  <meta charset="utf-8" />
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <title>拖拽缩放</title>
  <meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<style>
  * {
    margin: 0;
    padding: 0
  }

  #box {
    width: 100%;
    height: 100%;
    position: relative;
    background: #4bb0bb
  }

  #drag {
    width: 200px;
    height: 200px;
    position: relative;
    background: #691fff;
    cursor: move;
  }

  #scale {
    width: 20px;
    height: 20px;
    position: absolute;
    background: #ffa500;
    cursor: se-resize;
    right: 0;
    bottom: 0;
    overflow: hidden;
  }
</style>

<body>
  <div id="box">
    <div id="drag">
      <div id="scale"></div>
    </div>
  </div>
</body>
<script>

  window.onload = function () {
    var box = document.getElementById("box")
    var drag = document.getElementById("drag")
    var scale = document.getElementById("scale")
    // mousedown mousemove mouseup
    dragTool(drag)
    scaleTool(drag, scale, box)
    // 拖拽方法
    function dragTool(node) {
      node.onmousedown = function (ev) {
        // 浏览器兼容处理
        var e = ev || window.event;
        // 鼠标按下记录相对位置
        // 水平方向都距离 = 当前鼠标左边的距离 - 被拖拽元素距离左边的距离
        var offsetX = e.clientX - node.offsetLeft;
        // 垂直方向都距离 = 当前鼠标都上边的距离 - 被拖拽元素距离距离的距离
        var offsetY = e.clientY - node.offsetTop;
        // 鼠标移动和被拖拽的元素是相对的 这里是鼠标拖拽的物体在整个页面上移动 所以
        // move加在document上
        document.onmousemove = function (ev) {
          // 当前鼠标的事件对象
          var e = ev || window.event;
          // 定义 currentLeft = 当前鼠标位置 - 距离左边的距离
          var currentLeft = e.clientX - offsetX;
          // 定义 currentTop = 当前鼠标上边位置 - 距离上边的距离
          var currentTop = e.clientY - offsetY
          // 限制左出界 最左是 0 
          if (currentLeft <= 0) {
            currentLeft = 0;
          }
          // 当前窗口的宽 浏览器兼容
          var windowWidth = document.documentElement.clientWidth || document.body.clientWidth;
          // 限制右边出界 如果大于当前窗口的宽 那么就让它等于当前窗口的宽减去当前元素的offsetWidth 也就是留在原地
          if (currentLeft >= windowWidth - node.offsetWidth) {
            currentLeft = windowWidth - node.offsetWidth;
          }
          // 设置上出界 最上边是 0 
          if (currentTop <= 0) {
            currentTop = 0;
          }
          // 当前窗口的高 浏览器兼容
          var windowHeight = document.documentElement.clientHeight || document.body.clientHeight;
          // 限制下边出界 如果大于当前窗口的高 减去 本身的高 那么就让它等于 当前窗口的高减去本身的高
          if (currentTop >= windowHeight - node.offsetHeight) {
            currentTop = windowHeight - node.offsetHeight;
          }
          // 当前被拖拽元素的 left 值 等于上面计算出的 currentLeft
          node.style.left = currentLeft + 'px';
          // 当前被拖拽元素的 top 值 等于上面计算出的 currentTop
          node.style.top = currentTop + 'px';
        }
      }
      // 鼠标弹起取消拖拽 这里添加到 node 元素对象也可以的
      document.onmouseup = function () {
        document.onmousemove = null;
      }
    }

    // 缩放
    function scaleTool(drag, scale, box) {
      scale.onmousedown = function (e) {
        //阻止冒泡 避免缩放触发移动事件
        e.stopPropagation()
        // 取消事件的默认动作
        e.preventDefault()
        // 定义position
        var position = {
          'w': drag.offsetWidth, // 被缩放元素的offsetWidth
          'h': drag.offsetHeight, // 被缩放元素的offsetHeight
          'x': e.clientX, // 当前窗口鼠标指针的水平坐标
          'y': e.clientY, // 当前窗口鼠标指针的垂直坐标
        }
        drag.onmousemove = function (ev) {
          ev.preventDefault()
          // 设置最大缩放为30*30 Math.max取最大值 
          var w = Math.max(30, ev.clientX - position.x + position.w)
          var h = Math.max(30, ev.clientY - position.y + position.h)

          // 设置最大的宽高
          w = w >= box.offsetWidth - drag.offsetLeft ? box.offsetWidth - drag.offsetLeft : w;
          h = h >= box.offsetHeight - drag.offsetTop ? box.offsetHeight - drag.offsetTop : h;
          drag.style.width = w + 'px';
          drag.style.height = h + 'px';
        }
        // 鼠标离开和抬起取消缩放
        drag.onmouseup = function () {
          drag.onmousemove = null;
          drag, onmouseup = null;
        }
        drag.onmouseleave = function () {
          drag.onmousemove = null;
          drag, onmouseup = null;
        }
      }
    }
  }

</script>

</html>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
鼠标事件延时切换插件
Mar 12 Javascript
jquery如何判断表格同一列不同行input数据是否重复
May 14 Javascript
javascript求日期差的方法
Mar 02 Javascript
js不间断滚动的简单实现
Jun 03 Javascript
Js查找字符串中出现次数最多的字符及个数实例解析
Sep 05 Javascript
JS中BOM相关知识点总结(必看篇)
Nov 22 Javascript
Angular2学习教程之组件中的DOM操作详解
May 28 Javascript
理解 javascript 中的函数表达式与函数声明
Jul 07 Javascript
vue+socket.io+express+mongodb 实现简易多房间在线群聊示例
Oct 21 Javascript
js动态引入的四种方法
May 05 Javascript
vue实现多个元素或多个组件之间动画效果
Sep 25 Javascript
Vue.js数字输入框组件使用方法详解
Oct 19 Javascript
Jquery 获取相同NAME 或者id删除行操作
Aug 24 #jQuery
JavaScript实现矩形块大小任意缩放
Aug 25 #Javascript
VSCode插件安装完成后的配置(常用配置)
Aug 24 #Javascript
JS实现按比例缩小图片宽高
Aug 24 #Javascript
JS实现简易贪吃蛇游戏
Aug 24 #Javascript
通过高德地图API获得某条道路上的所有坐标用于描绘道路的方法
Aug 24 #Javascript
Node.js 中判断一个文件是否存在
Aug 24 #Javascript
You might like
codeigniter发送邮件并打印调试信息的方法
2015/03/21 PHP
PHP设计模式之适配器模式定义与用法详解
2018/04/03 PHP
php多进程中的阻塞与非阻塞操作实例分析
2020/03/04 PHP
一种JavaScript的设计模式
2006/11/22 Javascript
一直复略了的一个问题,关于表单重复提交
2007/02/15 Javascript
使用jquery为table动态添加行的实现代码
2011/03/30 Javascript
javascript学习笔记(三)显示当时时间的代码
2011/04/08 Javascript
js 遍历json返回的map内容示例代码
2013/10/29 Javascript
javascript中offset、client、scroll的属性总结
2015/08/13 Javascript
js实现向右横向滑出的二级菜单效果
2015/08/27 Javascript
jQuery实现的鼠标滑过弹出放大图片特效
2016/01/08 Javascript
BootStrap Table 分页后重新搜索问题的解决办法
2016/08/08 Javascript
在JavaScript中调用Java类和接口的方法
2016/09/07 Javascript
Vuejs入门教程之Vue生命周期,数据,手动挂载,指令,过滤器
2017/04/19 Javascript
微信小程序 获取二维码实例详解
2017/06/23 Javascript
react实现一个优雅的图片占位模块组件详解
2017/10/30 Javascript
Vue如何实现响应式系统
2018/07/11 Javascript
解决koa2 ctx.render is not a function报错问题
2018/08/07 Javascript
Node.js 在本地生成日志文件的方法
2020/02/07 Javascript
js实现贪吃蛇小游戏(加墙)
2020/07/31 Javascript
初学Python函数的笔记整理
2015/04/07 Python
Python实现小数转化为百分数的格式化输出方法示例
2017/09/20 Python
用Python写王者荣耀刷金币脚本
2017/12/21 Python
Python判断对象是否为文件对象(file object)的三种方法示例
2019/04/26 Python
Python 读取有公式cell的结果内容实例方法
2020/02/17 Python
记一次python 爬虫爬取深圳租房信息的过程及遇到的问题
2020/11/24 Python
HTML5触摸事件实现移动端简易进度条的实现方法
2018/05/04 HTML / CSS
Waterford加拿大官方网站:世界著名的水晶杯品牌
2016/11/01 全球购物
乌克兰香水和化妆品网站:Notino.ua
2018/03/26 全球购物
Laura Geller官网:美国彩妆品牌
2018/12/29 全球购物
国际花店:Pickup Flowers
2020/04/10 全球购物
《千年梦圆在今朝》教学反思
2014/02/24 职场文书
2014年高数考试作弊检讨书
2014/12/14 职场文书
2015年毕业生自荐信范文
2015/03/24 职场文书
公司2015年终工作总结
2015/05/26 职场文书
教师个人教学反思
2016/02/23 职场文书