CSS偽元素詳解以及偽元素與偽類的區別

来源:https://www.cnblogs.com/jimojianghu/archive/2023/04/06/17291942.html
-Advertisement-
Play Games

前面已經介紹過CSS偽類的知識,具體可見前文 CSS偽類知識詳解。 偽元素常常被誤解為偽類,主要在於他們的語法相似,都是對於選擇器功能的擴展,相似程度很高導致被混淆。 本文通過詳細介紹偽元素和常見的使用方法,最後也會分析下偽元素與偽類的基本區別。 基本描述 CSS偽元素也是應用於選擇器的關鍵字,允許 ...


前面已經介紹過CSS偽類的知識,具體可見前文 CSS偽類知識詳解
偽元素常常被誤解為偽類,主要在於他們的語法相似,都是對於選擇器功能的擴展,相似程度很高導致被混淆。
本文通過詳細介紹偽元素和常見的使用方法,最後也會分析下偽元素與偽類的基本區別。

基本描述

CSS偽元素也是應用於選擇器的關鍵字,允許改變被選擇元素的特定部分的樣式。
一般常見的如用於在元素的內容前後插入新的內容,或者改變首字母、首行的樣式等。

語法:selector:pseudo-element { property: value; }

div::before {
  content: '開始-';
  color: red;
  font-size: 15px;
}

如上代碼,即是我們常用的 ::after 偽元素,在div內部增加一塊 開始- 的內容作為div的第一個子元素,可以設置不同的樣式屬性。

常用偽元素

下麵的列表,列出當前可用的偽元素:

偽元素 描述
::after 作為選中元素的第一個子元素。
::before 作為選中元素的最後一個子元素。
::first-letter 選中塊元素第一行的第一個字母,應用樣式。
::first-line 選中塊元素的第一行,應用樣式。
::selection 應用於文檔中被用戶選中的部分,如使用滑鼠選中文本。
::file-selector-button 代表input(file)標簽按鈕,用來改變該按鈕樣式。
::marker 應用於list-item元素上的標記點的樣式。
::slotted 用於選定那些被放在HTML模板中的元素。
::part 應用於Web components中shadow-dom的任何匹配part屬性的元素。

其中,::before::after 應該是我們使用最多的偽元素,而其他的偽元素也有各自的特點和作用,下麵通過一個示例來展示其中幾個偽元素。

示例:

<div class="province">
  <span>中國中部的省份</span>
  <ul>
    <li>湖北</li>
    <li>湖南</li>
  </ul>
  <input type="file" />
</div>
.province::first-letter {
  color: #f00;
  font-size: 20px;
}
.province::before {
  content: '選擇'
}
::selection {
  background-color: #ff0;
}
li::marker {
  color: #f00;
}
input::file-selector-button {
  border: 1px solid #f00;
  font-size: 20px;
  border-radius: 5px;
}

頁面呈現,如下圖:

image

以上代碼,使用了多個偽元素的實現:

  • ::before 增加了一個文本內容 選擇
  • ::first-letter 改變了第一字的字體大小,顏色變為紅色,並且是改變的 ::before 元素的文本,因為 ::before 是第一行子元素的內容。
  • ::file-selector-button 改變了文件上傳控制項的按鈕樣式,增加紅色邊框、圓角、字體大小。
  • ::marker 改變了列表元素,每行前面的圓點為紅色(預設是黑色)。
  • ::selection 當滑鼠選中內容區域時,背景色會變為黃色。

註意:before偽元素作為第一個子元素,會被first-letter選中賦予樣式。
以後當我們想美化文件上傳控制項時,偽元素 ::file-selector-button 也是一個可用的選擇。

::before 和 ::after

這兩個偽元素是我們前端開發中最常用的,本節專門詳述它們的基本用法。

::before 創建一個偽元素,作為所選中元素的第一個子元素;::after 創建一個偽元素,作為所選中元素的最後一個子元素。
它倆通常展示一塊文本內容,並且需要使用 content 屬性來為元素添加內容,預設為行內元素。
一般都是用於在元素內部的首尾插入一段內容,文字或者小圖標等等。

註意:不能應用於替換元素,如img、br等元素。

content屬性

content屬性主要用於在 ::before::after 兩個偽元素中插入內容。
它的取值範圍:

  • none:無偽元素
  • normal:基本等於none
  • string:字元串文本內容
  • uri:指定外部資源,一般是圖片,資源無法顯示則被忽略或顯示占位符
  • counter:計數器函數
  • attr(X):將元素的X屬性以字元串形式返回。
  • open-quote|close-quote:前後引號,如雙引號、單引號等。
  • no-open-quote|no-close-quote:不產生內容

示例

<div class="wrap">
  <label>請選擇您所在的城市</label>
</div>
.wrap::before {
  content: '開始-';
  color: #f00;
}
.wrap::after {
  content: url(./home.png);
}
label::before{
  content: open-quote;
  color: #f00;
}
label::after{
  content: close-quote;
  color: #f00;
}

頁面呈現,如下圖:

image

以上代碼,
div.wrap 前面添加文本內容,紅色的文字 開始-
div.wrap 後面添加圖片資源,home.png;
通過給 label 元素前後添加 open-quoteclose-quote 的屬性值,增加了雙引號,並且能設置樣式屬性為紅色。

偽元素的呈現

另外,我們需要瞭解到,偽元素之所以加個偽字,在於它雖然創建了新的元素作為某個選中元素的子元素,但它並不存在於DOM文檔樹中,而僅僅只是一種邏輯上的虛擬呈現。
不過,在當前瀏覽器的開發者工具中可以查看到部分偽元素,這可以方便我們進行調試。

image

如上圖,左邊dom文檔結構中並沒有偽元素,右邊在瀏覽器的開發者工具里能看到 ::before::after::marker 三個偽元素。

偽元素與偽類的區別

偽元素與偽類由於在寫法上比較類似,所以常常被混淆,多見於把偽元素說成是偽類。
雖然並沒有啥大的影響,但我們也有必要瞭解下它們的區別:

  • 偽類根據狀態改變元素樣式,只是對選擇器的擴展和彌補不足;而偽元素則是在邏輯上創建了虛擬的新元素,並可以給新元素添加樣式。
  • 偽類使用單冒號,CSS3在偽元素中引入雙冒號,是為了區分偽類和偽元素,偽元素同時也支持單冒號。為了方便區分,可以給偽元素一直使用雙冒號。
  • 一個選擇器中可以同時跟隨多個偽類並一起起作用,但偽元素如果在選擇器後跟隨多個則不會起作用。
/*對第一個div元素應用hover狀態的樣式*/
div:first-child:hover {
  color: #ddd;
}

/*無效,沒有偽元素會產生*/
.province::before::first-letter {
  content: '選擇';
  color: #f00;
  font-size: 20px;
}

以上代碼,當使用多個偽元素時,代碼將失效,不會創建新元素,樣式也不起作用。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Mysql 01 使用CMD連接資料庫 -- 在控制台連接資料庫(需將位置切換到mysql所在地址) mysql -u root -p password:12345 -- 修改mysql賬戶密碼及許可權,安裝配置完後慎用 update mysql.user set authentication_str ...
  • Ubuntu 20.04 安裝ClickHouse集群 引言 因為筆者最近一直想實現一個自己的APM服務端,但是看了很多APM服務端系統沒有使用.Net Core來寫的,都是採用Java或者Go,筆者是寫C#的,但是筆者認為.Net Core的性能在現在對比Go和Java很有優勢,所以筆者才有想法使 ...
  • Android Banner - ViewPager 02 現在來給viewpager實現的banenr加上自動輪播 自動輪播的原理,使用handler的延遲消息來實現。 自動輪播實現如下內容 開始輪播&停止輪播 可配置輪播時長、輪播方向 通過自定義屬性來配置輪播時長,方向 感知生命周期,可見時開始 ...
  • 使用腳手架vue-cli創建vue3項目,創建前需要準備以下: 1、node.js環境 見:https://www.cnblogs.com/beichengshiqiao/p/17251233.html 2、npm、cnpm工具 見:https://www.cnblogs.com/beichengs ...
  • Vue.js 3.0 是 Vue.js 框架的最新版本,於 2020 年 9 月正式發佈。Vue.js 3.0 主要的改進和新特性包括: 更好的性能:Vue.js 3.0 使用了更快的虛擬 DOM 實現,比 Vue.js 2.0 更快。 更小的體積:Vue.js 3.0 的代碼體積比 Vue.js ...
  • 1 <template> 2 <el-form ref="form" :model="form" :rules="rules" label-width="100px"> 3 <div v-for="(input, index) in inputs" :key="index"> 4 <el-form- ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 瞭解 console ● 什麼是 console ? console 其實是 JavaScript 內的一個原生對象 內部存儲的方法大部分都是在瀏覽器控制台輸出一些內容 並且還提供了很多的輔助方法 ● 最常見的 console 我們在開發 ...
  • 基於 Node.js、Express.js 和 MongoDB 通過Mongoose驅動進行 REST API 開發的輕量級樣板。集成了Swagger UI、JWT、session、發送郵箱驗證、日誌管理、統一的預定義狀態碼響應格式等,對於為前端平臺構建純凈的Web API非常有用。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...