CSS的偽類和偽元素

之前介紹了8種選擇器,基本上可以應(yīng)對(duì)大部分的開發(fā)需求位谋,但是如果不會(huì)使用偽類和偽元素,就跟下面的圖差不多堰燎,后面會(huì)摔的施流。偽元素和偽類雖然不是特別常用,但是炬丸,很好用本砰,可以幫你省掉很多無用功,效果還好仅讽。下面直接進(jìn)入正題陶缺,盡量用最小的篇幅讓人明白如何使用它們。

...

1.偽元素和偽類的區(qū)別

  • 偽元素和偽類都是為了給一些特殊需求加樣式洁灵,定義上基本一致饱岸。
  • 偽類像類選擇器一樣給已存在某個(gè)元素添加額外的樣式掺出;偽元素則是給自己虛擬的元素添加樣式。
  • 已存在元素是指DOM中存在的苫费,偽元素則是虛擬的一種汤锨,樣式也是給這個(gè)虛擬的元素使用的。比如虛擬一個(gè)div
  • 聲明不同百框,偽類和選擇器之間用一個(gè)冒號(hào)隔開闲礼,偽元素則是兩個(gè)冒號(hào)隔.

2.常用的偽類

常用的偽類有兩類UI偽類和結(jié)構(gòu)偽類。這里只介紹5個(gè)铐维,應(yīng)該足夠用了柬泽。

2.1.hover和active

這兩個(gè)屬于UI偽類(link/visited/active/hover)四個(gè)中的其中兩個(gè),hover指當(dāng)鼠標(biāo)移動(dòng)到元素上時(shí)觸發(fā)某種樣式方椎;activate指鼠標(biāo)按下時(shí)的某種樣式聂抢。
hover使用場(chǎng)景:一些可點(diǎn)擊的列表,表格行棠众,卡片等琳疏,鼠標(biāo)放上去之后背景顏色會(huì)發(fā)生變化,就可以使用hover闸拿。
active使用場(chǎng)景:按鈕按下空盼,圖片按下以及一些可點(diǎn)擊元素或者組件等的按下操作樣式改變。
下面是一個(gè)非常簡(jiǎn)單的按鈕案例(在線MP4轉(zhuǎn)GIF不知道這個(gè)圖能存在多久新荤,看不見的底下評(píng)論提醒我):

按鈕的hover和active

第一個(gè)按鈕當(dāng)鼠標(biāo)放上去是改變邊框和字體顏色揽趾,第二則是在鼠標(biāo)按下的時(shí)候改變背景和顏色。具體代碼如下

    .btn{
        height: 34px;
        padding: 6px 12px;
        border-radius: 4px;
        font-size: 15px;
        color: rgba(0,0,0,.65);
        font-weight: 400;
        outline: none;
        border: 1px solid #cbcbcb;
    }
    .btn:hover{
        border-color: #3385ff;
        color: #3385ff;
    }
    
    .btn2{
        height: 34px;
        padding: 6px 12px;
        border-radius: 4px;
        font-size: 15px;
        color: #fff;
        background: #3385ff;
        border-width: 0;
        font-weight: 400;
        outline: none;
    }
    .btn2:active{
        border: 1px solid #3385ff;
        color: #3385ff;
        background: #fff;
    }

HTML:

    <div>
        <button class="btn">按鈕</button>
        <button class="btn2">按鈕</button>
    </div>

使用非常簡(jiǎn)單苛骨,就是在類選擇器后面使用一個(gè)冒號(hào)后面根據(jù)需求是鼠標(biāo)放上去時(shí)觸發(fā)還是按下時(shí)觸發(fā)決定使用哪一個(gè)偽類篱瞎。如上面第一個(gè)btn是( .btn:hover ) 第二個(gè)則是( .btn2:active )。

2.2.first-child last-child nth-child(n/odd/even)

這三個(gè)屬于結(jié)構(gòu)偽類痒芝,常用來給表格或者列表添加樣式俐筋。

  • 假設(shè)父元素是一個(gè)div,使用樣式class=‘box’严衬;
  • 那么當(dāng)定義.box:first-child或者.box:last-child時(shí)分別是指給div的第一個(gè)或者最后一個(gè)子元素添加樣式澄者。
  • nth-child這個(gè)就比較牛掰了,參數(shù)是一個(gè)數(shù)值代表給第幾個(gè)元素添加樣式请琳,如果是odd標(biāo)示給元素為奇數(shù)的添加樣式粱挡,even則是給是偶數(shù)的元素添加樣式
    看個(gè)例子俄精,首行添加灰色背景,其他奇數(shù)行橙色背景的一個(gè)表格
    表格

