CSS 選擇器權重計算規則

CSS 選擇器(Selector)的權重(Specificity)決定了對于同一元素,到底哪一條 CSS 規則會生效。且僅有當多條 CSS 規則都對同一元素聲明了相應樣式時,才會涉及到權重計算的問題。

選擇器的分類

正式計算選擇器權重之前,先來看選擇器是如何被分類的。

因為 CSS 選擇器眾多,在計算時,這些選擇器被歸為了三大類,按其權重由大到小依次為:

  • ID 選擇器:比如 #dialog
  • 元素類型選擇器(type selector)和偽選擇器(pseudo selector):比如 h1::before
  • 類名選擇器(class selector),屬性選擇器(attribute selector)及偽類選擇器(pseudo class selector) :比如 .btn[type="radio"]:hover

其中兩類特殊的樣式會影響權重的生效,

  • 一是內聯樣式:style="color:red"。內聯樣式始終擁有最高的權值,會覆蓋樣式文件的樣式。
  • 另一個是 !important 修飾詞。應用該修飾詞的規則權重會高于正常的規則,但不推薦。

其他選擇器,

  • 全局選擇器:*
  • 選擇連接符:+,>,-, ,||
  • 偽類反向選擇器::not()

以上,對權重的計算沒影響,即不參與計算。

權重的計算

根據以上對選擇器的分類,對任意樣式規則,可得到 (W,X,Y,Z) 這么一個值,其中,

  • W:標識是否有內聯樣式
  • X:ID 的數量
  • Y:類名選擇器,屬性選擇器及偽類選擇器的數量
  • Z:元素選擇器,偽選擇器 的數量

對于同一元素身上的多條樣式,對第條樣式規則計算出上面四個值,然后從左往右逐個比較,數字大的勝出。

如果權重全部一樣,后面的規則會生效。

示例

示例一

考察下面的示例代碼:

<ul class="list"><li class="list-item">item1</li><li class="list-item">item2</li><li class="list-item">item3</li>
</ul>
ul > li {color: blue
}.list > .list-item {color: red;
}
  • 先來分析第一條規則 ul > li ,包含 2 個元素類型選擇器,得到的權值為 (0,0,0,2)

  • 再看 .list > .list-item,包含 2 個類名選擇器,權值為 (0,0,2,0)

兩者一對比,在進行到第三位時,后面的 2>0,所以后者勝出,它的樣式將生效,列表顏色為紅色。

示例二

<nav id="nav"><ul><li>1</li><li>2</li><li>3</li></ul>
</nav>
nav#nav > li:hover{color: purple;
}li: nth-child(2):hover{color:pink;
}
  • 首先 nav#nav > li:hover 規則中有 1 個 ID 選擇器,2 個元素選擇器以及 1 個偽類選擇器,權值為 (0,1,1,2)

  • li: nth-child(2):hover 中,2 個偽類選擇器和 1 個類型選擇器,權值為 (0,0,2,1)

一對比,前者勝出,因為比較到第二位時,前者是 1 后者是 0。只要有大于的情況,后面的值就不用比較了。

因此列表中元素在 hover 時,會是紫色(purple)。

相關資源

  • MDN - Specificity
  • Specifishity :: Specificity with Fish
  • CSS Specificity
  • Specifics on CSS Specificity

轉載于:https://www.cnblogs.com/Wayou/p/css-specificity-calculation.html

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

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

相關文章

本地構建和自動化構建_如何構建最強大,最安全的家庭自動化系統

本地構建和自動化構建by Amir Off由Amir Off 如何構建最強大&#xff0c;最安全的家庭自動化系統 (How to build the most robust and secure home automation system) In this article, I’ll discuss how I built a Smart Home Automation System with Angular and Node.js …

leetcode990. 等式方程的可滿足性(并查集)

給定一個由表示變量之間關系的字符串方程組成的數組&#xff0c;每個字符串方程 equations[i] 的長度為 4&#xff0c;并采用兩種不同的形式之一&#xff1a;“ab” 或 “a!b”。在這里&#xff0c;a 和 b 是小寫字母&#xff08;不一定不同&#xff09;&#xff0c;表示單字母…

random對文件隨機重命名

對文件隨機重命名&#xff0c;這個用途可廣了&#xff0c;大家可以想想 echo off setlocal ENABLEDELAYEDEXPANSION for /r %%a in (*.txt) do ( set c!random! ren %%~dpnsa.txt !c!.txt) pause 本文轉自sucre03 51CTO博客&#xff0c;原文鏈接&#xff1a;http://blog…

AC日記——Periodic RMQ Problem codeforces 803G

G - Periodic RMQ Problem 思路&#xff1a; 題目給一段序列&#xff0c;然后序列復制很多次&#xff1b; 維護序列很多次后的性質&#xff1b; 線段樹動態開點&#xff1b; 來&#xff0c;上代碼&#xff1a; #include <cstdio> #include <cstring> #include <…

數據之路 - Python爬蟲 - 數據存儲

一、文件存儲 1.文件打開方式 文件打開方式說明r以只讀方式打開文件。文件的指針將會放在文件的開頭。這是默認模式rb以二進制只讀方式打開一個文件。文件指針將會放在文件的開頭r以讀寫方式打開一個文件。文件指針將會放在文件的開頭rb以二進制讀寫方式打開一個文件。文件指針…

創建react應用程序_如何使用React創建一個三層應用程序

創建react應用程序Discover Functional JavaScript was named one of the best new Functional Programming books by BookAuthority!“發現功能JavaScript”被BookAuthority評為最佳新功能編程書籍之一 &#xff01; Splitting a Single Page Application into layers has a …

linux update語句,MySQL 多表 update sql語句總結

