8.CSS層疊繼承規則總結

CSS 層疊繼承規則總結

經典真題

  • 請簡述一下 CSS 中的層疊規則

CSS 中的層疊繼承規則

在前面《CSS屬性的計算過程》中,我們介紹了每一個元素都有都有所有的屬性,每一個屬性都會通過一系列的計算過程得到最終的值。

這里來回顧一下計算過程,大致有以下幾個步驟:

  • 確定聲明值
  • 層疊沖突
  • 使用繼承
  • 使用默認值

其中的第二步和第三步層疊和繼承會有一些需要注意的知識點,這里我們一起來看一下。

層疊規則

CSSCascading Style Sheets 的縮寫,這暗示層疊(cascade)的概念是很重要的。

在最基本的層面上,它表明 CSS 規則的順序很重要,但它比那更復雜。

什么選擇器在層疊中勝出取決于三個因素(這些都是按重量級順序排列的,前面的的一種會否決后一種):

  • 重要性(Importance
  • 專用性(Specificity
  • 源代碼次序(Source order

重要性

CSS 中,有一個特別的語法可以讓一條規則總是優先于其他規則: !important

知道 !important 存在是很有用的,這樣當你在別人的代碼中遇到它時,你就知道它是什么了。

但是!建議你千萬不要使用它,除非你絕對必須使用它。您可能不得不使用它的一種情況是,當您在修改某個組件樣式時,你不能編輯該組件核心的 CSS 模塊,又或者你確實想要重寫一種不能以其他方式覆蓋的樣式。

但是,如果你能避免的話,不要使用它。由于 !important 改變了層疊正常工作的方式,因此調試 CSS 問題,尤其是在大型樣式表中,會變得非常困難。

專用性

專用性基本上是衡量選擇器的具體程度的一種方法,主要是指它能匹配多少元素。

元素選擇器具有很低的專用性。類選擇器具有更高的專用性,所以將戰勝元素選擇器。ID 選擇器有甚至更高的專用性, 所以將戰勝類選擇器,戰勝 ID 選擇器的方法則是 style 中的樣式或者 !important

一個選擇器具有的專用性的量可以用四種不同的值(或組件)來衡量的,它們可以被認為是千位,百位,十位和個位,在四個列中的四個簡單數字:

  • 千位:如果聲明是在 style 屬性中該列加 1 分(這樣的聲明沒有選擇器,所以它們的專用性總是 1000)否則為 0
  • 百位:在整個選擇器中每包含一個 ID 選擇器就在該列中加 1 分。
  • 十位:在整個選擇器中每包含一個類選擇器、屬性選擇器、或者偽類就在該列中加 1 分。
  • 個位:在整個選擇器中每包含一個元素選擇器或偽元素就在該列中加 1 分。

注:通用選擇器(*), 復合選擇器(+、>、~、空格)和否定偽類(:not)在專用性中無影響。

舉個例子:

選擇器千位百位十位個位合計值
h100010001
#indentifier01000100
h1 + p::first-letter00030003
li > a[href*=” zh-CN”] > .inline-warning00220022
沒有選擇器, 規則在一個元素的 style 屬性里10001000

源代碼次序

如果多個相互競爭的選擇器具有相同的重要性和專用性,那么第三個因素將幫助決定哪一個規則獲勝,也就是說,選擇哪一個選擇器取決于源碼順序。

例如:

p {color: red;
}p {color: blue;
}

不過有一點大家需要注意的是,當多個 CSS 規則匹配相同的元素時,它們都被應用到該元素中。只不過后面因為層疊規則被層疊掉了而已。打開 Elements > Styles 我們就能看到:

image-20240222090719106

繼承規則

所謂繼承,就是應用于某個元素的一些屬性值將由該元素的子元素繼承,而有些則不會。

究竟哪些屬性能夠被子元素繼承,可以參閱:https://developer.mozilla.org/zh-CN/docs/Web/CSS/Reference

CSS 為處理繼承提供了四種特殊的通用屬性值:

  • inherit:該值將應用到選定元素的屬性值設置為與其父元素一樣。
  • initial:該值將應用到選定元素的屬性值設置為與瀏覽器默認樣式表中該元素設置的值一樣。如果瀏覽器默認樣式表中沒有設置值,并且該屬性是自然繼承的,那么該屬性值就被設置為 inherit
  • unset:該值將屬性重置為其自然值,即如果屬性是自然繼承的,那么它就表現得像 inherit,否則就是表現得像 initial
  • revert:如果當前的節點沒有應用任何樣式,則將該屬性恢復到它所擁有的值。換句話說,屬性值被設置成自定義樣式所定義的屬性(如果被設置), 否則屬性值被設置成用戶代理的默認樣式。

注: initialunset 不被 IE 支持。

繼承的就近原則

由于屬性值是由繼承而來,所以屬性值會繼承離自己近的那個元素的屬性。例如:

<div class="one"><div class="two"><p>Lorem ipsum dolor sit amet.</p></div>
</div>
.two {color: blue;
}.one {color: red;
}

在上面的示例中,twoone 更加接近 p,所以最終采用的是 twocolor 值。段落呈現藍色。

真題解答

  • 請簡述一下 CSS 中的層疊規則

參考答案:

CSS 中當屬性值發生沖突時,通過層疊規則來計算出最終的屬性值,層疊規則可以分為 3 塊:

  • 重要性(Importance):!important 設置該條屬性值最重要,但是一般不推薦使用。
  • 專用性(Specificity):專用性主要是指它能匹配多少元素,匹配得越少專用性越高。
  • 源代碼次序(Source order):在重要性和專用性都一致的情況下,屬性值取決于源代碼的先后順序。

-EOF-

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/697423.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/697423.shtml
英文地址,請注明出處:http://en.pswp.cn/news/697423.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Node.js中如何處理異步編程

在Node.js中&#xff0c;處理異步編程是至關重要的技能。由于Node.js的單線程執行模型&#xff0c;異步編程可以極大地提高程序的性能和響應速度。本文將介紹幾種常見的異步編程處理方式&#xff0c;并附上示例代碼&#xff0c;幫助您更好地理解和應用異步編程技術。 回調函數…

家政小程序開發,引領家庭服務新時代的科技革命

隨著科技的飛速發展&#xff0c;人們的生活方式正在發生深刻的變化。其中&#xff0c;家政服務作為日常生活的重要組成部分&#xff0c;也在經歷著一場由小程序技術引領的科技革命。本文將探討家政小程序的發展趨勢、功能特點以及對家庭服務的深遠影響。 一、家政小程序的發展…

Linux命令-chattr命令(用來改變文件屬性)

說明 chattr命令 用來改變文件屬性。這項指令可改變存放在ext2文件系統上的文件或目錄屬性&#xff0c;這些屬 性共有以下8種模式。 語法 chattr(選項)選項 a&#xff1a;讓文件或目錄僅供附加用途&#xff1b; b&#xff1a;不更新文件或目錄的最后存取時間&#xff1b; c…

NFTScan Labs,一個聚焦在 NFT 領域的開發者組織

NFTScan Labs 是一個聚焦在 NFT 領域的開發者組織&#xff0c;成立于 2021 年 3 月份。NFTScan Labs 核心成員從 2016 年開始涉足區塊鏈領域&#xff0c;有多年開發經驗和前沿行業認知&#xff0c;對加密錢包、區塊鏈安全、鏈上數據追蹤、DeFi、預言機、NFT 等領域有深入的研究…

2/22作業

1.按位置插入 void insert_pos(seq_p L,datetype value,int pos) { if(LNULL) { printf("入參為空\n"); return; } if(seq_full(L)) { printf("表已滿\n"); return; } if(pos>L->len|…

Jenkins的使用GIT(4)

Jenkins的使用GIT 20211002 我們使用 Jenkins 集成外部 Git 倉庫&#xff0c;實現對真實代碼的拉取和構建。在這里&#xff0c;我們選用 Coding/Github/Gitee 等都可以作為我們的代碼源 1 生成公鑰私鑰 首先&#xff0c;我們先來配置公鑰和私鑰。這是 Jenkins 訪問 Git 私有庫…

【nvm】下載安裝及使用(包含windows和Linux)

目錄 1、Windows版本下載及安裝 2、Linux下載及安裝 下載 安裝 3、使用 在不借助第三方工具的情況下切換node版本&#xff0c;只能卸載現有版本&#xff0c;安裝需要的版本&#xff0c;這樣顯然很麻煩。而nvm就很好的幫我們解決了這個問題。 nvm&#xff08;node.js vers…

QT中調用python

一.概述 1.Python功能強大&#xff0c;很多Qt或者c/c開發不方便的功能可以由Python編碼開發&#xff0c;尤其是一些算法庫的應用上&#xff0c;然后Qt調用Python。 2.在Qt調用Python的過程中&#xff0c;必須要安裝python環境&#xff0c;并且Qt Creator中編譯器與Python的版…

OpenCV:計算機視覺領域的瑞士軍刀

摘要 本文將深入探索OpenCV&#xff08;開源計算機視覺庫&#xff09;的基本概念、應用領域、主要功能和未來發展。通過本文&#xff0c;讀者將能夠理解OpenCV在計算機視覺中的重要性&#xff0c;并掌握其基本使用方法。 一、引言 隨著人工智能和機器學習技術的飛速發展&…

IDEA啟動Springboot報錯:無效的目標發行版:17 的解決辦法

無效的目標發行版&#xff1a;17 的解決辦法 一般有兩個原因&#xff0c;一可能是本地沒有安裝JDK17&#xff0c;需要安裝后然后在IDEA中選擇對應版本&#xff1b;二可能是因為IDEA版本太低&#xff0c;不支持17&#xff0c;需要升級IDEA版本。然后在File->Project Struct…

未雨綢繆,才是真正的高手

由于電腦用了五年半&#xff0c;剛換了新型電腦主機&#xff0c;人老了摸索掌握新操作方法較困難&#xff0c;所以今天的網文作業只好從簡&#xff0c;即本“人民體驗官”推廣人民日報官方微博文化產品《夜讀&#xff1a;真正的高手&#xff0c;都懂得凡事提前一步》。 圖&…

Flutter常用命令,持續更新

目錄 前言 Flutter 常用命令 Dart 常用命令 adb 常用命令&#xff08;用于 Android 開發&#xff09; 前言 當在開發Flutter項目時&#xff0c;熟悉一些常用的命令是非常重要的。這些命令可以幫助你執行各種任務&#xff0c;從構建應用程序到調試和測試。以下是一些Flutte…

Draw.io | 強大并且免費的畫圖工具

前言 作為一個技術人&#xff0c;總是需要一個稱手的畫圖工具&#xff0c;日常工作中&#xff0c;畫的最多的圖應該就是流程圖&#xff0c;思維導圖&#xff0c;如果開發時間比較久的話&#xff0c;可能還需要畫架構圖。剛開始的時候&#xff0c;我下載了各種工具&#xff0c;像…

Aigtek電壓放大器的應用場合有哪些

電壓放大器是一種主要用于信號處理的重要電子設備&#xff0c;它可以將輸入的低電壓信號放大到較高的輸出電壓水平。在各個應用領域中&#xff0c;電壓放大器發揮著重要的作用。下面西安安泰點擊將介紹電壓放大器的應用場合。 通信系統&#xff1a;電壓放大器在通信系統中具有重…

【打工日常】使用docker部署StackEdit編輯器-Markdown之利器

一、StackEdit介紹 StackEdit一款強大的在線Markdown編輯器&#xff0c;不僅具備卓越的寫作功能&#xff0c;還支持實時預覽、多設備同步等特性。 很多時候基于安全和信息保密的關系&#xff0c;建議放在自己的服務器或者本地linux去運行&#xff0c;這樣會比較省心。 二、本次…

Nginx跳轉模塊location

一.location模塊概述 1.定義 location塊是server塊的一個指令。作用&#xff1a;基于Nginx服務器接收到的請求字符串&#xff0c;虛擬主機名稱&#xff08;ip&#xff0c;域名&#xff09;、url匹配&#xff0c;對特定請求進行處理。 2.三種匹配類別 精準匹配&#xff1a;l…

企業微信變更企業主體的流程

企業微信變更主體有什么作用&#xff1f;做過企業運營的小伙伴都知道&#xff0c;很多時候經常會遇到現有的企業需要注銷&#xff0c;切換成新的企業進行經營的情況&#xff0c;但是原來企業申請的企業微信上面卻積累了很多客戶&#xff0c;肯定不能直接丟棄&#xff0c;所以這…

【Flink數據傳輸(一)】NetworkStack架構概述:實現tm之間的數據交換

文章目錄 1. NetworkStack整體架構2. StreamTask內數據流轉過程 NetworkStack提供了高效的網絡I/O和反壓控制 除了各個組件之間進行RPC通信之外&#xff0c;在Flink集群中TaskManager和TaskManager節點之間也會發生數據交換&#xff0c;尤其當用戶提交的作業涉及Task實例運行在…

ubuntu20.04中配置Pyrep和CoppeliaSim

ubuntu20.04中配置Pyrep和CoppeliaSim 在Ubuntu20.04中配置 Pyrep &#xff0c;實現應用Python語言的機器人在 Vrep&#xff08;CoppeliaSim&#xff09;中的虛擬仿真 一、安裝CoppeliaSim 4.1 1.1 下載適配Ubuntu20.04的CoppeliaSim 4.1軟件 下載鏈接&#xff1a;https://…

5.iframe

iframe 經典真題 iframe 框架有哪些優缺點&#xff1f;iframe 用來干什么的 iframe 介紹 iframe 稱之為嵌入式框架&#xff0c;嵌入式框架可以把一個完整的網頁內容嵌入到現有的網頁中。 下面是一個 iframe 的簡單示例&#xff1a; <body><p>iframe 示例<…