自定義滾動條

在PC端,無論哪款瀏覽器提供的默認滾動條许赃,樣式都是很丑,無法滿足現(xiàn)在頁面設計的要求沟于,為此衍生出了無數(shù)的模擬滾動條的插件咳胃,這些插件可以使用CSS來美化滾動條

在PC端,無論哪款瀏覽器提供的默認滾動條旷太,樣式都是很丑展懈,無法滿足現(xiàn)在頁面設計的要求,為此衍生出了無數(shù)的模擬滾動條的插件供璧,這些插件可以使用CSS來美化滾動條存崖。當然,在實際的項目中睡毒,還有其他常見的場景来惧。

1. 無滾動條但依然可以滾動

實際內容超過了容器的高度,只能使用滾輪進行滾動吕嘀。這種情形下违寞,默認只能進行垂直滾動,不能進行上下滾動偶房。當然趁曼,如果要實現(xiàn)滾輪進行橫向滾動,這就需要借助js添加滾輪事件棕洋。這一小節(jié)里挡闰,我們只討論垂直滾動的情況。

其實實現(xiàn)無滾動條但依然可以滾動掰盘,不用任何的js就能實現(xiàn):比如.content是一個有滾動條的容器摄悯,他的高度和寬度分別是width:400px; height:300px;,我們可以在.content外面再添加一個div(.wrap)愧捕,讓這個div的寬度正好遮住 .content 的滾動條:

<style type="text/css">
    .wrap{
        width: 400px;
        height: 300px;
        overflow: hidden;  /* 遮住滾動條 */
        border: 1px solid #aaa;
    }
    .content{
        width: 417px; /* 一般滾動條的寬度差不多是17px */
        height: 300px;
        overflow: auto;
    }
</style>
<div class="wrap">
    <div class="content">
        <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. </p>
        <p>Curabitur rhoncus tortor eget orci fringilla non semper magna aliquet. Aliquam convallis elit sem. Proin fringilla fermentum pretium. Phasellus id nisl eu eros convallis eleifend.</p>
        <p>In hac habitasse platea dictumst. In at felis massa. Maecenas vitae quam non elit porta pellentesque ac in erat. Nullam a ante felis, ullamcorper suscipit felis. Maecenas sit amet nisl mattis ipsum ullamcorper aliquam vitae sed sapien. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.</p>
        <p>Sed sed tellus dolor, non lobortis felis. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. In eget nisl viverra risus feugiat vulputate tempus et leo. </p>
        <p>Nam metus nibh, tristique non sodales non, interdum et neque. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed imperdiet aliquet vestibulum. Curabitur viverra tortor augue, a aliquet tellus. Vivamus eu felis vel lorem tincidunt imperdiet. Fusce iaculis luctus convallis.</p>
        <p> Proin adipiscing malesuada enim, et feugiat tortor sagittis eu. Cras convallis felis eu leo tempus et fermentum urna accumsan. In quis metus at metus ultricies fringilla. Maecenas sed lacus aliquam nibh semper dignissim et quis est.</p>
    </div>
</div>

這種方式?jīng)]有兼容性問題奢驯,在任何瀏覽器都可以,技術上實現(xiàn)起來也很簡單次绘;唯一的缺點就是用戶對滾動不太敏感瘪阁,可能不知道需要滾動才能查看下面的內容。

  1. 美化后的滾動條
    這種情形下邮偎,需要的是瀏覽器自帶的滾動條管跺,依然不需要借助js,只不過需要對滾動條進行美化禾进;但是滾動條的美化是有瀏覽器兼容性的豁跑,只有webkit內核的瀏覽器(chrome, opera, safari等)才支持,firefox到目前位置還不支持滾動條美化泻云,IE瀏覽器只支持修改滾動條的顏色艇拍,其他的則無法修改。

我們先來看看webkit下滾動條的美化宠纯,webkit下是使用的偽元素:

/* 設置垂直滾動條的寬度和水平滾動條的高度 */
.demo::-webkit-scrollbar{
    width: 8px;
    height: 8px;
}

/* 設置滾動條的滑軌 */
.demo::-webkit-scrollbar-track {
      background-color: #ddd;
}

/* 滑塊 */
.demo::-webkit-scrollbar-thumb {
    background-color: rgba(0, 0, 0, 0.6);
    border-radius: 4px;
}

 /* 滑軌兩頭的監(jiān)聽按鈕 */
