想必大家都看過今日頭條吧,上面的頂部導航可以滾動,且沒有滾動條,是不是很爽啊。原生app端我不管,我們今天來分析一下web app是怎么實現的,希望對大家有幫助。
1.先上圖
看到沒有這是在ipad下的效果,下面的菜單可以橫向滾動,且沒有滾動條。我上次在做移動web實現這個效果是用的js。今天我就用css就可以完成。超級簡單,只需要幾步就OK了。
2.貼個源碼然后我來分析
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no"> <meta name="format-detection" content="telephone=no"> <title>無標題文檔</title> <style> .a{ width:100%; background-color:#f0a; overflow: hidden;overflow-x: scroll; background-color:#0CF;} .a::-webkit-scrollbar {display: none;} .b{ width:100%; white-space:nowrap;} span{ display:inline-block; height:30px; width:300px; background:#999;} </style> </head> <body> <div class="a"> <div class="b"> <span>asdf</span> <span>asdf</span> <span>asdf</span> <span>asdf</span> <span>asdf</span> </div> </div> </body> </html>
3.分析
代碼結構很簡單我就不多說了結構了。
這里有幾點要注意。
第一,最外層的div設置固定寬度,第二,設置overflow:hidden;overflow-x:scroll;這樣里面的div超過了就可以橫向滾動了。第三步,去掉滾動條
::-webkit-scrollbar {display: none;}偽類。OK了。就三步是不是很簡單。
這里我控制里面的div沒設置寬度,是用了white-space:nowrap;這樣就讓它不換行了寬度自然就撐起來了,你也可以采用其他方式設置。
4.補充知識
webkit現在支持擁有overflow屬性的區域,列表框,下拉菜單,textarea的滾動條自定義樣式。
如果你想跳過介紹,直接看demo的話,請點擊demo
滾動條是一個偽元素,可以自定義樣式。這個偽類可以將webkit自身的滾動條渲染關閉,只按照用戶自定義的css信息進行渲染。比如:
::-webkit-scrollbar {
width: 13px;
height: 13px;
}
width和height屬性分別表示縱向滾動條的寬度和橫向滾動條的高。也可以指定為%百分比,在在這種情況下就代表了,滾動條占整個視窗的百分比,如:
::-webkit-scrollbar {
width: 50%;
}
滾動條包括:滾動按鈕和一個軌道。軌道本身有進一步氛圍軌道碎片(track pieces)和一個滑塊。軌道碎片值滑塊上方和下面的區域。滾動條的角合適被設置為各種風格,比如可以調整文本區域的大小。
下面是關於滾動條的所有偽元素:
::-webkit-scrollbar{/*1*/}
::-webkit-scrollbar-button{/*2*/}
::-webkit-scrollbar-track{/*3*/}
::-webkit-scrollbar-track-piece{/*4*/}
::-webkit-scrollbar-thumb{/*5*/}
::-webkit-scrollbar-corner{/*6*/}
::-webkit-resizer{/*7*/}
任何對象都可以設置:邊框、陰影、背景圖片等等,創建的滾動條任然會按照操作系統本身的設置來完成其交互的行為。下面的偽類可以應用到上面的偽元素中。
:horizontal(horizontal偽類適用於任何水平方向上的滾動條)
:vertical(vertical偽類適用於任何垂直方向的滾動條)
:decrement(decrement偽類適用於按鈕和軌道碎片。表示遞減的按鈕或軌道碎片,例如可以使區域向上或者向右移動的區域和按鈕)
:increment(increment偽類適用於按鈕和軌道碎片。表示遞增的按鈕或軌道碎片,例如可以使區域向下或者向左移動的區域和按鈕)
:start(start偽類適用於按鈕和軌道碎片。表示對象(按鈕 軌道碎片)是否放在滑塊的前面)
:end(end偽類適用於按鈕和軌道碎片。表示對象(按鈕 軌道碎片)是否放在滑塊的后面)
:double-button(double-button偽類適用於按鈕和軌道碎片。判斷軌道結束的位置是否是一對按鈕。也就是軌道碎片緊挨着一對在一起的按鈕。)
:single-button(single-button偽類適用於按鈕和軌道碎片。判斷軌道結束的位置是否是一個按鈕。也就是軌道碎片緊挨着一個單獨的按鈕。)
:no-button(no-button偽類表示軌道結束的位置沒有按鈕。)
:corner-present(corner-present偽類表示滾動條的角落是否存在。)
:window-inactive(適用於所有滾動條,表示包含滾動條的區域,焦點不在該窗口的時候。)
::-webkit-scrollbar-track-piece:start {
/*滾動條上半邊或左半邊*/
}
::-webkit-scrollbar-thumb:window-inactive {
/*當焦點不在當前區域滑塊的狀態*/
}
::-webkit-scrollbar-button:horizontal:decrement:hover {
/*當鼠標在水平滾動條下面的按鈕上的狀態*/
}
webkit支持擁有overflow屬性的區域,列表框,下拉菜單,textarea的滾動條自定義樣式,所以用處還是挺大的。當然,兼容所有瀏覽器的滾動條樣式目前是不存在的。
演示
來看看這2個滾動條demo: demo1(圖片版)、demo2(純CSS3版)
滾動條組成
- ::-webkit-scrollbar 滾動條整體部分
- ::-webkit-scrollbar-thumb 滾動條里面的小方塊,能向上向下移動(或往左往右移動,取決於是垂直滾動條還是水平滾動條)
- ::-webkit-scrollbar-track 滾動條的軌道(里面裝有Thumb)
- ::-webkit-scrollbar-button 滾動條的軌道的兩端按鈕,允許通過點擊微調小方塊的位置。
- ::-webkit-scrollbar-track-piece 內層軌道,滾動條中間部分(除去)
- ::-webkit-scrollbar-corner 邊角,即兩個滾動條的交匯處
- ::-webkit-resizer 兩個滾動條的交匯處上用於通過拖動調整元素大小的小控件
簡潔版
這里就不貼出詳細代碼了,demo里面可以通過查看源碼尋找具體樣式的設置。來看看demo2中第二個滾動條的樣式
詳細設置
定義滾動條就是利用偽元素與偽類,那什么是偽元素和偽類呢?
偽類大家應該很熟悉:link,:focus,:hover,此外CSS3中又增加了許多偽類選擇器,如:nth-child,:last-child,:nth-last-of-type()等。
CSS中的偽元素大家以前看過::first-line,:first-letter,:before,:after。那么在CSS3中,偽元素進行了調整,在以前的基礎上增加了一個“:”也就是現在變成了“::first-letter,::first-line,::before,::after”,另外CSS3還增加了一個“::selection”。兩個“::”和一個“:”在css3中主要用來區分偽類和偽元素。
webkit的偽類和偽元素的實現很強,可以把滾動條當成一個頁面元素來定義,再結合一些高級的CSS3屬性,比如漸變、圓角、RGBa等等。然后如果有些地方要用圖片,可以把圖片也可以轉換成Base64,不然每次都得加載那個多個圖片,增加請求數。
任何對象都可以設置:邊框、陰影、背景圖片等等,創建的滾動條任然會按照操作系統本身的設置來完成其交互的行為。下面的偽類可以應用到上面的偽元素中。有點小復雜,具體怎么寫可以看第一個demo,那里也有注釋。