搜尋
首頁web前端css教學CSS3中的關係和屬性選擇器

Relational and Attribute Selectors in CSS3

以下摘錄自 Alexis Goldstein、Louis Lazaris 和 Estelle Weyl 合著的書籍《HTML5 & CSS3 for the Real World, 2nd Edition》。本書在全球各地的商店有售,您也可以在此處購買電子書版本。

核心要點

  • CSS3 選擇器允許對網頁上的元素進行精確定位,擴展了先前 CSS 版本的功能。關係選擇器和屬性選擇器是 CSS3 的關鍵特性。
  • 關係選擇器根據元素在標記中的相互關係來定位元素。這些包括後代組合器 (E F)、子組合器 (E > F)、相鄰兄弟選擇器或下一個兄弟選擇器 (E F) 和通用兄弟選擇器或後續兄弟選擇器 (E ~ F)。
  • CSS3 中的屬性選擇器允許根據元素的屬性進行匹配,CSS3 通過允許模式匹配來擴展 CSS2 的屬性選擇器。這些包括E[attr]、E[attr=val]、E[attr|=val]、E[attr~=val]、E[attr^=val]、E[attr$=val] 和E[attr* =val]。
  • 所有現代瀏覽器都支持 CSS3 選擇器,包括 IE9 及更高版本。使用這些選擇器可以大大提高網頁設計和開發的效率和有效性。

CSS3 選擇器

CSS 選擇器是 CSS 的核心。如果沒有選擇器來定位頁面上的元素,修改元素 CSS 屬性的唯一方法是使用元素的 style 屬性並內聯聲明樣式,這既笨拙又難以維護。因此我們使用選擇器。最初,CSS 允許按類型、類和/或 ID 匹配元素。這需要向我們的標記中添加類和 ID 屬性來創建掛鉤,並區分相同類型的元素。 CSS2.1 添加了偽元素、偽類和組合器。使用 CSS3,我們可以使用各種選擇器來定位頁面上的幾乎任何元素。

在下面的描述中,我們將包含早期 CSS 版本中提供給我們的選擇器。之所以包含它們,是因為雖然我們可以使用 CSS3 選擇器,但早於 CSS3 的選擇器也是 CSS 選擇器級別 3 規範的一部分,並且仍然受支持,因為 CSS 選擇器級別 3 擴展了它們。即使對於那些已經存在相當一段時間的選擇器,也值得在這裡回顧一下,因為舊規範中有一些鮮為人知的隱藏的寶石。請注意,所有現代瀏覽器(包括 IE9 及更高版本)都支持所有 CSS3 選擇器。

關係選擇器

關係選擇器根據元素在標記中的相互關係來定位元素。所有這些都從 IE7 開始支持,並且在所有其他主要瀏覽器中都支持:

後代組合器 (E F)

您一定應該熟悉這個。後代選擇器定位任何作為元素 E 的後代(子元素、孫元素、曾孫元素等)的元素 F。例如,ol li 定位位於有序列表內的 li 元素。這將包括嵌套在 ol 中的 ul 中的 li 元素,這可能不是您想要的。

子組合器 (E > F)

此選擇器匹配任何作為元素 E 的直接子元素的元素 F——任何進一步嵌套的元素都將被忽略。繼續上面的例子,ol > li 只會定位直接位於 ol 內的 li 元素,並將忽略嵌套在 ul 內的那些元素。

相鄰兄弟選擇器或下一個兄弟選擇器 (E F)

這將匹配任何與 E 共享相同父元素的元素 F,並且在標記中直接位於 E 之後。例如,li li 將定位給定容器中的所有 li 元素,除了第一個 li 元素。

通用兄弟選擇器或後續兄弟選擇器 (E ~ F)

這個有點棘手。它將匹配任何與任何 E 共享相同父元素並在標記中位於其之後的元素 F。因此,h1 ~ h2 將匹配任何位於 h1 之後的 h2,只要它們都共享相同的直接父元素——也就是說,只要 h2 沒有嵌套在任何其他元素中。

讓我們來看一個簡單的例子:

<header>
  <h1 id="Main-title">Main title</h1>
  <h2 id="This-subtitle-is-matched">This subtitle is matched</h2>
</header>
<article>
  <p>blah, blah, blah …</p>
  <h2 id="This-is-not-matched-by-h-h-but-is-by-header-h">This is not matched by h1 ~ h2, but is by header ~ h2</h2>
  <p>blah, blah, blah …</p>
</article>

選擇器字符串 h1 ~ h2 將匹配第一個 h2,因為 h1 和 h2 都是 header 的子元素或直接後代。您將在代碼片段中看到的下一個 h2 不匹配,因為它的父元素是 article,而不是 header。但是,它將匹配 header ~ h2。類似地,h2 ~ p 只匹配最後一個段落,因為第一個段落位於它與父元素 article 共享的 h2 之前。

注意:為什麼沒有“父”選擇器?

您會注意到,到目前為止,還沒有“父”或“祖先”選擇器,也沒有“前置兄弟”選擇器。瀏覽器必須向後遍歷 DOM 樹或在決定是否應用樣式之前遞歸到嵌套元素集的性能,阻止了擁有原生“向上遍歷 DOM 樹”選擇器的能力。

jQuery 包含 :has() 作為祖先選擇器。此選擇器正在考慮用於 CSS 選擇器級別 4,但尚未在任何瀏覽器中實現。如果並當它被實現時,我們將能夠使用E:has(F) 來查找具有F 作為後代的E,E:has(> F) 來查找具有F 作為直接子元素的E,E:has( F ) 來查找直接位於兄弟F 之前的E,以及類似的。

瀏覽《The HTML5 Herald》的樣式表,您會看到我們在許多地方使用了這些選擇器。例如,在確定站點的整體佈局時,我們希望三個列的 div 向左浮動。為了避免將此樣式應用於嵌套在其內部的任何其他 div,我們使用子選擇器:

main > div {
  float: left;
  overflow: hidden;
}

隨著我們在接下來的幾章中向站點添加新樣式,您將看到許多此類選擇器類型。

屬性選擇器

CSS2 引入了幾個屬性選擇器。這些允許根據元素的屬性進行匹配。 CSS3 擴展了這些屬性選擇器,允許基於模式匹配進行一些定位。 CSS 選擇器級別 4 添加了一些更多內容:

E[attr] 匹配任何具有屬性 attr 的元素 E,而不管屬性的值如何。我們在第 4 章中使用了它來設置必需輸入的樣式;input:required 在最新的瀏覽器中有效,但 input[required] 也具有相同的效果,並且在 IE7 和 IE8 中也有效。

E[attr=val] 匹配任何具有屬性 attr 且其值為 val 的元素 E。雖然不是新的,但在定位表單輸入類型時它很有用;例如,使用 input[type=checkbox] 定位複選框。

E[attr|=val] 匹配任何其屬性 attr 的值為 val 或以 val- 開頭的元素 E。這最常用於 lang 屬性。例如,p[lang|="en"] 將匹配任何被定義為英語的段落,無論是英國英語還是美國英語,使用

E[attr~=val] 匹配任何其屬性 attr 的值中包含完整單詞 val(由空格包圍)的元素 E。例如,.info[title~=more] 將匹配任何具有類 info 且標題屬性包含單詞“more”的元素,例如“單擊此處了解更多信息”。

E[attr^=val] 匹配任何其屬性 attr 以值 val 開頭的元素 E。換句話說,val 與屬性值的開頭匹配。

E[attr$=val] 匹配任何其屬性 attr 以 val 結尾的元素 E。換句話說,val 與屬性值的結尾匹配。

E[attr=val] 匹配任何其屬性 attr 在任何位置與 val 匹配的元素 E。它類似於 E[attr~=val],只是 val 可以是單詞的一部分。使用與之前相同的示例,.fakelink[title=info] {} 將匹配任何具有類 fakelink 且標題屬性包含字符串 info 的元素,例如“單擊此處了解更多信息”。

