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 相关文章推荐
深入聊聊Array的sort方法的使用技巧.详细点评protype.js中的sortBy方法
Apr 12 Javascript
实现checkbox全选、反选、取消JavaScript小脚本异常
Apr 10 Javascript
jquery重复提交请求的原因浅析
May 23 Javascript
利用jQuery实现漂亮的圆形进度条倒计时插件
Sep 30 Javascript
jQuery实现简单的网页换肤效果示例
Sep 18 Javascript
vuejs响应用户事件(如点击事件)
Mar 14 Javascript
详解打造 Vue.js 可复用组件
Mar 24 Javascript
微信小程序图片宽100%显示并且不变形
Jun 21 Javascript
修改vue+webpack run build的路径方法
Sep 01 Javascript
详解Vue路由自动注入实践
Apr 17 Javascript
ElementUI多个子组件表单的校验管理实现
Nov 07 Javascript
JavaScript 实现下雪特效的示例代码
Sep 09 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
php不允许用户提交空表单(php空值判断)
2013/11/12 PHP
php获取参数的几种方法总结
2014/02/18 PHP
PHP模板引擎smarty详细介绍
2015/05/26 PHP
php通过header发送自定义数据方法
2018/01/18 PHP
PHP Post获取不到非表单数据的问题解决办法
2018/02/27 PHP
php支付宝APP支付功能
2020/07/29 PHP
PHP去除空数组且数组键名重置的讲解
2019/02/28 PHP
详解php中curl返回false的解决办法
2019/03/18 PHP
Yii 框架入口脚本示例分析
2020/05/19 PHP
JavaScript监测ActiveX控件是否已经安装过的代码
2008/09/02 Javascript
面向对象的Javascript之二(接口实现介绍)
2012/01/27 Javascript
javascript suggest效果 自动完成实现代码分享
2012/02/17 Javascript
jQuery-serialize()输出序列化form表单值的方法
2012/12/26 Javascript
JQuery文本改变触发事件如聚焦事件、失焦事件
2014/01/15 Javascript
jquery实现上下左右滑动的方法
2015/02/09 Javascript
浏览器检测JS代码(兼容目前各大主流浏览器)
2016/02/21 Javascript
深入浅析JavaScript函数前面的加号和叹号
2016/07/09 Javascript
jQuery实现模拟flash头像裁切上传功能示例
2016/12/11 Javascript
js以及jquery实现手风琴效果
2020/04/17 Javascript
BootStrap+Mybatis框架下实现表单提交数据重复验证
2017/03/23 Javascript
JS全角与半角转化实例(分享)
2017/07/04 Javascript
Vue 项目中遇到的跨域问题及解决方法(后台php)
2018/03/28 Javascript
JavaScript文本特效实例小结【3个示例】
2018/12/22 Javascript
使用Vue 实现滑动验证码功能
2019/06/27 Javascript
JavaScript冒泡算法原理与实现方法深入理解
2020/06/04 Javascript
解决vant-UI库修改样式无效的问题
2020/11/03 Javascript
巧用Python装饰器 免去调用父类构造函数的麻烦
2012/05/18 Python
python实现决策树分类
2018/08/30 Python
Python把对应格式的csv文件转换成字典类型存储脚本的方法
2019/02/12 Python
django框架用户权限中的session缓存到redis中的方法
2019/08/06 Python
BONIA波尼亚新加坡官网:皮革手袋,鞋类和配件
2016/08/25 全球购物
Linux如何压缩可执行文件
2013/10/21 面试题
Linux常见面试题
2013/03/18 面试题
公司离职证明样本
2014/09/13 职场文书
交通事故赔偿协议书怎么写
2014/10/04 职场文书
vue-element-admin项目导入和导出的实现
2021/05/21 Vue.js