CSS :is () 與 :where ():簡化復雜選擇器的 “語法糖”

在 CSS 編寫中,你是否遇到過這樣的場景:需要給多個不同父元素下的子元素設置相同樣式,結果寫出一長串重復的選擇器?比如給headermainfooter中的p標簽設置相同的顏色,傳統寫法可能是header p, main p, footer p { color: #333; }。這樣的代碼不僅冗長,還容易出錯。而 CSS 新增的:is():where()偽類,就像兩把 “簡化神器”,能將復雜的選擇器合并成簡潔的形式,讓代碼更易讀、易維護。今天,我們就來解鎖這兩個提升 CSS 效率的 “語法糖”。

一、認識 :is () 與 :where ():選擇器的 “合并工具”

:is():where()都是 CSS Selectors Level 4 規范中引入的偽類,它們的核心功能相同:接收一個選擇器列表作為參數,匹配列表中任意一個選擇器能匹配的元素。簡單說,就是將多個選擇器 “合并” 成一個,避免重復書寫。

1.1 基礎語法:化繁為簡的選擇邏輯

/* 傳統寫法:多個選擇器重復部分 */
header h1,
header h2,
header h3 {color: #222;
}/* :is() 簡化寫法 */
header :is(h1, h2, h3) {color: #222;
}/* :where() 簡化寫法 */
header :where(h1, h2, h3) {color: #222;
}

可以看到,:is(h1, h2, h3)等價于h1, h2, h3,但與前面的header結合后,代碼從三行精簡為一行,且避免了重復書寫header

1.2 解決的核心問題:減少選擇器冗余

在復雜布局中,選擇器可能包含多層嵌套,此時:is():where()的優勢更加明顯:

/* 傳統寫法:冗長且重復 */
section .title,
article .title,
aside .title,
nav .title {font-weight: bold;margin-bottom: 1rem;
}/* 簡化寫法:用 :is() 合并父元素 */
:is(section, article, aside, nav) .title {font-weight: bold;margin-bottom: 1rem;
}

這種簡化不僅讓代碼更短,還降低了修改成本 —— 如果需要添加或移除一個父元素(如footer),只需在:is()的參數中操作一次,無需修改多個選擇器。

二、:is () 與 :where () 的核心區別:優先級不同

:is():where()的功能幾乎完全相同,但有一個關鍵區別:優先級計算方式不同

  • :is():它的優先級等于參數列表中優先級最高的選擇器的優先級。

  • :where():它的優先級始終為0(最低優先級),不會影響整體選擇器的優先級。

2.1 優先級對比示例

/* 基礎樣式 */
.text {color: black;
}/* :where() 選擇器:優先級 0 */
:where(.container) .text {color: blue;
}/* :is() 選擇器:優先級由 .container 決定(10) */
:is(.container) .text {color: red;
}
<div class="container"><p class="text">這段文字是什么顏色?</p>
</div>

結果:文字最終為紅色。原因是:

  • :where(.container) .text的優先級是0 + 10.text的優先級)= 10。

  • :is(.container) .text的優先級是10.container的優先級) + 10.text的優先級)= 20,高于前者。

  • 因此:is()的樣式會覆蓋:where()的樣式。

2.2 優先級應用場景

  • 需要保持低優先級時,用:where():比如通用組件庫的樣式,希望用戶能輕松覆蓋。

  • 需要繼承高優先級時,用:is():比如項目中的特定樣式,不希望被輕易覆蓋。

/* 組件庫樣式:用 :where() 確保低優先級,方便用戶覆蓋 */
:where(.btn) {padding: 0.5rem 1rem;border: none;
}/* 項目樣式:用 .btn 即可覆蓋(優先級 10 > 0) */
.btn {padding: 0.6rem 1.2rem;
}

三、進階用法:嵌套與復雜選擇器處理

:is():where()支持嵌套,還能處理包含組合選擇器(如后代、子元素、相鄰兄弟等)的場景,進一步簡化代碼。

3.1 嵌套使用:多層選擇器合并

/* 傳統寫法:多層嵌套的重復選擇器 */
header nav ul li a,
header nav ul li span,
footer nav ul li a,
footer nav ul li span {color: #666;
}/* 簡化寫法:嵌套 :is() */
:is(header, footer) nav ul li :is(a, span) {color: #666;
}

3.2 處理組合選擇器:后代、子元素、偽類等