css(簡(jiǎn)單不):

    td,th {
        padding: 12px;
    }
    
    table tr:nth-child(odd){
        background: #ffab00;
    }
    
    table tr:first-child{
        background: #ccc;
    }

html(也很簡(jiǎn)單都是重復(fù)的):

     <table border="1" frame="box" rules="all" width="50%">
        <tr>
            <th>標(biāo)題1</th>
            <th>標(biāo)題2</th>
            <th>標(biāo)題3</th>
            <th>標(biāo)題4</th>
        </tr>
        <tr>
            <td>content-1</td>
            <td>content-1</td>
            <td>content-1</td>
            <td>content-1</td>
        </tr>
        <tr>
            <td>content-2</td>
            <td>content-2</td>
            <td>content-2</td>
            <td>content-2</td>
        </tr>
        <tr>
            <td>content-3</td>
            <td>content-3</td>
            <td>content-3</td>
            <td>content-3</td>
        </tr>
        <tr>
            <td>content-4</td>
            <td>content-4</td>
            <td>content-4</td>
            <td>content-4</td>
        </tr>
        <tr>
            <td>content-5</td>
            <td>content-5</td>
            <td>content-5</td>
            <td>content-5</td>
        </tr>
     </table>

3.常用偽元素

before 和 after是經(jīng)常經(jīng)常重用的偽元素询筏。我們直接看兩個(gè)最簡(jiǎn)單的例子。再一句話的前面(before)和后面(after)分別添加一個(gè)圓形和一個(gè)矩形竖慧。

簡(jiǎn)單樣例

    <p class="eazy">我就是那句話!</p>

css:

    .eazy{
        font-size: 18px;
    }
    
    .eazy::before{
        content:'';
        display: inline-block;
        width: 10px;
        height:10px;
        background: #ffab00;
        border-radius:50%;
    }
    
    .eazy::after{
        content:'';
        display: inline-block;
        width: 10px;
        height:10px;
        background: #3385ff;
    }

雙冒號(hào)后面跟跟關(guān)鍵字before或者after嫌套,在后面的內(nèi)容即是要給這個(gè)偽元素添加的樣式局冰。其中content屬性一定要設(shè)置,可以設(shè)置為空灌危,否則不會(huì)顯示;其次碳胳,設(shè)置了依然沒有顯示就要設(shè)置表明這個(gè)偽元素塊級(jí)元素勇蝙。

3.1 在來看兩個(gè)例子,項(xiàng)目開發(fā)中經(jīng)常要畫一些氣泡挨约,比如

氣泡

這是兩種氣泡味混,帶有背景色的和帶有邊框的,實(shí)現(xiàn)上稍微有些區(qū)別诫惭,但是他們的小突起就是用偽元素畫的翁锡。
HTML:

    <div class="bubble-box">
        <div class="bubble-left">
            Hello, can I have a star?
        </div>
        &nbsp;&nbsp;&nbsp;
        <div class="bubble-top">
            Hello, can I have a star?
        </div>
        &nbsp;&nbsp;&nbsp;
        <div class="bubble-bottom">
            Hello, can I have a star?
        </div>
        &nbsp;&nbsp;&nbsp;
        <div class="bubble-right">
            Hello, can I have a star?
        </div>
        &nbsp;&nbsp;&nbsp;
        <div class="bubble-noColor">
            Hello, can I have a star?
        </div>
    </div>

