CSS 計(jì)數(shù)器

前言

前端頁(yè)面上的計(jì)數(shù)排列一般比較常見(jiàn)的結(jié)構(gòu)就兩種:


圖片左邊的結(jié)構(gòu)是一個(gè)導(dǎo)航目錄寇仓,圖片右邊的結(jié)構(gòu)一般可作為電商幻燈片的導(dǎo)航举户。在 HTML 層面我們實(shí)現(xiàn)這種效果一般使用 ulol。當(dāng)然你也可以使用別的標(biāo)簽來(lái)實(shí)現(xiàn)遍烦。HTML 的 ulol 作為序列使用是非常好用的俭嘁,唯一的遺憾就是序列號(hào)可用性比較差,雖然提供了 list-style-image服猪。要想使用 ol 來(lái)實(shí)現(xiàn)前面帶 1.1 的這種目錄結(jié)構(gòu)供填,還是比較難的。

這時(shí)候該是 css 計(jì)數(shù)器 counter 出場(chǎng)了罢猪。

API 介紹

css 計(jì)數(shù)器一共涉及近她,兩個(gè)屬性一個(gè)方法,如下:

  1. counter-reset
    功能是可以創(chuàng)建計(jì)數(shù)器即是給計(jì)數(shù)器命名的膳帕,也可以重置計(jì)數(shù)器粘捎。默認(rèn)是 0。
.xxx{counter-reset: name;}/*創(chuàng)建一個(gè)為name的計(jì)數(shù)器危彩,默認(rèn)從0開(kāi)始計(jì)數(shù)*/
.xxx{counter-reset: name 10;}/*創(chuàng)建一個(gè)為name的計(jì)數(shù)器攒磨,默認(rèn)從10開(kāi)始計(jì)數(shù)*/

多個(gè)計(jì)數(shù)器還可以這樣寫(xiě):

.xxx { counter-reset: name 1 name 2; }

另外,counter-reset 還可以設(shè)置為 none 和 inherit. 干掉重置以及繼承重置汤徽。

  1. counter-increment
    遞增/遞減變量娩缰,計(jì)數(shù)器的增量/減量,1 個(gè)或多個(gè)關(guān)鍵字谒府。后面如果跟隨數(shù)字拼坎,表示每次計(jì)數(shù)的變化值浮毯。如果缺省,則使用默認(rèn)增值 1泰鸡。
.xxx{counter-increment: name;}/*name計(jì)數(shù)器每次增加1*/
.xxx{counter-increment: name 10;}/*name計(jì)數(shù)器每次增加10*/
.xxx{counter-increment: name -10;}/*name計(jì)數(shù)器每次減少10遞減效果*/
  1. counter()/counters()
    將計(jì)數(shù)器的值添加到元素债蓝。計(jì)數(shù)的結(jié)果將通過(guò)counter()/counters()展示出來(lái)。
counter(name)/*把叫name的計(jì)數(shù)器展示出來(lái)鸟顺,格式為1惦蚊、2、3......*/

還有一種用法:

counter(name,style)

name 就是計(jì)數(shù)器的名字讯嫂,style 是什么?默認(rèn)遞增遞減是數(shù)字兆沙,style 就是用來(lái)自定義遞增遞減不是數(shù)字欧芽,例如可以是 a、b葛圃、c千扔。 其支持的關(guān)鍵字值和 list-style-type 支持的那些值相同。

list-style-type:disc | circle | square | decimal | lower-roman | upper-roman | lower-alpha | upper-alpha | none | armenian | cjk-ideographic | georgian | lower-greek | hebrew | hiragana | hiragana-iroha | katakana | katakana-iroha | lower-latin | upper-latin
一個(gè)content屬性值還可以有多個(gè)counter()方法库正。

一個(gè)簡(jiǎn)單的例子
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <style>
        html{
            background-color: #ffc9eb;
        }
        div{
            counter-reset: name;
        }
        p{
            counter-increment: name;
        }
        p::after{
            content: counter(name);
        }
    </style>
