這篇文章將為大家詳細講解有關怎么使用div實現(xiàn)自制滾動條,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
創(chuàng)新互聯(lián)自2013年起,是專業(yè)互聯(lián)網(wǎng)技術服務公司,擁有項目成都網(wǎng)站制作、成都網(wǎng)站建設網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元太湖做網(wǎng)站,已為上家服務,為太湖各地企業(yè)和個人服務,聯(lián)系電話:18982081108滾動條是瀏覽器中最常見的組件了。然而,滾動條的顏值總是不能令人滿意,特別是嵌入在頁面中的滾動條:
漂亮的網(wǎng)頁突然出現(xiàn)一根灰灰的滾動條真是太煞風景了。雖然瀏覽器也提供了一些偽類能改善滾動條的外觀,但改善程度也是有限。為什么不自己用 div 實現(xiàn)一根萌萌的滾動條呢,比如這根:
貪吃蛇滾動條
今天就來講講如何用 div 自己實現(xiàn)滾動條。
1. 先得有滾動條
在開始之前,我們要先隱藏瀏覽器本身的滾動條,加上自制的滾動條
<body> <div id="container"> <div class="scrollbar"></div> bla bla bla ... 一大段一屏顯示不下的內容 </div> </body>
我們在需要滾動條的 div 中增加了一個 class="scroll" 的 div 代表滾動條,給這個 div 來點樣式:
html, body, #container { height: 100%; margin: 0; } #container { padding: 2rem; box-sizing: border-box; // 為了設置padding時不增加元素本身高度,避免出現(xiàn)滾動條 overflow-y: hidden; // 隱藏瀏覽器本身的滾動條 position: relative; padding-right: 30px; // 給自制滾動條留點空間,不要其他內容重合了 } .scrollbar { height: 166px; width: 20px; border-radius: 20px; background: #ccc; position: absolute; // 絕對定位,方便設置滾動條位置 right: 0; // 設置滾動條在最右邊 }
一個簡易的滾動條就有了:
雖然比瀏覽器默認的滾動條好不到哪兒去,不過你可以自由發(fā)揮,把GIF動圖作為滾動條也是可以的。由于滾動條是 absolute 定位的,后面就通過 top 屬性來控制滾動條的位置。
現(xiàn)在滾動條還是靜態(tài)的,想要讓他動起來,就要先了解下滾動條與文檔滾動的關系。
2. 滾動條與文檔滾動的關系
先看這張圖
藍色框代表一個很長的文檔,文檔的高度可以通過 scrollHeight 屬性獲得。
屏幕一下子顯示不了那么多內容,只能顯示紅色區(qū)域部分,紅色區(qū)域就稱為”視口“(Viewport),視口的高度可以通過 offsetHeight 屬性獲得。
頁面剛加載時,視口的頂部和文檔頂部是重合的,滾動條(綠色豎條)也在最頂部。當我們將滾動條下拉時,文檔的內容在向上滾動,其實是視口在向下移動:
視口向下移動后,與文檔頂部就有了個偏移,這個偏移可以通過 scrollTop 獲得。視口下移的同時,滾動條與頂部也有一段距離了,暫且用 h 表示。
視口里文檔頂部的較大距離可以是多少?根據(jù)圖可以看出是 scrollHeight - offsetHeight;類似地,滾動條較大可以滾動的距離是 offsetHeight - barHeight,其中 barHeight 是滾動條本身的高度。
看到這里你是否有些明白了,滾動條滾動的距離,與文檔視口離開頂部的距離是成一定比例的。滾動條滑動多少距離,文檔視口就按比例滑動多少距離。而這個比例值就等于:
ratio = (scrollHeight - offsetHeight) / (offsetHeight - barHeight)
假設文檔總長 5000px,視口高度1080px,滾動條滑塊高 40px,那么根據(jù)公式計算出比例值是 3.77。也就是說,滾動條每滾動 1px,視口就要下移 3.77px
利用這個比例值,我們就可以讓滾動條和視口等比例地進行滑動了。
3. 通過JavaScript控制滾動條
在自制的滾動條中,滾動通過兩種事件觸發(fā),我們需要自己處理事件:
鼠標滾輪滾動時,更新視口位置,同時按比例更新滾動條的位置
鼠標拖拽滾動條時,更新滾動條位置,同時按比例更新視口位置
3.1 鼠標滾輪事件
鼠標滾輪滾動時,會觸發(fā) mousewheel 事件,此時需要根據(jù)滾動增量(e.deltaY)更新視口位置,在根據(jù)新的視口位置推算出滾動條的位置。代碼:
container.addEventListener('mousewheel', function(e) { this.scrollTop += e.deltaY; this.scrollbar.style.top = (this.scrollTop + this.scrollTop / this.ratio) + 'px'; });
可以看到,滾動條的 top 值就是當前視口的偏移(scrollTop)加上這個偏移的按比例縮小。
3.2 鼠標拖拽事件
JavaScript 原生沒有拖拽事件,需要用左鍵點下(mousedown),鼠標移動(mousemove),左鍵放開(mouseup)三個事件配合模擬出拖拽效果:
container.addEventListener('mousedown', function (e) { if (e.target === this.scrollbar) { this.prevY = e.pageY; } }); container.addEventListener('mouseup', function (e) { this.prevY = null; }); container.addEventListener('mousemove', function (e) { if (this.prevY) { // 此時可以確定用戶在表示拖拽 } e.preventDefault(); });
上面的代碼在處理 mousemove 事件時使用 e.preventDefault() 阻止瀏覽器默認動作,您可以自行嘗試加上和不加這行的效果。接著上面的代碼,我們處理拖拽動作:
if (this.prevY) { // 此時可以確定用戶在表示拖拽 this.scrollTop += (e.pageY - this.prevY) * this.ratio; this.scrollbar.style.top = (this.scrollTop + this.scrollTop / this.ratio) + 'px'; this.prevY = e.pageY; }
與滾輪滾動不同,JavaScript沒有給出每次拖拽的移動增量,需要自己計算,并每次存儲上一次的鼠標位置。
至此一個可用的自制滾動條就完成了。
完整代碼
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <style> html, body, #container { height: 100%; margin: 0; } #container { padding: 2rem; box-sizing: border-box; overflow-y: hidden; position: relative; padding-right: 30px; } .scrollbar { height: 166px; width: 20px; border-radius: 20px; background: #ccc; position: absolute; right: 0; } </style> <script> window.onload = function () { var scrollbar = document.querySelector('.scrollbar'); var container = scrollbar.parentNode; container.scrollbar = scrollbar; container.ratio = (container.scrollHeight - container.offsetHeight) / (container.offsetHeight - scrollbar.offsetHeight); container.addEventListener('mousewheel', function(e) { this.scrollTop += e.deltaY; this.scrollbar.style.top = (this.scrollTop + this.scrollTop / this.ratio) + 'px'; }); container.addEventListener('mousedown', function (e) { if (e.target === this.scrollbar) { this.prevY = e.pageY; } }); container.addEventListener('mouseup', function (e) { this.prevY = null; }); container.addEventListener('mousemove', function (e) { if (this.prevY) { this.scrollTop += (e.pageY - this.prevY) * this.ratio; this.scrollbar.style.top = (this.scrollTop + this.scrollTop / this.ratio) + 'px'; this.prevY = e.pageY; } e.preventDefault(); }); } </script> </head> <body> <div id="container"> <div class="scrollbar"></div> bla, bla, bla... 一大段很長的文字 </div> </body> </html>
關于“怎么使用div實現(xiàn)自制滾動條”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
文章名稱:怎么使用div實現(xiàn)自制滾動條-創(chuàng)新互聯(lián)
URL分享:http://muchs.cn/article38/cdsspp.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供商城網(wǎng)站、網(wǎng)站維護、微信公眾號、網(wǎng)站設計公司、外貿網(wǎng)站建設、用戶體驗
聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)