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下IE与Firefox下的差异兼容写法总结
Jun 18 Javascript
JS实现程序暂停与继续功能代码解读
Oct 10 Javascript
javascript类型转换使用方法
Feb 08 Javascript
JavaScript iframe数据共享接口实现方法
Jan 06 Javascript
jQuery与js实现颜色渐变的方法
Dec 30 Javascript
JavaScript常用正则验证函数实例小结【年龄,数字,Email,手机,URL,日期等】
Jan 23 Javascript
vue使用监听实现全选反选功能
Jul 06 Javascript
如何制作一个Node命令行图像识别工具
Dec 12 Javascript
JavaScript事件对象深入详解
Dec 30 Javascript
利用layer实现表单完美验证的方法
Sep 26 Javascript
vue实现配置全局访问路径头(axios)
Nov 01 Javascript
js 执行上下文和作用域的相关总结
Feb 08 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/11/25 PHP
用PHP+MySQL搭建聊天室功能实例代码
2012/08/20 PHP
PHP SPL标准库之文件操作(SplFileInfo和SplFileObject)实例
2015/05/11 PHP
PHP+ajax实现二级联动菜单功能示例
2018/08/10 PHP
php中目录操作opendir()、readdir()及scandir()用法示例
2019/06/08 PHP
JavaScript Chart 插件整理
2010/06/18 Javascript
Javascript弹出窗口的各种方法总结
2013/11/11 Javascript
javascript的alert box在java中如何显示多行
2014/05/18 Javascript
JavaScript合并两个数组并去除重复项的方法
2015/06/13 Javascript
jquery实现的蓝色二级导航条效果代码
2015/08/24 Javascript
getElementById().innerHTML与getElementById().value的区别
2016/10/27 Javascript
js+canvas实现动态吃豆人效果
2017/03/22 Javascript
Js判断H5上下滑动方向及滑动到顶部和底部判断的示例代码
2017/11/15 Javascript
详解Immutable及 React 中实践
2018/03/01 Javascript
vue配置请求本地json数据的方法
2018/04/11 Javascript
Webpack打包字体font-awesome的方法示例
2018/04/26 Javascript
在vue里使用codemirror遇到的问题
2018/11/01 Javascript
详解如何在Angular优雅编写HTTP请求
2018/12/05 Javascript
redux.js详解及基本使用
2019/05/24 Javascript
浅谈vue异步数据影响页面渲染
2019/10/29 Javascript
使用js实现单链解决前端队列问题的方法
2020/02/03 Javascript
es6数组之扩展运算符操作实例分析
2020/04/25 Javascript
python模拟登陆Tom邮箱示例分享
2014/01/13 Python
在服务器端实现无间断部署Python应用的教程
2015/04/16 Python
Python实现树莓派WiFi断线自动重连的实例代码
2017/03/16 Python
python实现折半查找和归并排序算法
2017/04/14 Python
Django 生成登陆验证码代码分享
2017/12/12 Python
使用Python搭建虚拟环境的配置方法
2018/02/28 Python
推荐技术人员一款Python开源库(造数据神器)
2020/07/08 Python
CSS3实战第一波 让我们尽情的圆角吧
2010/08/27 HTML / CSS
最新销售员个人自荐信
2013/09/21 职场文书
料理师求职信
2014/01/30 职场文书
餐饮商业计划书范文
2014/04/29 职场文书
领导干部作风整顿剖析材料
2014/10/11 职场文书
在职人员跳槽求职信
2015/03/20 职场文书
小学大队委竞选口号
2015/12/25 职场文书