今日頭條的,頂部導航,實現分析


想必大家都看過今日頭條吧,上面的頂部導航可以滾動,且沒有滾動條,是不是很爽啊。原生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,那里也有注釋。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM