CSS 偽類沒有生效?探索 content 屬性!

以下文章來源于前端雜貨鋪 ,作者Gopal

問題就是 CSS 偽類沒有生效,具體表現(xiàn)如下,可見 demo[1]:

<span class="desc">
   我是 Gopal。
</span
.desc {
  display: block;
  font-size: 30px;
  color: #000;
}
.desc:before {
  display: inline-block;
  width: 10px;
  height: 10px;
  background: red;
}
可以看到,偽類并沒有生效。



問題的解決
解決的方法很簡單,設(shè)置 content 屬性,而且要具有一定的寬高,可以設(shè)置 display 為 inline-block 和 block,讓元素的寬高生效,如下,添加一行:

.desc:before {
+ content: ' ';
  display: inline-block;
  width: 10px;
  height: 10px;
  background: red;
}



那這個 content 是啥屬性,為何具有如此魔力?

探索 content 屬性
來看 MDN 的描述:

CSS 的 content CSS 屬性用于在元素的  ::before 和 ::after 偽元素中插入內(nèi)容。使用 content 屬性插入的內(nèi)容都是匿名的可替換元素。

重點關(guān)注,插入內(nèi)容,這里就很豐富了。這里大概說下幾種常見的場景。以下的 Demo 都在這里[2]。

填充字符串
我們經(jīng)常需要在一些特殊的行后面加一些標識,比如品類列表,如果是新品則提示 New 字樣。

<h2>品類列表</h2>
<ol>
    <li>蘋果</li>
    <li class="newEntry">香蕉</li>
    <li>菠蘿</li>
    <li class="newEntry">葡萄</li>
</ol>
.newEntry::after {
    content: " New!";
    color: red;
}
效果如下:



填充圖片
有時候,我們希望在段落前面插入一個 ICON,可以通過 url()、URI() 指定 ICON 資源地址。URI 值會指定一個外部資源(比如圖片)。如果該資源或圖片不能顯示,它就會被忽略或顯示一些占位(比如無圖片標志)。

<p class="desc">我是 Gopal</p>
.desc:before {
   content: url('https://p3-passport.byteacctimg.com/img/user-avatar/a0383600d66ccc81b3396b75cf3a95ea~300x300.image');
}





效果如下:



計數(shù)器玩轉(zhuǎn)列表編號
content 屬性還有一個很強大的設(shè)置方式,counter() 函數(shù)。來看看吧!

對于列表,我們經(jīng)常需要自定義它的編號,比如給編號數(shù)字添加相關(guān)背景等等。

那我們怎么通過 content 屬性完成這個功能呢?

這里需要結(jié)合 CSS 計數(shù)器。CSS 計數(shù)器是網(wǎng)頁范圍變量,可以使用 CSS 規(guī)則更改其值。

我們通過 Demo 來看看怎么處理的。

先看 HTML 結(jié)構(gòu):

<div class="list">
  <div>My first item</div>
  <div>My second item</div>
  <div>My third item</div>
</div>
第二步,使用 counter-reset 屬性設(shè)置一個計數(shù)器。list-number 是此處要使用的變量名。

.list {
  counter-reset: list-number;
}
第三步,使用 counter-increment 屬性增加計數(shù)器的值?,F(xiàn)在,每次出現(xiàn) .list div 元素時,list-number 變量都會增加一。

.list div {
  counter-increment: list-number;
}
最后一步,在 content 屬性的 counter() 函數(shù)中使用 :before 偽元素來顯示數(shù)字。

.list div {
  counter-increment: list-number;
+  content: counter(list-number);
}
效果如下:








我們再多加修飾:

.list div {
  counter-increment: list-number;
  content: counter(list-number);
+  margin-right: 10px;
+  margin-bottom:10px;
+  width:35px;
+  height:35px;
+  display:inline-flex;
+  align-items:center;
+  justify-content: center;
+  font-size:16px;
+  background-color:#d7385e;
+  border-radius:50%;
+  color:#fff;
}
效果如下:



counter() 函數(shù)可以具有兩個參數(shù):計數(shù)器名稱和計數(shù)器格式。對于第二個參數(shù),可以使用任何有效的 list-style-type 值。比如,我希望顯示羅馬數(shù)字。那可以修改如下:

.list div:before {
  counter-increment: list-number;
- content: counter(list-number);
+ content: counter(list-number, lower-roman);
  // ....
}



是不是很酷?

最后,大家有在項目中經(jīng)常用 content 屬性么?經(jīng)常用它的哪些功能呢?

參考
使用CSS計數(shù)器花式玩轉(zhuǎn)列表編號[3]
參考資料
[1]
demo: https://codepen.io/gpingfeng/pen/GRQzBwV

[2]
這里: https://codepen.io/gpingfeng/pen/QWQYVdM

[3]
使用CSS計數(shù)器花式玩轉(zhuǎn)列表編號: https://segmentfault.com/a/1190000038292189

作者:Gopal


歡迎關(guān)注微信公眾號 :前端快快跑