/* 傳統寫法:多個偽類選擇器 */
.card:hover .title,
.card:focus-within .title,
.card:active .title {transform: scale(1.05);
}/* 簡化寫法:用 :is() 合并偽類 */
.card:is(:hover, :focus-within, :active) .title {transform: scale(1.05);
}

3.3 配合否定偽類 :not () 使用

:is():where()可以與:not()結合,實現更靈活的排除邏輯:

/* 選擇除了 h1、h2 之外的標題元素 */
:is(h1, h2, h3, h4, h5, h6):not(:is(h1, h2)) {font-size: 1.2rem;
}/* 等價于 */
h3,
h4,
h5,
h6 {font-size: 1.2rem;
}

四、實戰案例:讓 CSS 代碼更簡潔

4.1 響應式布局:簡化媒體查詢中的選擇器

在響應式布局中,不同斷點下可能需要給多個元素設置相同樣式,:is()可以減少重復:

/* 傳統寫法:斷點中重復的選擇器 */
@media (max-width: 768px) {header .logo,header .nav,footer .logo,footer .nav {flex-direction: column;}
}/* 簡化寫法:用 :is() 合并 */
@media (max-width: 768px) {:is(header, footer) :is(.logo, .nav) {flex-direction: column;}
}

4.2 通用樣式重置:用 :where () 降低優先級

在樣式重置(Reset CSS)中,使用:where()可以確保重置樣式的優先級最低,方便后續覆蓋:

/* 傳統重置:優先級可能過高,難以覆蓋 */
ul,
ol,
menu {margin: 0;padding: 0;list-style: none;
}/* 用 :where() 重置:優先級 0,易覆蓋 */
:where(ul, ol, menu) {margin: 0;padding: 0;list-style: none;
}/* 后續樣式可以輕松覆蓋(優先級 10 > 0) */
.custom-list {margin: 1rem 0;list-style: disc;
}

4.3 組件樣式:用 :is () 統一處理多種狀態

在組件設計中,一個組件可能有多種狀態(如默認、禁用、加載中),:is()可以合并這些狀態的選擇器:

/* 按鈕組件的多種狀態樣式 */
.btn:is(:disabled, .loading) {opacity: 0.7;cursor: not-allowed;pointer-events: none;
}/* 等價于 */
.btn:disabled,
.btn.loading {opacity: 0.7;cursor: not-allowed;pointer-events: none;
}

五、避坑指南:使用時的注意事項

5.1 瀏覽器兼容性

:is():where()兼容所有現代瀏覽器(Chrome 88+、Firefox 78+、Safari 14+、Edge 88+),但需要注意:

  • 早期瀏覽器可能需要帶前綴的版本(如:-webkit-any():-moz-any()),但現在已基本淘汰。

  • IE 完全不支持,如需兼容 IE,需避免使用或通過 PostCSS 等工具轉譯。

5.2 避免選擇器范圍過大

:is():where()會匹配參數列表中的所有選擇器,若范圍過大可能導致意外匹配:

/* 問題:會匹配所有 div 中的 p,包括嵌套在其他元素中的 div */
:is(div) p {color: red;
}/* 優化:明確父元素范圍 */
.container:is(div) p {color: red;
}

5.3 注意優先級陷阱

:is()的優先級由參數中優先級最高的選擇器決定,可能導致樣式覆蓋不符合預期:

/* :is() 的優先級由 #id 決定(100) */
:is(.class, #id) p {color: blue;
}/* 這個選擇器的優先級是 10(.class)+ 10(p)= 20,會被上面覆蓋 */
.class p {color: red;
}

解決方法:了解:is()的優先級計算規則,必要時用更具體的選擇器覆蓋。

六、總結

:is():where()作為 CSS 中的 “語法糖”,雖然沒有引入新的功能,但顯著提升了代碼的簡潔性和可維護性。它們的核心價值在于:

  • 簡化代碼:將重復的選擇器合并,減少冗余,讓 CSS 更易讀。

  • 降低維護成本:修改選擇器時只需操作一次,避免遺漏。

  • 靈活控制優先級:where()的低優先級適合通用樣式,:is()的動態優先級適合特定樣式。

在實際開發中,建議:

  • 寫通用組件庫或樣式重置時,優先用:where(),方便用戶覆蓋。

  • 寫項目特定樣式時,根據優先級需求選擇:is():where()

  • 處理多層嵌套或多狀態選擇器時,用它們合并重復部分,提升代碼質量。