css有點(diǎn)長(zhǎng),但是仔細(xì)觀察90%的代碼都是重復(fù)的并不難夕土。主要變動(dòng)是使用定位position屬性控制小突起的位置馆衔,以及border-color來控制凸起箭頭的朝向。三角形的畫法原理可以看這里怨绣!

    .bubble-box{
        display: flex;
        padding: 10px;
    }
    .bubble-top{
        width: 120px;
        padding: 10px;
        background: #3385ff;
        border-radius: 6px;
        position: relative;
        color:#fff;
    }
    
    .bubble-top::before{
        content: '';
        width: 0;
        height: 0;
        position: absolute;
        border:6px solid #3385ff;
        border-color: transparent transparent #3385ff transparent;
        left: 46%;
        top: -12px;
    }
    
    .bubble-left{
        width: 120px;
        padding: 10px;
        background: #3385ff;
        border-radius: 6px;
        position: relative;
        color:#fff;
    }
    
    .bubble-left::before{
        content: '';
        width: 0;
        height: 0;
        position: absolute;
        border:6px solid #3385ff;
        border-color: transparent #3385ff transparent transparent;
        left: -12px;
        top: 24px;
    }
    
    .bubble-bottom{
        width: 120px;
        padding: 10px;
        background: #3385ff;
        border-radius: 6px;
        position: relative;
        color:#fff;
    }
    
    .bubble-bottom::before{
        content: '';
        width: 0;
        height: 0;
        position: absolute;
        border:6px solid #3385ff;
        border-color: #3385ff transparent transparent transparent;
        left: 46%;
        bottom: -12px;
    }
    
    .bubble-right{
        width: 120px;
        padding: 10px;
        background: #3385ff;
        border-radius: 6px;
        position: relative;
        color:#fff;
    }
    
    .bubble-right::before{
        content: '';
        width: 0;
        height: 0;
        position: absolute;
        border:6px solid #3385ff;
        border-color: transparent transparent transparent #3385ff;
        right: -12px;
        top: 24px;
    }
    
    .bubble-noColor{
        width: 120px;
        padding: 10px;
        border:1px solid #ccc;
        border-radius: 6px;
        position: relative;
        color:#0f0f0f;
    }
    
    .bubble-noColor::before{
        content: '';
        width: 9px;
        height: 9px;
        border-top: 1px solid #ccc;
        border-left: 1px solid #ccc;
        background: white;
        transform: rotate(45deg);
        position: absolute;
        left: 46%;
        top: -6px;
    }

3.2 利用偽元素畫一個(gè)時(shí)間軸

如圖

時(shí)間軸

解析角溃,每一行都只設(shè)置左邊框,這樣就這回出現(xiàn)一條豎線篮撑,然后每一行前面加一個(gè)圓點(diǎn)减细,就會(huì)呈現(xiàn)時(shí)間軸的樣式,加圓點(diǎn)當(dāng)然是用偽元素了赢笨。
先看HTML未蝌,很簡(jiǎn)單:

    <div>
        <ul class="list">
            <li>2018-11-15 吃了好吃的</li>
            <li>2018-11-16 不開心</li>
            <li>2018-11-18 藍(lán)瘦香菇</li>
            <li>2018-11-23 滾蛋</li>
            <li>2018-12-10 嗯哼隨心隨遇把</li>
        </ul>
    </div>

css 先給li標(biāo)簽設(shè)置左邊框border-left,

    .list{
        padding: 10px;
        border: 1px solid #fff;
    }
    .list li{
        list-style: none;
        padding: 10px;
        border-left: 1px solid #ccc;
    }

第二步茧妒,添加偽元素

    .list li::before{
        content: '';
        display: inline-block;
        width: 6px;
        position: absolute;
        height: 6px;
        left: 16px;
        margin-top: 7px;
        border: 1px solid #ffab00;
        border-radius: 50%;
        background: #3385ff;
    }

3.3 偽元素怎么添加內(nèi)容的

偽元素雖然是不存在于DOM樹種的元素萧吠,但是也是可以添加內(nèi)容的,就是上面提到的content屬性嘶伟。content屬性可以是URL怎憋、字符串甚至是圖片,視頻等九昧。
我們把第三節(jié)剛開始的那個(gè)前后圓形和矩形的content設(shè)置為'1'和'2'.就變成這樣了绊袋。

content 有值

所以content就是這只偽元素中內(nèi)容的入口,這也解釋了為什么不設(shè)置這個(gè)屬性就不顯示的原因铸鹰,哪怕設(shè)置為空癌别,也相當(dāng)于我定義了這個(gè)偽元素

最后再看一個(gè)例子:


目錄結(jié)構(gòu)

如果人工去標(biāo)示會(huì)非常的消耗成本蹋笼,實(shí)際上偽元素就可以輕松解決這個(gè)問題展姐。content + counters實(shí)現(xiàn)目錄結(jié)構(gòu)躁垛。
HTML:

    <div class="list2">
        <ul>
            <li>吃了好吃的
                <ul>
                    <li>content</li>
                    <li>content</li>
                    <li>content</li>
                </ul>
            </li>
            <li>不開心</li>
            <li>藍(lán)瘦香菇
                <ul>
                    <li>content</li>
                    <li>content</li>
                    <li>content</li>
                </ul>
            </li>
            <li>滾蛋</li>
            <li>嗯哼隨心隨遇把</li>
        </ul>
    </div>

