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 相关文章推荐
JS BASE64编码 window.atob(), window.btoa()
Mar 09 Javascript
DOM下的节点属性和操作小结
May 14 Javascript
js打印纸函数代码(递归)
Jun 18 Javascript
JavaScript使用cookie实现记住账号密码功能
Apr 27 Javascript
详解JavaScript数组和字符串中去除重复值的方法
Mar 07 Javascript
js实现表单提交后不重新刷新当前页面
Nov 30 Javascript
jquery实现下拉框左右选择功能
Feb 21 Javascript
10个最优秀的Node.js MVC框架
Aug 24 Javascript
js前端面试之同步与异步问题详解
Apr 03 Javascript
浅谈layui框架自带分页和表格重载的接口解析问题
Sep 11 Javascript
Vue循环中多个input绑定指定v-model实例
Aug 31 Javascript
解决idea开发遇到javascript动态添加html元素时中文乱码的问题
Sep 29 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
javascript 数组排序函数
2009/08/20 Javascript
javascript之querySelector和querySelectorAll使用说明
2011/10/09 Javascript
利用ajaxfileupload插件实现文件上传无刷新的具体方法
2013/06/08 Javascript
20行代码实现的一个CSS覆盖率测试脚本
2013/07/07 Javascript
javascript 得到文件后缀名的思路及实现
2020/05/09 Javascript
parentElement,srcElement的使用小结
2014/01/13 Javascript
酷炫jQuery全屏3D焦点图动画效果
2016/03/22 Javascript
node.js 中国天气预报 简单实现
2016/06/06 Javascript
表单中单选框添加选项和移除选项
2016/07/04 Javascript
遍历json 对象的属性并且动态添加属性的实现
2016/12/02 Javascript
Element-ui之ElScrollBar组件滚动条的使用方法
2018/09/14 Javascript
谈谈React中的Render Props模式
2018/12/06 Javascript
vue实现表格过滤功能
2019/09/27 Javascript
JavaScript实现五子棋小游戏
2020/10/26 Javascript
[40:19]2018完美盛典CS.GO表演赛
2018/12/17 DOTA
Python isinstance判断对象类型
2008/09/06 Python
python django集成cas验证系统
2014/07/14 Python
python使用Image处理图片常用技巧分析
2015/06/01 Python
Python基于Socket实现的简单聊天程序示例
2017/08/05 Python
Python将多个excel表格合并为一个表格
2021/02/22 Python
int在python中的含义以及用法
2019/06/27 Python
解决Django layui {{}}冲突的问题
2019/08/29 Python
python读取多层嵌套文件夹中的文件实例
2020/02/27 Python
使用Python实现微信拍一拍功能的思路代码
2020/07/09 Python
html5本地存储 localStorage操作使用详解
2016/09/20 HTML / CSS
MADE荷兰:提供原创设计师家具
2018/04/03 全球购物
全球最大的生存食品、水和装备专用在线市场:BePrepared.com
2020/01/02 全球购物
使用索引有什么好处
2016/07/27 面试题
小学生田径运动会广播稿
2014/09/11 职场文书
骨干教师考核评语
2014/12/31 职场文书
2016幼儿教师自荐信范文
2016/01/28 职场文书
2019自荐信范文集锦!
2019/07/03 职场文书
在Windows下安装配置CPU版的PyTorch的方法
2021/04/02 Python
Java8利用Stream对列表进行去除重复的方法详解
2022/04/14 Java/Android
pt-archiver 主键自增
2022/04/26 MySQL
CentOS7设置ssh服务以及端口修改方式
2022/12/24 Servers