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脚本学习 比较实用的基础
Sep 07 Javascript
JS数学函数Exp使用说明
Aug 09 Javascript
js禁止页面复制功能禁用页面右键菜单示例代码
Aug 29 Javascript
jquery简单实现鼠标经过导航条改变背景图
Dec 17 Javascript
AngularJS中指令的四种基本形式实例分析
Nov 22 Javascript
微信小程序 less文件编译成wxss文件实现办法
Dec 05 Javascript
jquery PrintArea 实现票据的套打功能(代码)
Mar 17 Javascript
php 修改密码实现代码
May 24 Javascript
浅谈angularJS的$watch失效问题的解决方案
Aug 11 Javascript
vue路由组件按需加载的几种方法小结
Jul 12 Javascript
详解vue文件中使用echarts.js的两种方式
Oct 18 Javascript
浅谈Vue数据响应思路之数组
Nov 06 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导入大量数据到mysql性能优化技巧
2014/12/29 PHP
支持png透明图片的php生成缩略图类分享
2015/02/08 PHP
php图片水印添加、压缩、剪切的封装类实现
2020/04/18 PHP
Laravel使用Caching缓存数据减轻数据库查询压力的方法
2016/03/15 PHP
Laravel构建即时应用的一种实现方法详解
2017/08/31 PHP
JAVASCRIPT HashTable
2007/01/22 Javascript
JSON.parse 解析字符串出错的解决方法
2010/07/08 Javascript
Node.js中的流(Stream)介绍
2015/03/30 Javascript
JavaScript实现为指定对象添加多个事件处理程序的方法
2015/04/17 Javascript
学习jQuey中的return false
2015/12/18 Javascript
分享有关jQuery中animate、slide、fade等动画的连续触发、滞后反复执行的bug
2016/01/10 Javascript
Fullpage.js固定导航栏-实现定位导航栏
2016/03/17 Javascript
树结构之JavaScript
2017/01/24 Javascript
详解用node-images 打造简易图片服务器
2017/05/08 Javascript
微信小程序动态增加按钮组件
2018/09/14 Javascript
微信小程序实现多个按钮的颜色状态转换
2019/02/15 Javascript
JS使用百度地图API自动获取地址和经纬度操作示例
2019/04/16 Javascript
Vue Element UI + OSS实现上传文件功能
2019/07/31 Javascript
LayUI数据接口返回实体封装的例子
2019/09/12 Javascript
vue实现节点增删改功能
2019/09/26 Javascript
关于Django外键赋值问题详解
2017/08/13 Python
理想高通滤波实现Python opencv示例
2019/01/30 Python
Python 中Django验证码功能的实现代码
2019/06/20 Python
如何通过雪花算法用Python实现一个简单的发号器
2019/07/03 Python
在django admin详情表单显示中添加自定义控件的实现
2020/03/11 Python
Skyscanner英国:苏格兰的全球三大领先航班搜索服务之一
2017/11/09 全球购物
Parfumdreams英国:香水和化妆品
2019/05/10 全球购物
工商管理专业实习大学生自我鉴定
2013/09/19 职场文书
主持人演讲稿范文
2013/12/28 职场文书
大学学习生活感言
2014/01/18 职场文书
《九色鹿》教学反思
2014/02/27 职场文书
“学雷锋活动月”总结
2014/03/09 职场文书
2014小学一年级班主任工作总结
2014/12/05 职场文书
2016年“6.26”禁毒宣传月系列活动总结
2016/04/05 职场文书
怎样做好公众演讲能力?
2019/08/28 职场文书
PySwarms(Python粒子群优化工具包)的使用:GlobalBestPSO例子解析
2021/04/05 Python