css counter-reset定義一個(gè)計(jì)數(shù)器后面跟一個(gè)名字,這個(gè)屬性在哪個(gè)元素上設(shè)置則標(biāo)示遇到這個(gè)元素我就重新開始計(jì)數(shù)圾笨,如上面的HTML教馆,我們把這個(gè)屬性設(shè)置到ul上,則遇到ul就重新計(jì)數(shù)(添加一個(gè)新的計(jì)數(shù)器擂达,原計(jì)數(shù)器不受影響)土铺。

    .list2{
        padding: 10px;
        border: 1px solid #ccc;
    }
    .list2 li{
        list-style: none;
    }
    .list2 ul{
        counter-reset: xuhao;
    }
    
    .list2 li::before{
        counter-increment: xuhao;
        content: counters(xuhao, ".") " ";
    }

在li元素的偽元素上接受這個(gè)計(jì)數(shù)值通過counters,第一參數(shù)接收計(jì)數(shù)器,第二參數(shù)指明新的計(jì)數(shù)值以什么字符鏈接在上一級(jí)計(jì)數(shù)值得后面

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末板鬓,一起剝皮案震驚了整個(gè)濱河市悲敷,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌俭令,老刑警劉巖后德,帶你破解...
    沈念sama閱讀 221,430評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異抄腔,居然都是意外死亡瓢湃,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門赫蛇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來箱季,“玉大人,你說我怎么就攤上這事棍掐〔爻” “怎么了?”我有些...
    開封第一講書人閱讀 167,834評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵作煌,是天一觀的道長(zhǎng)掘殴。 經(jīng)常有香客問我,道長(zhǎng)粟誓,這世上最難降的妖魔是什么奏寨? 我笑而不...
    開封第一講書人閱讀 59,543評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮鹰服,結(jié)果婚禮上病瞳,老公的妹妹穿的比我還像新娘。我一直安慰自己悲酷,他們只是感情好套菜,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,547評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著设易,像睡著了一般逗柴。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上顿肺,一...
    開封第一講書人閱讀 52,196評(píng)論 1 308
  • 那天戏溺,我揣著相機(jī)與錄音渣蜗,去河邊找鬼。 笑死旷祸,一個(gè)胖子當(dāng)著我的面吹牛耕拷,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播托享,決...
    沈念sama閱讀 40,776評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼斑胜,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了嫌吠?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,671評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤掺炭,失蹤者是張志新(化名)和其女友劉穎辫诅,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體涧狮,經(jīng)...
    沈念sama閱讀 46,221評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡炕矮,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,303評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了者冤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肤视。...
    茶點(diǎn)故事閱讀 40,444評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖涉枫,靈堂內(nèi)的尸體忽然破棺而出邢滑,到底是詐尸還是另有隱情,我是刑警寧澤愿汰,帶...
    沈念sama閱讀 36,134評(píng)論 5 350
  • 正文 年R本政府宣布困后,位于F島的核電站,受9級(jí)特大地震影響衬廷,放射性物質(zhì)發(fā)生泄漏摇予。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,810評(píng)論 3 333
  • 文/蒙蒙 一吗跋、第九天 我趴在偏房一處隱蔽的房頂上張望侧戴。 院中可真熱鬧,春花似錦跌宛、人聲如沸酗宋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)本缠。三九已至,卻和暖如春入问,著一層夾襖步出監(jiān)牢的瞬間丹锹,已是汗流浹背稀颁。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留楣黍,地道東北人匾灶。 一個(gè)月前我還...
    沈念sama閱讀 48,837評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像租漂,于是被迫代替她去往敵國(guó)和親阶女。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,455評(píng)論 2 359

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

  • 本文轉(zhuǎn)載自:眾成翻譯譯者:為之漫筆鏈接:http://www.zcfy.cc/article/239原文:http...
    極樂君閱讀 7,378評(píng)論 1 62
  • 偽類和偽元素 這里有更詳細(xì)的說明 偽類和偽元素都是用來選擇某一部分HTML內(nèi)容的哩治。 偽類傾向于選擇處于某一種狀態(tài)的...
    csRyan閱讀 383評(píng)論 0 0
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5秃踩? 答:HTML5是最新的HTML標(biāo)準(zhǔn)。 注意:講述HT...
    kismetajun閱讀 27,513評(píng)論 1 45
  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案业筏? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補(bǔ)...
    _Yfling閱讀 13,758評(píng)論 1 92
  • 學(xué)會(huì)使用CSS選擇器熟記CSS樣式和外觀屬性熟練掌握CSS各種選擇器熟練掌握CSS各種選擇器熟練掌握CSS三種顯示...
    七彩小鹿閱讀 6,317評(píng)論 2 66