如果你還在為冗長的 CSS 選擇器煩惱,不妨試試:is():where()—— 這兩個小小的 “語法糖”,可能會讓你的 CSS 代碼變得清爽許多。

你在項目中用過:is():where()嗎?歡迎在評論區分享你的使用心得~

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

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

相關文章

vue打包號的文件如何快速查找文件打包后的位置

解析“explorer yz-front-dist”&#xff1a;前端開發者的實用命令小知識 在前端開發的日常工作中&#xff0c;我們經常會接觸到各種命令行操作&#xff0c;其中“explorer yz-front-dist”是一個看似簡單卻暗藏實用價值的命令。對于剛接觸開發的新手來說&#xff0c;理解它的含…

Go語言數據類型深度解析:位、字節與進制

Go語言數據類型深度解析&#xff1a;位、字節與進制 在計算機編程中&#xff0c;數據類型是構建一切的基礎。理解不同數據類型的特性、內存占用以及在不同場景下的應用&#xff0c;對于編寫高效、可靠的代碼至關重要。 本文將深入探討Go語言中的數據類型系統&#xff0c;重點講…

計算機視覺(opencv)——圖像本質、數字矩陣、RGB + 基本操作(實戰一)

OpenCV 入門教程&#xff1a; OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一個開源的計算機視覺庫&#xff0c;廣泛應用于圖像處理、視頻分析、機器學習等領域。 在 Python 中&#xff0c;cv2 是 OpenCV 的主要接口模塊。本文將帶你一步步掌握 cv2…

【數據庫】使用Sql Server創建索引優化查詢速度,一般2萬多數據后,通過非索引時間字段排序查詢出現超時情況

大家好&#xff0c;我是全棧小5&#xff0c;歡迎來到《小5講堂》。 這是《Sql Server》系列文章&#xff0c;每篇文章將以博主理解的角度展開講解。 溫馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不對之處望指正&#xff01; 目錄前言SQL 創建索引…

MyBatis聯合查詢