MySQL 多表 update 有幾種不同的寫法。假定我們有兩張表&#xff0c;一張表為Product表存放產品信息&#xff0c;其中有產品價格列Price&#xff1b;另外一張表是ProductPrice表&#xff0c;我們要將ProductPrice表中的價格字段Price更新為Price表中價格字段的80%。在Mysql中我…

linux延時與定時操作

1、at ---系統延遲任務發起命令 at time >command ---任務指令 >ctrld ---發起任務 at -l ---列出延時任務Id at -r id ---刪除改id任務 at -m ---讓無輸出的命令產生郵件 at -M ---讓有輸…

windows修改PowerShell(命令提示符)默認中文編碼方式

如果以下方法都沒有作用的話&#xff0c;可以直接在代碼中調用<stdlib.h>中的system("mode con cp select65001")或者是system("chcp 65001")。當然&#xff0c;前提是你用的也是C、C、C#等強類型編程語言。 **************************************…

leetcode面試題 17.07. 嬰兒名字(并查集)

每年&#xff0c;政府都會公布一萬個最常見的嬰兒名字和它們出現的頻率&#xff0c;也就是同名嬰兒的數量。有些名字有多種拼法&#xff0c;例如&#xff0c;John 和 Jon 本質上是相同的名字&#xff0c;但被當成了兩個名字公布出來。給定兩個列表&#xff0c;一個是名字及對應…

appium+python+iOS 環境搭建與使用中常見問題的解決方案鏈接

&#xff08;1&#xff09;WebDriverAgent 安裝入門篇&#xff1a;https://www.cnblogs.com/zhanggui/p/9239827.html 重點摘要&#xff1a; 在WDA的Github上也給出了WDA的特性&#xff1a; 1.支持真機 &&模擬器 在模擬器上運行還是比較方便的&#xff0c;在真機上需要…

api工廠接口路徑是什么_為什么(幾乎)永遠不要再使用絕對路徑訪問API

api工廠接口路徑是什么by Vitaly Kondratiev通過維塔利康德拉季耶夫(Vitaly Kondratiev) 為什么(幾乎)永遠不要再使用絕對路徑訪問API (Why you should (almost) never use an absolute path to your APIs again) Recent advances in web apps architecture show that a decou…

雙機通信c語言程序,上傳一個自己編寫的I2C雙機通信程序

本帖最后由 micro_聽海 于 2012-11-24 19:58 編輯這幾天一直在搞AVR的twi(twi就是i2c)雙機通信程序&#xff0c;使用的是兩塊arduino開發板。因為最總要這個通信程序最總是要放在winavr的編譯環境中&#xff0c;所以沒有使用arduino自帶的庫函數。但是這沒關系&#xff0c;因為…

leetcode684. 冗余連接(并查集)

在本問題中, 樹指的是一個連通且無環的無向圖。 輸入一個圖&#xff0c;該圖由一個有著N個節點 (節點值不重復1, 2, …, N) 的樹及一條附加的邊構成。附加的邊的兩個頂點包含在1到N中間&#xff0c;這條附加的邊不屬于樹中已存在的邊。 結果圖是一個以邊組成的二維數組。每一…

Windows Server 2008 部署權限管理RMS

1.1 實戰&#xff1a;部署權限管理 試驗目的&#xff1a; 在單域環境中部署活動目錄權限管理服務&#xff0c;實現文檔的保護。 試驗環境&#xff1a; ? DCServer安裝Windows Server 2008企業版&#xff0c;是ess.com的域控制器&#xff0c;安裝企業CA。 ? RMSServer安裝Wind…

day5 Python爬蟲學習

一 實現京東上的自動搜索并提取信息 from selenium import webdriver # 導入鍵盤Keys from selenium.webdriver.common.keys import Keys import timedriver webdriver.Chrome()# 檢測代碼塊 try:# 隱式等待&#xff0c;等待標簽加載driver.implicitly_wait(10)# 往京東主頁…

虛擬dom添加虛擬dom_虛擬DOM緩慢。 認識記憶化的DOM

虛擬dom添加虛擬domby Sindre Osen Aarsaether通過Sindre Osen Aarsaether 虛擬DOM緩慢。 符合已記憶的DOM。 (The Virtual DOM is slow. Meet the Memoized DOM.) 超越虛擬DOM和狀態管理 (Moving beyond the Virtual DOM and State Management) The virtual DOM was a fantas…

編寫一個字節數的rtu C語言校驗程序,Modbus通信協議中CRC校驗的快速C語言算法

Modbus通信協議中CRC校驗的快速C語言算法2004年第11期            福 建 電 腦  63Modbus通信協議中CRC校驗的快速C語言算法孟開元(西安石油大學計算機學院陜西西安710065)【摘 要】 本文主要討論了Modbus通信協議的RTU幀格式中常用的錯誤校驗方法,即循環冗…

leetcode1319. 連通網絡的操作次數(并查集)

用以太網線纜將 n 臺計算機連接成一個網絡&#xff0c;計算機的編號從 0 到 n-1。線纜用 connections 表示&#xff0c;其中 connections[i] [a, b] 連接了計算機 a 和 b。 網絡中的任何一臺計算機都可以通過網絡直接或者間接訪問同一個網絡中其他任意一臺計算機。 給你這個…

Codeforces 600E Lomsat gelral (樹上啟發式合并)

題目鏈接 Lomsat gelral 占坑……等深入理解了再來補題解…… #include <bits/stdc.h>using namespace std;#define rep(i, a, b) for (int i(a); i < (b); i)typedef long long LL;const int N 600010;int n; int cc[N], col[N], sz[N], son[N]; LL ans[N];vect…