亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > CSS > 正文

詳解如何用div實現自制滾動條

2024-07-11 08:59:07
字體:
來源:轉載
供稿:網友

滾動條是瀏覽器中最常見的組件了。然而,滾動條的顏值總是不能令人滿意,特別是嵌入在頁面中的滾動條:

漂亮的網頁突然出現一根灰灰的滾動條真是太煞風景了。雖然瀏覽器也提供了一些偽類能改善滾動條的外觀,但改善程度也是有限。為什么不自己用 div 實現一根萌萌的滾動條呢,比如這根:

貪吃蛇滾動條

今天就來講講如何用 div 自己實現滾動條。

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時不增加元素本身高度,避免出現滾動條    overflow-y: hidden; // 隱藏瀏覽器本身的滾動條    position: relative;    padding-right: 30px; // 給自制滾動條留點空間,不要其他內容重合了}.scrollbar {    height: 166px;    width: 20px;    border-radius: 20px;    background: #ccc;    position: absolute; // 絕對定位,方便設置滾動條位置    right: 0; // 設置滾動條在最右邊}

一個簡易的滾動條就有了:

雖然比瀏覽器默認的滾動條好不到哪兒去,不過你可以自由發揮,把GIF動圖作為滾動條也是可以的。由于滾動條是 absolute 定位的,后面就通過 top 屬性來控制滾動條的位置。

現在滾動條還是靜態的,想要讓他動起來,就要先了解下滾動條與文檔滾動的關系。

2. 滾動條與文檔滾動的關系

先看這張圖

藍色框代表一個很長的文檔,文檔的高度可以通過 scrollHeight 屬性獲得。

屏幕一下子顯示不了那么多內容,只能顯示紅色區域部分,紅色區域就稱為”視口“(Viewport),視口的高度可以通過 offsetHeight 屬性獲得。

頁面剛加載時,視口的頂部和文檔頂部是重合的,滾動條(綠色豎條)也在最頂部。當我們將滾動條下拉時,文檔的內容在向上滾動,其實是視口在向下移動:

視口向下移動后,與文檔頂部就有了個偏移,這個偏移可以通過 scrollTop 獲得。視口下移的同時,滾動條與頂部也有一段距離了,暫且用 h 表示。

視口里文檔頂部的最大距離可以是多少?根據圖可以看出是 scrollHeight - offsetHeight;類似地,滾動條最大可以滾動的距離是 offsetHeight - barHeight,其中 barHeight 是滾動條本身的高度。

看到這里你是否有些明白了,滾動條滾動的距離,與文檔視口離開頂部的距離是成一定比例的。滾動條滑動多少距離,文檔視口就按比例滑動多少距離。而這個比例值就等于:

ratio = (scrollHeight - offsetHeight) / (offsetHeight - barHeight)

假設文檔總長 5000px,視口高度1080px,滾動條滑塊高 40px,那么根據公式計算出比例值是 3.77。也就是說,滾動條每滾動 1px,視口就要下移 3.77px

利用這個比例值,我們就可以讓滾動條和視口等比例地進行滑動了。

3. 通過JavaScript控制滾動條

在自制的滾動條中,滾動通過兩種事件觸發,我們需要自己處理事件:

  1. 鼠標滾輪滾動時,更新視口位置,同時按比例更新滾動條的位置
  2. 鼠標拖拽滾動條時,更新滾動條位置,同時按比例更新視口位置

3.1 鼠標滾輪事件

