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 相关文章推荐
javascript String 的扩展方法集合
Jun 01 Javascript
Jquery动态更改一张位图的src与Attr的使用
Jul 31 Javascript
JS获取节点的兄弟,父级,子级元素的方法
Jan 09 Javascript
获取input标签的所有属性的方法
Jun 28 Javascript
AngularJS教程之MVC体系结构详解
Aug 16 Javascript
JS 获取HTML标签内的子节点的方法
Sep 21 Javascript
js编写三级联动简单案例
Dec 21 Javascript
Bootstrap导航条鼠标悬停下拉菜单
Jan 04 Javascript
JS身份证信息验证正则表达式
Jun 12 Javascript
微信小程序项目总结之点赞 删除列表 分享功能
Jun 25 Javascript
Vue如何实现响应式系统
Jul 11 Javascript
快速对接payjq的个人微信支付接口过程解析
Aug 15 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执行速度全攻略(下)
2006/10/09 PHP
php 分页函数multi() discuz
2009/06/21 PHP
一些实用的jQuery代码片段收集
2011/07/12 Javascript
Dom 结点创建 基础知识
2011/10/01 Javascript
一些常用弹出窗口/拖放/异步文件上传等实用代码
2013/01/06 Javascript
异步动态加载JS并运行(示例代码)
2013/12/13 Javascript
js获取某元素的class里面的css属性值代码
2014/01/16 Javascript
nodejs实现黑名单中间件设计
2014/06/17 NodeJs
Javascript中的五种数据类型详解
2014/12/26 Javascript
javascript实现简单的二级联动
2015/03/19 Javascript
用svg制作富有动态的tooltip
2015/07/17 Javascript
js实现Select列表各项上移和下移的方法
2015/08/14 Javascript
js print打印网页指定区域内容的简单实例
2016/11/01 Javascript
Vue 中 filter 与 computed 的区别与用法解析
2019/11/21 Javascript
JS实现网页烟花动画效果
2020/03/10 Javascript
vue项目中播放rtmp视频文件流的方法
2020/09/17 Javascript
[01:30:54]《加油DOTA》 第三期
2014/08/18 DOTA
Python实现的tab文件操作类分享
2014/11/20 Python
python实现根据窗口标题调用窗口的方法
2015/03/13 Python
在Mac OS上使用mod_wsgi连接Python与Apache服务器
2015/12/24 Python
Python简单计算文件MD5值的方法示例
2018/04/11 Python
python贪婪匹配以及多行匹配的实例讲解
2018/04/19 Python
python爬虫之urllib库常用方法用法总结大全
2018/11/14 Python
Django 项目重命名的实现步骤解析
2019/08/14 Python
python使用Geany编辑器配置方法
2020/02/21 Python
Python 解决火狐浏览器不弹出下载框直接下载的问题
2020/03/09 Python
python脚本监控logstash进程并邮件告警实例
2020/04/28 Python
详解Selenium 元素定位和WebDriver常用方法
2020/12/04 Python
python openssl模块安装及用法
2020/12/06 Python
详解numpy1.19.4与python3.9版本冲突解决
2020/12/15 Python
浅析python连接数据库的重要事项
2021/02/22 Python
商场消防管理制度
2014/01/12 职场文书
毕业实习评语
2014/02/10 职场文书
银行贷款收入证明
2014/10/17 职场文书
教师党员学习群众路线心得体会
2014/11/04 职场文书
世界气象日活动总结
2015/02/27 职场文书