.demo::-webkit-scrollbar-button {
    background-color: #888;
    display: none;
}

/* 橫向滾動條和縱向滾動條相交處尖角 */
.demo::-webkit-scrollbar-corner {
    /*background-color: black;*/
}

看了上面美化滾動條的屬性淑倾,如果不考慮兼容性的問題,我們還可以使用-webkit-scrollbar來隱藏滾動條征椒,不用再在外面套一個div了娇哆,而且依然可以滾動。

IE瀏覽器下滾動條下勃救,使用樣式進行美化碍讨,而且只能修改顏色:

  • scrollbar-arrow-color: color; /三角箭頭的顏色/

  • scrollbar-face-color: color; /立體滾動條的顏色(包括箭頭部分的背景色)/

  • scrollbar-3dlight-color: color; /立體滾動條亮邊的顏色/

  • scrollbar-highlight-color: color; /滾動條的高亮顏色(左陰影?)/

  • scrollbar-shadow-color: color; /立體滾動條陰影的顏色/

  • scrollbar-darkshadow-color: color; /立體滾動條外陰影的顏色/

  • scrollbar-track-color: color; /立體滾動條背景顏色/

  • scrollbar-base-color:color; /滾動條的基色/

當前樣式只在IE下有效果:

3. 自定義滾動條

自定義滾動條借助js里的滾輪事件蒙秒,mousemove事件等勃黍,使用div來模擬一個滾動條,然后根據(jù)位移晕讲,滾動條和內容移動相應的距離覆获。

這里需要先定義幾個簡單的變量:

  • wrap_height : 外層容器的高度

  • content_height : 內容的實際高度马澈,通常大于外層容器的高度

  • content_dis : 內容當前的位置

  • bar_height : 滾動條的長度

  • bar_dis : 滾動條當前的位置

滾動條與其滾動區(qū)域的比例和外層容器與實際內容的比例是相等的,這樣就能計算出滾動條的長度弄息,即:

bar_height/wrap_height = wrap_height/content_height;

bar_height = wrap_height*wrap_height/content_height;  // 滾動條的長度

同理痊班,滾動條滾動的距離與內容滾動的距離也是成比例的,因為我們實際操作的是滾動條摹量,通過這個我們能知道滾動條滾動的距離后涤伐,得出內容滾動的距離:

bar_dis/(wrap_height-bar_height) = content_dis/(content_height-wrap_height);

content_dis = (content_height-wrap_height)*bar_dis/(wrap_height-bar_height); 

滾動條和內容的滾動,實際上是修改這兩者的top值缨称。接下來就是為滾動條添加mousedown, mousemove, mouseup事件凝果,通過這些事件修改滾動條的top值。在鼠標按下(mousedown)時睦尽,獲取鼠標當前的pageY1(IE不支持pageX器净、pageY屬性,但支持offsetX当凡、offsetY)和滾動條的top值掌动,然后在鼠標移動(mousemove)時,再獲取鼠標的pageY2(offsetY)宁玫,根據(jù)兩個pageY粗恢,計算出鼠標的偏移量(pageY2-pageY1),即滾動條的偏移量bar_diff欧瘪。bar_diff加上滾動條初始時的top值眷射,就是滾動條現(xiàn)在的top值。根據(jù)上面的公式也能計算出內容的偏移量佛掖。

$scroll_bar.css('height', scroll_bar_height)
    .on('mousedown', function(event){
        var $this = $(this),
            startX = event.pageY,
            top = $this.position().top;

        $(document).on('mousemove', function(e){
            var diff = e.pageY - startX;
            changePos( top+diff );
        }).on('mouseup', function(event){
            $(this).off('mousemove mouseup');
            this.releaseCapture && this.releaseCapture();
        });

        this.setCapture && this.setCapture();
    });

// 設置滾動條和內容的top值
// end表示滾動條當前滾動到的位置
function changePos(end){
    if(end < 0){
        end = 0;
    }else if(end > obj_height - scroll_bar_height){
        end = obj_height - scroll_bar_height;
    }

    $scroll_bar.css('top', end);
    $scroll_con.css('top', -(scroll_con_height - obj_height)*end/(obj_height - scroll_bar_height));
}

如果容器的高度可能隨著窗口變化妖碉,或者其他原因導致容器的高度發(fā)生變化,都需要重新計算滾動條的長度和能夠滾動的區(qū)域芥被。

張鑫旭大神在他自己的博客里曾經(jīng)總結過關于滾輪的事件欧宜,這里拿來一下,相關鏈接請下拉到最后:

var addEvent = (function(window, undefined) {        
    var _eventCompat = function(event) {
        var type = event.type;
        if (type == 'DOMMouseScroll' || type == 'mousewheel') {
            event.delta = (event.wheelDelta) ? event.wheelDelta / 120 : -(event.detail || 0) / 3;
        }
        //alert(event.delta);
        if (event.srcElement && !event.target) {
            event.target = event.srcElement;    
        }
        if (!event.preventDefault && event.returnValue !== undefined) {
            event.preventDefault = function() {
                event.returnValue = false;
            };
        }
        /* 
           ......其他一些兼容性處理 */
        return event;
    };
    if (window.addEventListener) {
        return function(el, type, fn, capture) {
            if (type === "mousewheel" && document.mozHidden !== undefined) {
                type = "DOMMouseScroll";
            }
            el.addEventListener(type, function(event) {
                fn.call(this, _eventCompat(event));
            }, capture || false);
        }
    } else if (window.attachEvent) {
        return function(el, type, fn, capture) {
            el.attachEvent("on" + type, function(event) {
                event = event || window.event;
                fn.call(el, _eventCompat(event));    
            });
        }
    }
    return function() {};
})(window); 
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末拴魄,一起剝皮案震驚了整個濱河市冗茸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌匹中,老刑警劉巖夏漱,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異顶捷,居然都是意外死亡挂绰,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門服赎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來葵蒂,“玉大人交播,你說我怎么就攤上這事〖叮” “怎么了秦士?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長荔仁。 經(jīng)常有香客問我,道長芽死,這世上最難降的妖魔是什么乏梁? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮关贵,結果婚禮上遇骑,老公的妹妹穿的比我還像新娘。我一直安慰自己揖曾,他們只是感情好落萎,可當我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著炭剪,像睡著了一般练链。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上奴拦,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天媒鼓,我揣著相機與錄音,去河邊找鬼错妖。 笑死绿鸣,一個胖子當著我的面吹牛,可吹牛的內容都是我干的暂氯。 我是一名探鬼主播潮模,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼痴施!你這毒婦竟也來了擎厢?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤辣吃,失蹤者是張志新(化名)和其女友劉穎锉矢,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體齿尽,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡沽损,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片漓摩。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡蝌戒,死狀恐怖吴汪,靈堂內的尸體忽然破棺而出吕朵,到底是詐尸還是另有隱情拂蝎,我是刑警寧澤乞榨,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布藕赞,位于F島的核電站缝左,受9級特大地震影響亿遂,放射性物質發(fā)生泄漏。R本人自食惡果不足惜渺杉,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一蛇数、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧是越,春花似錦耳舅、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至天梧,卻和暖如春盔性,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背呢岗。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工纯出, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人敷燎。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓暂筝,卻偏偏與公主長得像,于是被迫代替她去往敵國和親硬贯。 傳聞我的和親對象是個殘疾皇子焕襟,可洞房花燭夜當晚...
    茶點故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內容

  • 現(xiàn)在正在重構一個已經(jīng)有的后管項目,今天看到這個滾動條實在是有點丑饭豹,想給換一下鸵赖。實話說自己并不是一個很有經(jīng)驗的前端開...
    蚊子爸爸閱讀 2,116評論 2 12
  • 哪些地方會出現(xiàn)滾動條 滾動條通常會出現(xiàn)在這些地方 1、iframe 2拄衰、任何元素的設置成塊元素它褪,overflow設...
    超愛吃小龍蝦閱讀 994評論 0 2
  • IE瀏覽器css設置滾動條(看下表): chrome
    韓小強閱讀 930評論 0 1
  • 原文地址:→傳送門 寫在前面 滾動條是個很常見的東東,不過某些瀏覽器自帶的滾動條確實不太好看啊翘悉,下面可以作為學習茫打,...
    樓心漫閱讀 39,277評論 5 31
  • ::-webkit-scrollbar 滾動條整體部分,其中的屬性有width,height,background...
    而生lhw閱讀 570評論 0 0