js 实现拖拽滚动、滚轮缩放元素函数和案例

文章目录

  • 一、拖拽滚动
    • 1、封装函数
    • 2、示例:
  • 二、滚轮缩放
    • 1、封装函数
    • 2、结合拖拽滚动示例

一、拖拽滚动

1、封装函数

    /*** @description 使用鼠标拖拽div,实现横向、纵向滚动* @param el 被拖拽滚动的元素(产生滚动条的元素)*/function addDragable(el) {let startX = 0; // el的scroll横向初始位置let gapX = 0; // 鼠标点击时的横向初始位置let startY = 0; // el的scroll纵向向初始位置let gapY = 0; // 鼠标点击时的纵向初始位置el.addEventListener("mousedown", start);el.addEventListener("mouseleave", stop); // 移除时解除事件function start(event) {// 判断是否点击鼠标左键if (event.button == 0) {gapX = event.clientX;gapY = event.clientY;startX = el.scrollLeft;startY = el.scrollTop;el.addEventListener("mousemove", move); // documentel.addEventListener("mouseup", stop);}// event.preventDefault(); // 阻止默认事件或冒泡 如拖拽时选中文本return false;}function move(event) {// 移动时的坐标 - 鼠标左键点击时的坐标 = 鼠标移动的相对距离var left = event.clientX - gapX;var top = event.clientY - gapY;// 滚动条初始坐标 - 移动的相对距离 = 应该滚动后的坐标el.scrollTo(startX - left, startY - top); // 横向 纵向return false;}function stop() {// 鼠标松开,解除绑定el.removeEventListener("mousemove", move, false);el.removeEventListener("mouseup", stop, false);}}

2、示例:

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>实现元素拖拽滚动</title>
</head><body><div id="dragableWrapper" class="wrapper"><div id="dragable"><h2>实现元素拖拽滚动(不会因拖拽被选中的文字,按情形选一既可。)</h2><h2>js做法:event.preventDefault(); 阻止默认事件或冒泡;</h2><h2>css做法:user-select: none;</h2><div class="row"><div class="box"></div><div class="box"></div><div class="box"></div><div class="box"></div><div class="box"></div></div><div class="row"><div class="box"></div><div class="box"></div><div class="box"></div><div class="box"></div><div class="box"><copyright class="copyright">GeniusXYT:<a href="https://blog.csdn.net/GeniusXYT/article/details/124198758">https://blog.csdn.net/GeniusXYT/article/details/124198758</a>(转发请注明出处)</copyright></div></div></div></div>
</body><script>/*** @description 使用鼠标拖拽div,实现横向、纵向滚动* @param el 被拖拽滚动的元素(产生滚动条的元素)*/function addDragable(el) {let startX = 0; // el的scroll横向初始位置let gapX = 0; // 鼠标点击时的横向初始位置let startY = 0; // el的scroll纵向向初始位置let gapY = 0; // 鼠标点击时的纵向初始位置el.addEventListener("mousedown", start);el.addEventListener("mouseleave", stop); // 移除时解除事件function start(event) {// 判断是否点击鼠标左键if (event.button == 0) {gapX = event.clientX;gapY = event.clientY;startX = el.scrollLeft;startY = el.scrollTop;el.addEventListener("mousemove", move); // documentel.addEventListener("mouseup", stop);}// event.preventDefault(); // 阻止默认事件或冒泡 如拖拽时选中文本return false;}function move(event) {// 移动时的坐标 - 鼠标左键点击时的坐标 = 鼠标移动的相对距离var left = event.clientX - gapX;var top = event.clientY - gapY;// 滚动条初始坐标 - 移动的相对距离 = 应该滚动后的坐标el.scrollTo(startX - left, startY - top); // 横向 纵向return false;}function stop() {// 鼠标松开,解除绑定el.removeEventListener("mousemove", move, false);el.removeEventListener("mouseup", stop, false);}}addEventListener("onload", addDragable(document.getElementById("dragableWrapper")))</script><style>.wrapper {width: 1000px;height: 500px;padding: 200px;overflow: auto;border: 2px ridge rgb(65, 194, 227);}h2 {user-select: none;}.row {user-select: none;white-space: nowrap;}.box {display: inline-block;width: 300px;height: 300px;background-color: rgb(43, 229, 235);}.row:last-child .box:last-child {position: relative;}.row:last-child .box:last-child .copyright {position: absolute;right: 0;bottom: 0;font-size: 12px;opacity: .2;}
</style></html>

二、滚轮缩放

1、封装函数

	/*** @description 滚轮缩放元素* @param targetEl 被缩放目标元素* @param wrapperEl 产生缩放的包裹元素,默认是targetEl的父元素*/function addScale(targetEl, wrapperEl) {var scale = 1; // 初始缩放比率var scalePercent = 0.2; // 缩放系数(越大缩放跨度越大)var minScale = 0.1; // 最小缩放比率var maxScale = 5; // 最大缩放比率var transformOrigin = "left top"; // 以左上角为基准点,不会造成元素超出左、上边界而没有滚动条问题wrapperEl = wrapperEl || targetEl.parentElement; // 默认取父元素wrapperEl.addEventListener("mousewheel", onMouseWheel);// 鼠标滚轮事件function onMouseWheel(e) {// var e = e || window.e;var down = true; // 定义向下滚动的标志down = e.wheelDelta ? e.wheelDelta < 0 : e.detail > 0;// 鼠标滚轮向下缩小if (down) {scale = (parseFloat(scale) - scalePercent).toFixed(2);if (scale > minScale) {targetEl.style.transform = "scale(" + scale + ")";targetEl.style.transformOrigin = transformOrigin;} else {scale = minScale;}} else {// 鼠标滚轮向上放大scale = (parseFloat(scale) + scalePercent).toFixed(2);if (scale < maxScale) {targetEl.style.transform = "scale(" + scale + ")";targetEl.style.transformOrigin = transformOrigin;} else {scale = maxScale;}}if (e.preventDefault) {/*FF 和 Chrome*/e.preventDefault(); // 阻止默认事件}return false;}}

2、结合拖拽滚动示例

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>实现元素拖拽滚动</title>
</head><body><div id="dragableWrapper" class="wrapper"><div id="dragable"><h2>实现元素拖拽滚动(不会因拖拽被选中的文字,按情形选一既可。)</h2><h2>js做法:event.preventDefault(); 阻止默认事件或冒泡;</h2><h2>css做法:user-select: none;</h2><div class="row"><div class="box"></div><div class="box"></div><div class="box"></div><div class="box"></div><div class="box"></div></div><div class="row"><div class="box"></div><div class="box"></div><div class="box"></div><div class="box"></div><div class="box"><copyright class="copyright">GeniusXYT:<a href="https://blog.csdn.net/GeniusXYT/article/details/124198758">https://blog.csdn.net/GeniusXYT/article/details/124198758</a>(转发请注明出处)</copyright></div></div></div></div>
</body><script>/*** @description 使用鼠标拖拽div,实现横向、纵向滚动* @param el 被拖拽滚动的元素(产生滚动条的元素)*/function addDragable(el) {let startX = 0; // el的scroll横向初始位置let gapX = 0; // 鼠标点击时的横向初始位置let startY = 0; // el的scroll纵向向初始位置let gapY = 0; // 鼠标点击时的纵向初始位置el.addEventListener("mousedown", start);el.addEventListener("mouseleave", stop); // 移除时解除事件function start(event) {// 判断是否点击鼠标左键if (event.button == 0) {gapX = event.clientX;gapY = event.clientY;startX = el.scrollLeft;startY = el.scrollTop;el.addEventListener("mousemove", move); // documentel.addEventListener("mouseup", stop);}// event.preventDefault(); // 阻止默认事件或冒泡 如拖拽时选中文本return false;}function move(event) {// 移动时的坐标 - 鼠标左键点击时的坐标 = 鼠标移动的相对距离var left = event.clientX - gapX;var top = event.clientY - gapY;// 滚动条初始坐标 - 移动的相对距离 = 应该滚动后的坐标el.scrollTo(startX - left, startY - top); // 横向 纵向return false;}function stop() {// 鼠标松开,解除绑定el.removeEventListener("mousemove", move, false);el.removeEventListener("mouseup", stop, false);}}/*** @description 滚轮缩放元素* @param targetEl 被缩放目标元素* @param wrapperEl 产生缩放的包裹元素,默认是targetEl的父元素*/function addScale(targetEl, wrapperEl) {var scale = 1; // 初始缩放比率var scalePercent = 0.2; // 缩放系数(越大缩放跨度越大)var minScale = 0.1; // 最小缩放比率var maxScale = 5; // 最大缩放比率var transformOrigin = "left top"; // 以左上角为基准点,不会造成元素超出左、上边界而没有滚动条问题wrapperEl = wrapperEl || targetEl.parentElement; // 默认取父元素wrapperEl.addEventListener("mousewheel", onMouseWheel);// 鼠标滚轮事件function onMouseWheel(e) {// var e = e || window.e;var down = true; // 定义向下滚动的标志down = e.wheelDelta ? e.wheelDelta < 0 : e.detail > 0;// 鼠标滚轮向下缩小if (down) {scale = (parseFloat(scale) - scalePercent).toFixed(2);if (scale > minScale) {targetEl.style.transform = "scale(" + scale + ")";targetEl.style.transformOrigin = transformOrigin;} else {scale = minScale;}} else {// 鼠标滚轮向上放大scale = (parseFloat(scale) + scalePercent).toFixed(2);if (scale < maxScale) {targetEl.style.transform = "scale(" + scale + ")";targetEl.style.transformOrigin = transformOrigin;} else {scale = maxScale;}}if (e.preventDefault) {/*FF 和 Chrome*/e.preventDefault(); // 阻止默认事件}return false;}}addEventListener("onload", addDragable(document.getElementById("dragableWrapper")))addEventListener("onload", addScale(document.getElementById("dragable")))// addEventListener("onload", addScale(document.getElementById("dragable"), document.getElementById("dragable"))) // 仅在元素本身生效</script><style>.wrapper {width: 1000px;height: 500px;padding: 200px;overflow: auto;border: 2px ridge rgb(65, 194, 227);}h2 {user-select: none;}.row {user-select: none;white-space: nowrap;}.box {display: inline-block;width: 300px;height: 300px;background-color: rgb(43, 229, 235);}.row:last-child .box:last-child {position: relative;}.row:last-child .box:last-child .copyright {position: absolute;right: 0;bottom: 0;font-size: 12px;opacity: .2;}
</style></html>

如有帮助请

  • 点赞
  • 收藏
  • 转发

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/278525.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

怎么解决input中readonly属性的iOS一直存在光标问题

用css中的pointer-events:none转载于:https://www.cnblogs.com/studyh5/p/8352061.html

赠与大学毕业生_出售,赠与或交易iPhone之前应该做什么

赠与大学毕业生A factory reset of your iPhone erases all of your content and settings, reverting it to a like-new state. However, there are a few extra steps you should take if you plan to get rid of your iPhone. iPhone的恢复出厂设置将删除所有内容和设置&…

layui radio 根据获取的到值选中

<input type"radio" name"lwkg" value"1" title"开" lay-filter"lwkg"> <input type"radio" name"lwkg" value"0" title"关" lay-filter"lwkg"> layui.use(…

设置Mac自动显示和隐藏 Dock 栏的速度

Dock 显示和隐藏&#xff0c;系统默认设置成了1秒 通过终端.APP修改显示和隐藏的时间 &#xff08;单位&#xff1a;秒&#xff09; 默认的&#xff1a;defaults write com.apple.dock autohide-delay -int 1 优化的&#xff1a;defaults write com.apple.dock autohide-del…

powerpoint预览_如何放大和缩小PowerPoint演示文稿的一部分

powerpoint预览Microsoft PowerPoint lets you zoom in and out on a specific part of your PowerPoint slideshow, which can be handy both while editing and for drawing attention to important objects or ideas during the presentation. Here’s how to do it. Micros…

GitGitHub语法大全

目录 1. GitHub与Git万用语法1&#xff09;创建库2&#xff09;添加和提交到仓库3&#xff09;版本回退4&#xff09;缓存区和暂存区5&#xff09;撤销和删除文件6)远程仓库7)创建和合并分支2. 更多Git语法1. GitHub与Git万用语法 1&#xff09;创建库 git init 2&#xff09;添…

从Firefox控制您喜欢的音乐播放器

Do you love listening to music while you browse? Now you can access and control your favorite music player directly from Firefox with the FoxyTunes extension. 您喜欢在浏览时听音乐吗&#xff1f; 现在&#xff0c;您可以直接使用FoxyTunes扩展程序从Firefox访问和…

富文本编辑器初探

长期以来&#xff0c;作为用户我是富文本编辑器的使用者&#xff0c;作为前端开发&#xff0c;我也只是富文本插件的使用者&#xff0c;对内部实现细节不甚了解&#xff0c;使用上也只停留在调用插件提供的API&#xff0c;实现一些业务逻辑。最近的项目&#xff0c;需要开发一个…

特殊的求和(函数和循环)

【问题描述】 编写函数int fun(int a,int n)求Sn a aa aaa … aa…a 的值&#xff08;最后一个数中 a 的个数为 n &#xff09;&#xff0c;其中 a 是一个1~9的数字&#xff0c;例如&#xff1a;2 22 222 2222 22222 &#xff08;此时 a2 n5 &#xff09; 。参数由主函…

ms project 入门_Microsoft Project 2010入门

ms project 入门Would you like to keep your projects on track and keep track of how time and resources are used? Let’s take a look at Microsoft Project 2010 and how it can help you stay on top of your projects. 您想保持项目进度并了解如何使用时间和资源吗&…

mysql基本的增删改查和条件语句

增 insert into 表名&#xff08;列名,列名。。。。。。&#xff09; values("test1",23),("test2",23),("test3",24); 这条命令可以一次增加一条数据&#xff0c;也可以同时增加多条数据 还可以从插入其他的表到数据到当前表 insert into 插入的…

后端model传入前端JSP页面中的值判断后再取值

所遇到的问题后端model传入前端JSP页面中的值通过foreach循环内要满足条件才能取值给Div中&#xff0c;我们知道jsp页面中可以直接用EL表达式取值&#xff0c;格式就是${"model中传来的数据"},但是我要把传过来的数据判断后再取值就遇到了问题&#xff0c;通过查百度…

黑莓os软件下载_在PC上试用BlackBerry OS

黑莓os软件下载There’s a wider selection of smart phones and mobile OS’s than ever before, but you can’t just go buy every phone available and try them all out. Here’s how you can test out the latest version of the BlackBerry OS for free on your PC. 智…

IO流之转换流

一 转换流 1 OutputStreamWriter类 是字符流通向字节流的桥梁&#xff1a; 可使用指定的字符编码表&#xff0c;将要写入流中的字符编码成字节。它的作用的就是&#xff0c;将字符串按照指定的编码表转成字节&#xff0c;在使用字节流将这些字节写出去。 public static void m…

Spring事务管理(三)-PlatformmTransactionManager解析和事务传播方式原理

2019独角兽企业重金招聘Python工程师标准>>> Spring在事务管理时&#xff0c;对事务的处理做了极致的抽象&#xff0c;即PlatformTransactionManager。对事务的操作&#xff0c;简单地来说&#xff0c;只有三步操作&#xff1a;获取事务&#xff0c;提交事务&#x…

div方框弯曲边样式_使用弯曲样式编辑文本

div方框弯曲边样式Would you like a new Notepad replacement that incorporates the latest technologies while staying slim and fast? Text editors are usually bland, boring programs, but here’s a new one that makes your text come to life beautifully. 您是否想…

分布式锁的几种实现原理

分布式锁主流有三种模式&#xff1a; 实现方式 功能要求 实现难度 学习成本 运维成本 MySQL 的方案借助表锁/行锁实现 满足基本要求 不难 熟悉 小量OK、大量影响现有业务、1主多从架构&#xff0c;不方便扩容 通过 ZK 创建数据节点的方式实现 满足要求 熟悉 ZK API 即可 需要学…

如何破解您忘记的Windows密码

Here at How-To Geek, we’ve covered many different ways to reset your password for Windows—but what if you can’t reset your password? Or what if you’re using drive encryption that would wipe out your files if you changed the password? It’s time to cr…

sql语句练习50题(Mysql版)

表名和字段–1.学生表Student(s_id,s_name,s_birth,s_sex) –学生编号,学生姓名, 出生年月,学生性别–2.课程表Course(c_id,c_name,t_id) – –课程编号, 课程名称, 教师编号–3.教师表Teacher(t_id,t_name) –教师编号,教师姓名–4.成绩表Score(s_id,c_id,s_score) –学生编号…

OpenCV3 识别图中表格-JAVA 实现

2019独角兽企业重金招聘Python工程师标准>>> 关于 JAVA 学习 OpenCV 的内容&#xff0c;函数讲解。内容我均整理在 GitHubd的OpenCV3-Study-JAVA OpenCV 3 识别图中表格-Java 实现 1. 说明 网上大部分资料&#xff0c;都是针对 C的&#xff0c;python、java 的例子太…