</head>
<body>
    <div>
        <p>section</p>
    </div>
</body>
</html>

看 section 后面是不是多了個(gè) 1曲楚?


代碼解析:

  1. 通過(guò) counter-reset 命名一個(gè)計(jì)數(shù)器叫 name,默認(rèn)重 0 開(kāi)始褥符。
  2. 計(jì)數(shù)器在 div 標(biāo)簽上龙誊,它會(huì)照耀所有的子孫,計(jì)數(shù)器的遞增在 p 標(biāo)簽上面默認(rèn)增量為 1喷楣,標(biāo)簽展示的時(shí)候只要通過(guò) p 就會(huì)增加 1趟大。
  3. 計(jì)數(shù)器的展示,通過(guò)偽元素 (before 和 after) 里面的 content 配合 counter 或 counters铣焊。

下面講一下最難得增量 counter-increment 逊朽,因其放的位置不同會(huì)引發(fā)不同的遞增遞減效果。

counter-increment 的位置

counter-increment 負(fù)責(zé)自增曲伊,只要其位置在 counter-reset 和 counter/counters 之間叽讳,展示時(shí)就會(huì)有增加的效果,計(jì)數(shù)器的解析規(guī)則和 HTML 的解析規(guī)則相同坟募。所以 counter-increment 達(dá)到增加一次的效果岛蚤,針對(duì)案例可以寫(xiě)的幾種方式為:


自增一次

第一種:寫(xiě)在計(jì)數(shù)器定義和展示的中間

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>CSS計(jì)數(shù)器</title>
    <style>
        html{
            background-color: pink;
        }
        .reset{
            counter-reset: name 9;
        }
        .increment{
            counter-increment: name;
        }
        p::after{
            content: counter(name);
        }
    </style>
</head>
<body>
    <div class="reset">
        <div class="increment">自增
            <p>我后面是一個(gè)</p>
        </div>
    </div>
</body>
</html>

第二種:寫(xiě)在計(jì)數(shù)器定義的位置

<style>
    html{
        background-color: pink;
    }
    .reset{
        counter-reset: name 9;
        counter-increment: name;
    }
    p::after{
        content: counter(name);
    }
</style>

第三種:寫(xiě)在計(jì)數(shù)器展示的位置

<style>
    html{
        background-color: pink;
    }
    .reset{
        counter-reset: name 9;
    }
    p::after{
        counter-increment: name;
        content: counter(name);
    }
</style>

猜猜下面 h1 標(biāo)簽的偽類應(yīng)該顯示什么?

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>CSS計(jì)數(shù)器</title>
    <style>
        html{
            background-color: pink;
        }
        .reset{
            counter-reset: name 10;
        }
        .increment{
            counter-increment: name 5;
        }
        h1::after,p::after{
            content: counter(name);
        }
    </style>
</head>
<body>
    <div class="reset">
        <div class="increment">自增
            <p>我后面是一個(gè)</p>
        </div>
        <h1>猜猜我的結(jié)果</h1>
    </div>
</body>
</html>
猜猜看

p 標(biāo)簽后面是 15婿屹,是沒(méi)有問(wèn)題的灭美,h1 后面也是 15。不知道你猜對(duì)了沒(méi)昂利?根據(jù) HTML 解析規(guī)則和計(jì)數(shù)器使用規(guī)則届腐,到 p 標(biāo)簽的時(shí)候是 15 铁坎,h1 顯示的又是相同的計(jì)數(shù)器,所以 h1 和 p 計(jì)數(shù)相等犁苏。

針對(duì)上面代碼硬萍,我們不動(dòng) HTML 里面的,只更改 CSS 里面的代碼围详,改成如下代碼所示朴乖,再次猜猜看:

<style>
    html{
        background-color: pink;
    }
    .reset{
        counter-reset: name 10;
        counter-increment: name 5;
    }
    .increment{
        counter-increment: name 5;
    }
    h1::after,p::after{
        counter-increment: name 5;
        content: counter(name);
    }
</style>

是不是很簡(jiǎn)單計(jì)數(shù)器的數(shù)值變化遵循 HTML 渲染順序,遇到一個(gè) increment 計(jì)數(shù)器就變化助赞,什么時(shí)候 counter 輸出就輸出此時(shí)的計(jì)數(shù)值买羞。

counters() 這個(gè)方法還是要說(shuō)下的。雖然和 counter 相比就多了個(gè)字母 s, 但兩者的功能還是有很大的不同雹食。counters 可以理解為嵌套計(jì)數(shù)畜普。

我們平時(shí)的序號(hào),不可能就只是1,2,3,4,.., 還會(huì)有諸如 1.1,1.2,1.3,...等的子序號(hào)群叶。前者就是counter()干的事情吃挑,后者就是counters()干的事情。

counters 的用法:

counters(name, string, style)

name 就是計(jì)數(shù)器的名字街立,string 表示子序號(hào)的連接字符串舶衬。例如 1.1string 就是'.', 1-1就是 '-'。style 與 counter() 的 style 參數(shù)使用一致赎离。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>CSS計(jì)數(shù)器</title>
    <style>
        html{
            background-color: pink;
        }
        .reset{
            counter-reset: name;
        }
        .item{
            text-indent: 2em;
        }
        .d2{
            text-indent: 4em;
        }
        .d3{
            text-indent: 6em;
        }
        .item::before{
            counter-increment: name;
            content:counters(name,"-")  '. ';
        }
    </style>
</head>
<body>
    <div class="reset">
        <div class="content">目錄</div>
        <div class="item">
            術(shù)語(yǔ)
            <div class="reset">
                <div class="item d2">docker client</div>
                <div class="item d2">docker host</div>
                <div class="item d2">docker daemon</div>
                <div class="item d2">container</div>
                <div class="item d2">registry</div>
            </div>
        </div>
        <div class="item">
            安裝 docker
            <div class="reset">
                <div class="item d2">
                    守護(hù)進(jìn)程配置
                </div>
            </div>
        </div>
        <div class="item">
            底層原理
            <div class="reset">
                <div class="item d2">
                    namespace
                    <div class="reset">
                        <div class="item d3">pid: 隔離進(jìn)程</div>
                        <div class="item d3">net: 隔離網(wǎng)絡(luò)</div>
                        <div class="item d3">ipc: 隔離 IPC</div>
                        <div class="item d3">mnt: 隔離文件系統(tǒng)掛載</div>
                        <div class="item d3">uts: 隔離hostname</div>
                        <div class="item d3">user: 隔離uid/gid</div>
                    </div>
                </div>
                <div class="item d2">control groups</div>
                <div class="item d2">union file system</div>
            </div>
        </div>
        <div class="item">
            鏡像
            <div class="reset">
                <div class="item d2">鏡像倉(cāng)庫(kù)與拉取</div>
                <div class="item d2">構(gòu)建鏡像與發(fā)布</div>
            </div>
        </div>
        <div class="item">
            Dockerfile
            <div class="reset">
                <div class="item d2">FROM</div>
                <div class="item d2">ADD</div>
                <div class="item d2">COPY</div>
                <div class="item d2">CMD</div>
                <div class="item d2">ENTRYPOINT</div>
            </div>          
        </div>
        <div class="item">
            容器
            <div class="reset">
                <div class="item d2">創(chuàng)建容器</div>
                <div class="item d2">容器管理</div>
            </div>              
        </div>
    </div>
</body>
</html>

代碼測(cè)試結(jié)果:


寫(xiě)給前端工程師的 docker 簡(jiǎn)易入門目錄

最后注意:

一個(gè)元素逛犹,如果設(shè)置了 counter-increment 屬性, 這個(gè)元素還設(shè)置了 display:none 或在標(biāo)簽上直接設(shè)置 hidden 屬性 (<span hidde></span>)計(jì)數(shù)在此元素上失效。

感興趣的還可以研究下下面這個(gè)案例蟹瘾,沒(méi)寫(xiě) JS 代碼但是是動(dòng)態(tài)的:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>CSS計(jì)數(shù)器</title>
    <style>
        body {
            counter-reset: icecream;
        }
        input:checked {
            counter-increment: icecream;
        }
        .total::after {
            content: counter(icecream);
        }
    </style>
</head>
<body>
    <strong>下面中國(guó)十大冰淇淋你吃過(guò)幾個(gè)圾浅?</strong>
    <ol>
        <li><input type="checkbox" id="icecream1"><label for="icecream1">哈根達(dá)斯</label></li>
        <li><input type="checkbox" id="icecream2"><label for="icecream2">和路雪wall's</label></li>
        <li><input type="checkbox" id="icecream3"><label for="icecream3">八喜冰淇淋</label></li>
        <li><input type="checkbox" id="icecream4"><label for="icecream4">DQ冰淇淋</label></li>
        <li><input type="checkbox" id="icecream5"><label for="icecream5">蒙牛冰淇淋</label></li>
        <li><input type="checkbox" id="icecream6"><label for="icecream6">雀巢冰淇淋</label></li>
        <li><input type="checkbox" id="icecream7"><label for="icecream7">伊利冰淇淋</label></li>    
        <li><input type="checkbox" id="icecream8"><label for="icecream8">樂(lè)可可冰淇淋</label></li>
        <li><input type="checkbox" id="icecream9"><label for="icecream9">新城市冰淇淋</label></li>
        <li><input type="checkbox" id="icecream10"><label for="icecream10">明治MEIJI</label></li>
    </ol>
    你總共選擇了 <strong class="total"></strong> 款冰淇淋!
</body>
</html>


還可以使用 CSS 計(jì)數(shù)器實(shí)現(xiàn)數(shù)值計(jì)算小游戲

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末憾朴,一起剝皮案震驚了整個(gè)濱河市狸捕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌众雷,老刑警劉巖灸拍,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異砾省,居然都是意外死亡鸡岗,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門编兄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)轩性,“玉大人,你說(shuō)我怎么就攤上這事狠鸳。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵沥寥,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我脯厨,道長(zhǎng),這世上最難降的妖魔是什么坑质? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任合武,我火速辦了婚禮,結(jié)果婚禮上涡扼,老公的妹妹穿的比我還像新娘稼跳。我一直安慰自己,他們只是感情好吃沪,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布岂贩。 她就那樣靜靜地躺著,像睡著了一般巷波。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上卸伞,一...
    開(kāi)封第一講書(shū)人閱讀 51,763評(píng)論 1 307
  • 那天抹镊,我揣著相機(jī)與錄音,去河邊找鬼荤傲。 笑死垮耳,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的遂黍。 我是一名探鬼主播终佛,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼雾家!你這毒婦竟也來(lái)了铃彰?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤芯咧,失蹤者是張志新(化名)和其女友劉穎牙捉,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體敬飒,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡邪铲,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了无拗。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片带到。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖英染,靈堂內(nèi)的尸體忽然破棺而出揽惹,到底是詐尸還是另有隱情被饿,我是刑警寧澤,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布永丝,位于F島的核電站锹漱,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏慕嚷。R本人自食惡果不足惜哥牍,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望喝检。 院中可真熱鬧嗅辣,春花似錦、人聲如沸挠说。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)损俭。三九已至蛙奖,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間杆兵,已是汗流浹背雁仲。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留琐脏,地道東北人攒砖。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像日裙,于是被迫代替她去往敵國(guó)和親吹艇。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容