在這些屬性選擇器中,對於 HTML 中區分大小寫的 value,val 的值區分大小寫。例如,input[class^="btn"] 區分大小寫,因為類名區分大小寫,但 input[type="checkbox"] 不區分大小寫,因為 type 值在 HTML 中不區分大小寫。

如果值是字母數字的,則不必引用值,但有一些例外。空字符串、以數字開頭的字符串、兩個連字符和其他一些特殊情況需要用引號括起來。由於存在例外情況,因此養成始終為需要引號的情況包含引號的習慣是一個好主意。

在 CSS 選擇器級別 4 中,我們可以通過在結束括號之前包含一個 i 來實現不區分大小寫,E[attr*=val i]。

CSS3 中關係選擇器和屬性選擇器的常見問題

CSS3 中關係選擇器和屬性選擇器有什麼區別?

CSS3 中的關係選擇器用於根據元素與 HTML 文檔中其他元素的關係來選擇元素。例如,子元素、後代、相鄰兄弟和通用兄弟選擇器都是關係選擇器的類型。另一方面,屬性選擇器用於根據元素的屬性或屬性值來選擇元素。例如,您可以使用屬性選擇器選擇所有類型屬性為“text”的輸入元素。

如何在 CSS3 中使用子組合器?

CSS3 中的子組合器由“>”符號表示。它用於選擇特定元素的直接子元素。例如,如果您想選擇具有類“parent”的父元素的所有直接子 div 元素,則應編寫如下 CSS:

.parent > div { /* CSS 属性在此处 */ }

我可以在 CSS3 中使用多個屬性選擇器嗎?

是的,您可以在 CSS3 中使用多個屬性選擇器。這允許您選擇滿足多個屬性條件的元素。例如,如果您想選擇所有類型屬性為“text”且名稱屬性為“username”的輸入元素,則應編寫如下 CSS:

input[type="text"][name="username"] { /* CSS 属性在此处 */ }

CSS3 中相鄰兄弟組合器的用途是什麼?

CSS3 中的相鄰兄弟組合器由“ ”符號表示。它用於選擇直接位於另一個特定元素之後的元素,並且這兩個元素共享相同的父元素。例如,如果您想選擇直接位於 p 元素之後的 div 元素,則應編寫如下 CSS:

p div { /* CSS 属性在此处 */ }

如何在 CSS3 中選擇具有特定屬性值的元素?

要在 CSS3 中選擇具有特定屬性值的元素,請使用帶方括號的屬性選擇器、屬性名稱和值。例如,如果您想選擇所有類型屬性為“text”的輸入元素,則應編寫如下 CSS:

input[type="text"] { /* CSS 属性在此处 */ }

我可以在 CSS3 中組合關係選擇器和屬性選擇器嗎?

是的,您可以在 CSS3 中組合關係選擇器和屬性選擇器。這允許您根據元素與其他元素的關係及其屬性來選擇元素。例如,如果您想選擇具有類“form”的表單元素的所有直接子輸入元素,其中輸入元素的類型屬性為“text”,則應編寫如下 CSS:

form.form > input[type="text"] { /* CSS 属性在此处 */ }

CSS3 中的通用兄弟組合器是什麼?

CSS3 中的通用兄弟組合器由“~”符號表示。它用於選擇特定元素的兄弟元素,而不管它們在 HTML 文檔中的順序如何。例如,如果您想選擇 p 元素的所有兄弟 div 元素,則應編寫如下 CSS:

p ~ div { /* CSS 属性在此处 */ }

如何在 CSS3 中選擇不具有特定屬性的元素?

要在 CSS3 中選擇不具有特定屬性的元素,請使用帶有屬性選擇器的 :not() 偽類。例如,如果您想選擇所有類型屬性不為“submit”的輸入元素,則應編寫如下 CSS:

input:not([type="submit"]) { /* CSS 属性在此处 */ }

我可以在 CSS3 中將關係選擇器與偽類結合使用嗎?

是的,您可以在 CSS3 中將關係選擇器與偽類結合使用。這允許您根據元素與其他元素的關係及其狀態來選擇元素。例如,如果您想選擇導航元素的所有直接子 a 元素,這些元素正在被懸停,則應編寫如下 CSS:

nav > a:hover { /* CSS 属性在此处 */ }

如何在 CSS3 中選擇包含特定值的特定屬性的元素?

要在 CSS3 中選擇包含特定值的特定屬性的元素,請使用帶方括號的屬性選擇器、屬性名稱和值以及 *= 運算符。例如,如果您想選擇所有 href 屬性包含“example”的 a 元素,則應編寫如下 CSS:

a[href*="example"] { /* CSS 属性在此处 */ }

以上是CSS3中的關係和屬性選擇器的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
@KeyFrames vs CSS過渡:有什麼區別?@KeyFrames vs CSS過渡:有什麼區別?May 14, 2025 am 12:01 AM

@keyframesandCSSTransitionsdifferincomplexity:@keyframesallowsfordetailedanimationsequences,whileCSSTransitionshandlesimplestatechanges.UseCSSTransitionsforhovereffectslikebuttoncolorchanges,and@keyframesforintricateanimationslikerotatingspinners.

使用頁面CMS進行靜態站點內容管理使用頁面CMS進行靜態站點內容管理May 13, 2025 am 09:24 AM

我知道,我知道:有大量的內容管理系統選項可用,而我進行了幾個測試,但實際上沒有一個是一個,y&#039;知道嗎?怪異的定價模型,艱難的自定義,有些甚至最終成為整個&

鏈接HTML中CSS文件的最終指南鏈接HTML中CSS文件的最終指南May 13, 2025 am 12:02 AM

鏈接CSS文件到HTML可以通過在HTML的部分使用元素實現。 1)使用標籤鏈接本地CSS文件。 2)多個CSS文件可通過添加多個標籤實現。 3)外部CSS文件使用絕對URL鏈接,如。 4)確保正確使用文件路徑和CSS文件加載順序,優化性能可使用CSS預處理器合併文件。

CSS Flexbox與網格:全面評論CSS Flexbox與網格:全面評論May 12, 2025 am 12:01 AM

選擇Flexbox還是Grid取決於佈局需求:1)Flexbox適用於一維佈局,如導航欄;2)Grid適合二維佈局,如雜誌式佈局。兩者在項目中可結合使用,提升佈局效果。

如何包括CSS文件:方法和最佳實踐如何包括CSS文件:方法和最佳實踐May 11, 2025 am 12:02 AM

包含CSS文件的最佳方法是使用標籤在HTML的部分引入外部CSS文件。 1.使用標籤引入外部CSS文件,如。 2.對於小型調整,可以使用內聯CSS,但應謹慎使用。 3.大型項目可使用CSS預處理器如Sass或Less,通過@import導入其他CSS文件。 4.為了性能,應合併CSS文件並使用CDN,同時使用工具如CSSNano進行壓縮。

Flexbox vs Grid:我應該學習兩者嗎?Flexbox vs Grid:我應該學習兩者嗎?May 10, 2025 am 12:01 AM

是的,youshouldlearnbothflexboxandgrid.1)flexboxisidealforone-demensional,flexiblelayoutslikenavigationmenus.2)gridexcelstcelsintwo-dimensional,confffferDesignssignssuchasmagagazineLayouts.3)blosebothenHancesSunHanceSlineHancesLayOutflexibilitibilitibilitibilitibilityAnderibilitibilityAndresponScormentilial anderingStruction

軌道力學(或我如何優化CSS KeyFrames動畫)軌道力學(或我如何優化CSS KeyFrames動畫)May 09, 2025 am 09:57 AM

重構自己的代碼看起來是什麼樣的?約翰·瑞亞(John Rhea)挑選了他寫的一個舊的CSS動畫,並介紹了優化它的思維過程。

CSS動畫:很難創建它們嗎?CSS動畫:很難創建它們嗎?May 09, 2025 am 12:03 AM

CSSanimationsarenotinherentlyhardbutrequirepracticeandunderstandingofCSSpropertiesandtimingfunctions.1)Startwithsimpleanimationslikescalingabuttononhoverusingkeyframes.2)Useeasingfunctionslikecubic-bezierfornaturaleffects,suchasabounceanimation.3)For

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。