<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
這篇文章介紹兩種建立 range slider 滾軸的方法。
老樣子,話不多說,先上菜。
const knob = document.getElementById('knob'); // 左邊的滑條 const leftSide = knob.previousElementSibling; // 當前滑鼠位置 let x = 0; let y = 0; let leftWidth = 0; // 處理 mousedown 事件 const mouseDownHandler = function (e) { // 獲取當前滑鼠位置 x = e.clientX; y = e.clientY; leftWidth = leftSide.getBoundingClientRect().width; // 在 `document` 上新增事件 document.addEventListener('mousemove', mouseMoveHandler); document.addEventListener('mouseup', mouseUpHandler); }; knob.addEventListener('mousedown', mouseDownHandler); const mouseMoveHandler = function (e) { // 滑鼠移動的距離 const dx = e.clientX - x; const dy = e.clientY - y; const containerWidth = knob.parentNode.getBoundingClientRect().width; let newLeftWidth = ((leftWidth + dx) * 100) / containerWidth; // 限制範圍在 0 - 100 newLeftWidth = Math.max(newLeftWidth, 0); newLeftWidth = Math.min(newLeftWidth, 100); leftSide.style.width = `${newLeftWidth}%`; }; // 當鬆開滑鼠時觸發 const mouseUpHandler = function () { // ... // 移除事件 document.removeEventListener('mousemove', mouseMoveHandler); document.removeEventListener('mouseup', mouseUpHandler); };
input 元素本身支援設定 type 屬性為 range,渲染一個 slider 滾軸。
<input type="range" />
它的相容性也還不錯,支援所有現代瀏覽器以及 IE10 以上,但是它也有一些限制,比如:
也就是說,它的自定義性不是很好,如果想要自定義 slider 滾軸的話,這種方式就無法滿足。
另外,相容性方面我們可以通過下面這段程式碼來進行檢測:
const isRangeInputSupported = function () { const ele = document.createElement('input'); ele.setAttribute('type', 'range'); // 如果當前瀏覽器不支援 `range` input // `type` 屬性會還原到 `text` return ele.type !== 'text'; };
利用瀏覽器本身的預設行為機制,來判斷當前瀏覽器是否支援 range input。
一個 slider 滾軸由 3 部分組成,1 個把手和把手左右兩個的 2 個滑條。
我們先構造 HTML 結構,程式碼如下:
<div class="container"> <div class="left"></div> <div class="knob" id="knob"></div> <div class="right"></div> </div>
這 3 部分元素放置在同一行展示,右邊部分的滑條表示的的是 range input 的可用寬度。所以,我們可以使用如下 CSS 程式碼進行佈局。
.container { /* 內容水平居中 */ display: flex; align-items: center; height: 1.5rem; } .right { /* 可用寬度 */ flex: 1; height: 2px; }
HTML 和 CSS 結構有了,我們接著來處理拖動行為。
const knob = document.getElementById('knob'); // 左邊的滑條 const leftSide = knob.previousElementSibling; // 當前滑鼠位置 let x = 0; let y = 0; let leftWidth = 0; // 處理 mousedown 事件 const mouseDownHandler = function (e) { // 獲取當前滑鼠位置 x = e.clientX; y = e.clientY; leftWidth = leftSide.getBoundingClientRect().width; // 在 `document` 上新增事件 document.addEventListener('mousemove', mouseMoveHandler); document.addEventListener('mouseup', mouseUpHandler); }; knob.addEventListener('mousedown', mouseDownHandler);
上面的程式碼要注意,mousedown
事件監聽在 knob 元素上,而 mousemove
和 mouseup
事件則是監聽在 document 元素上。
document 元素上的監聽回撥事件 mouseMoveHandler
和 mouseUpHandler
請看下文。
當 knob 把手移動時,通過當前滑鼠位置和記錄的滑鼠位置,我們可以知道滑鼠移動的距離,這段距離就是左側滑條的寬度。
const mouseMoveHandler = function (e) { // 滑鼠移動的距離 const dx = e.clientX - x; const dy = e.clientY - y; const containerWidth = knob.parentNode.getBoundingClientRect().width; let newLeftWidth = ((leftWidth + dx) * 100) / containerWidth; // 限制範圍在 0 - 100 newLeftWidth = Math.max(newLeftWidth, 0); newLeftWidth = Math.min(newLeftWidth, 100); leftSide.style.width = `${newLeftWidth}%`; };
當滑動行為結束,也就是鬆開滑鼠的時候,我們還需要移除掉 document 元素上的監聽事件,防止重複監聽導致的問題。
// 當鬆開滑鼠時觸發 const mouseUpHandler = function () { // ... // 移除事件 document.removeEventListener('mousemove', mouseMoveHandler); document.removeEventListener('mouseup', mouseUpHandler); };
<div style="display: flex; justify-content: center; padding: 4rem"> <div style="width: 16rem" class="container"> <div class="left"></div> <div class="knob" id="knob"></div> <div class="right"></div> </div> </div>
以上就是自定義range sliders滾軸實現元素拖動方法的詳細內容,更多關於range sliders滾軸元素拖動的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45