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.pswp.cn/news/278525.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/278525.shtml
英文地址,請注明出處:http://en.pswp.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 的例子太…