鼠標滾輪滾動時,會觸發 mousewheel 事件,此時需要根據滾動增量(e.deltaY)更新視口位置,在根據新的視口位置推算出滾動條的位置。代碼:

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>

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩精品一区二区三区第95| 成人精品久久久| 日韩美女在线观看一区| 中文字幕在线看视频国产欧美在线看完整| 欧美视频在线看| 国产精品国产亚洲伊人久久| 一区二区三区天堂av| 亚洲一区二区三区视频播放| 久久深夜福利免费观看| 亚洲国产成人在线视频| 91精品在线看| 色一情一乱一区二区| 成人在线视频福利| 久久精品美女视频网站| 中文字幕精品一区久久久久| 国产激情999| 欧美日韩一区二区在线播放| 青草青草久热精品视频在线观看| 俺去了亚洲欧美日韩| 亚洲精品白浆高清久久久久久| 青青草一区二区| 日本19禁啪啪免费观看www| 992tv成人免费视频| 日韩成人在线免费观看| 韩剧1988免费观看全集| www.欧美精品一二三区| 国产精品自拍偷拍| 亚洲精品自拍第一页| 久久香蕉国产线看观看网| 国产91精品青草社区| 亚洲精品短视频| 中文字幕一区二区三区电影| 91高潮精品免费porn| 亚洲国产精品久久久久久| 成人有码视频在线播放| 久久影视电视剧凤归四时歌| 久久夜色精品亚洲噜噜国产mv| 国产精品第10页| 国内精品久久久久久中文字幕| 欧美激情在线有限公司| 成人观看高清在线观看免费| 日韩在线中文视频| 久久青草福利网站| 欧美精品午夜视频| 91久久精品一区| 在线观看国产精品日韩av| 国产精品一区专区欧美日韩| 91精品国产高清久久久久久| 久久综合久久88| 日韩精品欧美国产精品忘忧草| 亚洲最新中文字幕| 97碰碰碰免费色视频| 欧美久久精品一级黑人c片| 欧美性猛交xxxx富婆| 中文字幕日韩精品有码视频| 日本成人黄色片| 国产精品青青在线观看爽香蕉| 亚洲欧美综合另类中字| 91九色国产视频| 欧美午夜精品久久久久久人妖| 国产精品视频免费在线观看| 国自在线精品视频| 久久综合网hezyo| 97视频色精品| 久久6精品影院| 91九色国产视频| 性色av一区二区三区免费| 国产精品免费久久久久影院| 亚洲欧美一区二区激情| 成人av在线亚洲| 久久国产天堂福利天堂| 国产一区二区三区视频免费| 红桃视频成人在线观看| 国产精品亚洲美女av网站| 欧美激情在线观看| 国产精品视频区1| 久久久久成人网| 亚洲自拍偷拍在线| 亚洲精品日韩激情在线电影| 国产精品一二区| 欧美大片网站在线观看| 国产美女高潮久久白浆| 国产日韩欧美在线看| 欧美国产精品va在线观看| 久久久久在线观看| 久久国产加勒比精品无码| 中文字幕日韩av| 亚洲人成网站免费播放| 欧美日产国产成人免费图片| 亚洲成人av在线播放| 久久99热这里只有精品国产| 日韩大陆欧美高清视频区| 法国裸体一区二区| 国产精品女人久久久久久| 日韩av电影国产| 一区二区三区 在线观看视| 亚洲人成网站在线播| 777国产偷窥盗摄精品视频| 青青草一区二区| 国产精品香蕉av| 成人午夜黄色影院| 精品亚洲一区二区三区在线观看| 亚洲少妇激情视频| 日韩久久精品成人| 国产精品极品美女粉嫩高清在线| 亚洲一区中文字幕| 成人xxxx视频| 九九热最新视频//这里只有精品| 国产区亚洲区欧美区| 亚洲天堂免费在线| 午夜免费久久久久| 7777免费精品视频| 久久久久久国产免费| 国产成人精品电影久久久| 欧美另类精品xxxx孕妇| 一区二区在线视频播放| 欧美午夜精品久久久久久浪潮| 欧美日产国产成人免费图片| 91成人福利在线| 亚洲激情电影中文字幕| 欧美电影免费观看电视剧大全| 国内自拍欧美激情| 日本一区二区在线播放| 精品中文视频在线| 91人人爽人人爽人人精88v| 久久精品99久久香蕉国产色戒| 国产成人91久久精品| 国产综合视频在线观看| 久久人人爽亚洲精品天堂| 亚洲欧美日韩国产精品| 日韩成人中文字幕在线观看| 国产欧美日韩中文字幕在线| 97国产精品久久| 大伊人狠狠躁夜夜躁av一区| 性欧美办公室18xxxxhd| 国a精品视频大全| 日韩av免费看网站| 欧美激情第99页| 亚洲午夜精品视频| 大伊人狠狠躁夜夜躁av一区| 午夜精品三级视频福利| 亚洲高清免费观看高清完整版| 日韩av电影手机在线观看| 国产丝袜精品视频| 国产suv精品一区二区| 久久99国产综合精品女同| 欧美一级大片在线免费观看| 97香蕉久久夜色精品国产| 在线观看免费高清视频97| 成人午夜小视频| 国产精品白丝jk喷水视频一区| 亚洲最大成人在线| 欧美电影免费看| 久久久精品久久久久| 欧美日韩色婷婷| 日韩亚洲在线观看| 欧美中文字幕在线播放| 欧美日韩激情小视频| 国产69精品久久久久9| 久久精品视频播放| 国产精品揄拍一区二区| 亚洲国模精品一区| 91精品久久久久久久久久另类| 亚洲精品999|