文章目錄數據庫設計MyBatis 配置MyBatis 映射文件Mapper 接口總結數據庫設計 建表 SQL CREATE TABLE user (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50) NOT NULL );CREATE TABLE order (id INT PRIMARY KEY AUTO_INCREMENT,user_id INT NOT NULL,order_no VARCHAR(…

項目中使用的設計模式

項目中使用的設計模式請列舉幾個項目中常用的設計模式什么是設計模式&#xff0c;在項目中使用了那些設計模式動態代理模式JDK動態代理CGLIB動態代理單例模式懶漢式&#xff08;非線程安全&#xff09;餓漢式懶漢式&#xff08;線程安全&#xff09;工廠模式觀察者模式裝飾器模…

實戰教程:從“對象文件為空“到倉庫重生——修復 Git 倉庫損壞全記錄

文章目錄實戰教程&#xff1a;從"對象文件為空"到倉庫重生——修復 Git 倉庫損壞全記錄案發現場&#xff1a;一個嚴重損壞的倉庫修復之旅&#xff1a;四步讓倉庫重獲新生準備工作&#xff1a;創建安全備份第 1 步&#xff1a;清理戰場——刪除所有空對象第 2 步&…

ansible 操作家族(ansible_os_family)信息

1. 操作系統系列 &#xff08;ansible_os_family&#xff09;ansible web -m setup -a filteransible_os_family2. 操作系統家族為 RedHat 時執行任務--- - hosts: websrvsremote_user: roottasks:- name: Install package on RedHat systemsyum:name: httpdstate: presentwhen…

一文學會c++繼承 組合

文章目錄繼承簡介定義訪問限定符和繼承方式?基類派生類賦值轉換繼承的作用域派生類的默認成員函數繼承與友元繼承與靜態成員?復雜的菱形繼承虛擬繼承組合繼承簡介 繼承是面向對象程序設計代碼復用的重要手段&#xff0c;使得程序員可以在保持原類的基礎上擴展&#xff0c;新…

.Net下載共享文件夾中的文件

由于IIS站點權限等問題&#xff0c;總是沒找到處理辦法&#xff0c;所以改用外掛的winform的方式來下載共享文件&#xff08;也可以改為使用windows服務的方式&#xff09;。 前提需要先在資源管理器中登錄到共享文件夾&#xff0c;確保系統能訪問。 服務端代碼 (.NET后端) usi…

目標檢測數據集 - 眼睛瞳孔檢測數據集下載「包含COCO、YOLO兩種格式」

數據集介紹&#xff1a;眼睛瞳孔檢測數據集&#xff0c;真實采集高質量人臉眼部圖片數據&#xff0c;適用于人臉定位、人臉疾病如白內障等疾病的視覺檢測。數據標注標簽包括 eyepupil 瞳孔一 個缺陷類別&#xff1b;適用實際項目應用&#xff1a;眼睛瞳孔檢測項目&#xff0c;以…

Keil MDK-ARM V5.42a 完整安裝教程

文章目錄一、安裝前期準備二、Keil MDK-ARM 主程序安裝三、器件支持包&#xff08;Pack&#xff09;安裝四、許可證激活五、安裝驗證Keil MDK&#xff08;Microcontroller Development Kit&#xff09;是針對 Arm Cortex-M 系列微控制器的專業開發環境&#xff0c;集成了 μVis…

WPF中引用其他元素各種方法

在WPF中&#xff0c;引用其他元素的方式有多種&#xff0c;每種方式適用于不同場景&#xff0c;各有優缺點。除了x:Reference&#xff0c;常用的還有以下幾種&#xff1a; 一、ElementName 綁定&#xff08;最常用的XAML綁定方式&#xff09; 通過元素的x:Name屬性引用同一作用…

Python生成統計學公式

一元線性回歸模型 2.1回歸分析概述/25 一、回歸分析基本概念/25 二、總體回歸函數/27 三、隨機誤差項/29 四、樣本回歸函數/30 2.2 一元線性回歸模型的參數估計/32 一、參數估計的普通最小二乘法/32 二、擬合優度/35 2.3基本假設與普通最小二乘估計量的統計性質/36 一、一元線性…

網絡工程師--華為命令專題

一、交換機 交換機分類&#xff1a;1.根據交換方式劃分&#xff1a;&#xff08;1&#xff09;存儲轉發式交換&#xff08;Store and Forward&#xff09;&#xff08;2&#xff09;直通式交換&#xff08;Cut-through&#xff09;&#xff08;3&#xff09;碎片過濾式交換&…

判斷可編輯div的光標是否在最前面

要判斷一個可編輯div(contenteditable)中的光標是否位于最前面&#xff0c;可以使用以下幾種方法&#xff1a; 方法一&#xff1a;使用Selection和Range API function isCaretAtStart(div) {const selection window.getSelection();if (selection.rangeCount 0) return false…

【unity實戰】使用Unity程序化生成3D隨機地牢(附項目源碼)

最終效果 文章目錄最終效果前言1、理解程序生成的核心概念2、種子值的核心作用3、程序生成的實際應用4、主流程序生成技術概覽5、選擇合適的技術實戰1、素材2、生成一面墻變換矩陣數據3、渲染墻壁4、加點隨機不同的墻壁效果5、繪制四面墻壁4、在四個角落生成支柱5、生成地板6、…

多賬號管理方案:解析一款免Root的App分身工具

之前有小伙伴問阿燦有沒有可以軟件分身的免費軟件&#xff0c;后來阿燦找到了一款可以無限分身的app感覺很實用&#xff0c;只有10M大小 02軟件介紹說白了它能給各種app和游戲做分身&#xff0c;包括V信、qQ、某音、某付寶這些&#xff0c;而且支持最新的安卓15系統。每個分身…

(附源碼)基于PHP和Vue的網上購物平臺

內容摘要 內容摘要: 隨著互聯網技術的迅猛發展&#xff0c;網上購物已成為人們日常生活的重要組成部分。本文圍繞PHPVue技術棧構建的網上購物平臺展開研究&#xff0c;深入探討了該平臺的架構設計與實現細節。平臺前端采用Vue框架&#xff0c;利用其組件化開發和數據驅動的特性…

51單片機

中斷系統1.什么是中斷當CPU正在處理某件事的時候外界發生了緊急事件請求&#xff0c;要求CPU暫停當前的工作&#xff0c;轉而去處理這個緊急事件&#xff0c;處理完以后&#xff0c;再回到原來被中斷的地方&#xff0c;繼續原來的工作&#xff0c;這樣的過程稱為中斷2.為什么要…