?

深入理解CSS3結構偽類選擇器

2018-05-15 02:19黃志剛
軟件工程 2018年3期
關鍵詞:選擇器

摘 要:本文從結構偽類與類選擇器的比較、結構偽類與文檔樹的關系、結構偽類的功能與應用等三個層面,深入闡述了結構偽類的作用,結構偽類所表示的文檔樹結構,結構偽類通過位置索引定位子元素的機制。通過將定位子元素的結構偽類分為帶參數和不帶參數兩類,深入論述了帶參數結構偽類的參數模式、典型應用及與不帶參數結構偽類的對應關系。

關鍵詞:選擇器;結構偽類;文檔樹;位置索引

中圖分類號:TP391 文獻標識碼:A

Abstract:The article describes deeply the function of the structural pseudo-classes,the document tree structure represented by structural pseudo-classes and structural pseudo-classes mechanism of positioning sub-element by means of position index from the aspects of the comparison of the structural pseudo-classes and class selectors,the relationship of the structural pseudo-classes and the document tree as well as the functions and applications of the structural pseudo-classes.The article discusses in detail the parameter model and typical application with parameter structural pseudo-class,the corresponding relations between structural pseudo-class with and without parameters by dividing the structural pseudo-class of positioning sub-element into two classes with and without parameters.

Keywords:selectors;structural Pseudo-classes;document tree;position index

1 引言(Introduction)

CSS(Cascading Style Sheets)即層疊樣式表,是用于控制網頁顯示效果的技術。選擇器是匹配網頁元素的模式[1],它作為樣式表的基本組成部分,用于匹配網頁中的元素。CSS3是CSS的第三個升級版本,它是一系列規范的集合。選擇器規范是CSS3系列規范中的一個,它的W3C(World Wide Web Consortium,萬維網聯盟)推薦標準是“Selectors Level 3(選擇器第三級)”。結構偽類(Structural Pseudo-classes)選擇器(規范中簡稱結構偽類)是CSS3選擇器規范新引入的一類選擇器,它基于文檔樹的結構信息匹配元素[1],功能強大、最具特色,但也較難理解和使用。

2 結構偽類與類選擇器(Structural pseudo-classes and class selectors)

在CSS3之前,為給網頁元素設置樣式,Web開發人員一般是在HTML代碼中手動給元素添加類名,然后使用CSS的類選擇器匹配元素。這樣無節制使用類名的做法,總是導致網頁文檔中類名泛濫,不僅使編碼耗時費力,而且代碼不整潔、維護困難。為改變這種狀況,HTML5規范建議,要避免為了給元素定義樣式而使用類名?;谶@種理念,CSS3引入了結構偽類,有效的減少類名的使用。以一個無序列表為例,對類選擇器和結構偽類的應用做一個比較。

2.1 使用類選擇器匹配元素

為選擇第一個列表項和最后一個列表項,首先須在文檔源代碼中給它們添加類名,然后在CSS代碼中用類選擇器匹配元素。示例代碼如下:

HTML代碼:

  • 1
  • 2
  • 3

CSS代碼:

/*通過類選擇器匹配第一個列表項*/

li.first {background-color:red;}

/*通過類選擇器匹配最后一個列表項*/

li.last {background-color:red;}

如果插入或追加列表項,則第一個或最后一個列表項會發生改變,所以,類名也要作相應變動,這給代碼維護帶來了極大的困難。

2.2 使用結構偽類匹配元素

結構偽類在插入或追加列表項時,文檔源代碼無須做任何改變,它也總是可以匹配到發生改變后的第一個和最后一個列表項。示例代碼如下:

HTML代碼:

  • 1
  • 2
  • 3

CSS代碼:

/*通過結構偽類匹配第一個列表項*/

li:first -child{background-color:red;}

/*通過結構偽類匹配最后一個列表項*/

li:last-child {background-color:red;}

從以上比較可知,使用類名會改變文檔源代碼,而且,當項目變化時,還須手動維護類名,即元素的類名的獲得是靜態分配的;但使用結構偽類,不僅無須改變文檔源代碼,而且自動跟蹤項目系列的序號變化,使元素定位更為準確、高效[2]。也就是說元素的結構偽類可以動態的獲取和失去。

3 結構偽類與文檔樹(Structural pseudo-classes & document tree)

所有的結構偽類都基于HTML文檔樹(Document Tree)的結構信息,文檔樹也稱為文檔對象模型(Document Object Model,DOM)。當創建一個HTML文檔(圖1)并用Web瀏覽器查看時,瀏覽器把文檔中元素間的嵌套關系映射為一個樹形節點層次結構,即文檔樹。圖1所示文檔可以表示為如圖2所示的文檔樹。

3.1 文檔樹結構

文檔樹由節點構成,主要有元素節點、屬性節點和文本節點,樹中的每個節點都處于文檔整體結構的某個層級(本文所說元素均指元素節點)。文檔樹中位于同一個分支的元素間的關系,有祖先后代關系、父子關系和兄弟關系。在不同的上下文中,對同一個元素的稱謂可能是父元素、子元素、祖先元素、后代元素和兄弟元素。

3.1.1 父子關系、父元素和子元素

在文檔樹的層級結構中,如果從一個元素到另一個元素的路徑,處于兩個相鄰層級,那么,這兩個元素是父子關系。位于上面層級的是父元素,位于下面層級是子元素。例如:在圖2中,元素是

元素的父元素,反之,
元素是元素的子元素。

3.1.2 祖先后代關系、祖先元素和后代元素

在文檔樹的層級結構中,如果從一個元素到另一個元素的路徑,跨越兩個或兩個以上的層級,那么,這兩個元素是祖先后代關系,在一個元素之下的所有層級的一組元素是其后代元素。一個元素的任何父元素、祖父元素、及其上層的所有元素是其祖先元素。例如:在圖2中,元素是

    元素的祖先元素,反之,
      元素是元素的后代元素。元素是所有元素的祖先元素,是HTML文檔的根元素。

      3.1.3 兄弟關系和兄弟元素

      存在于同一個層級中,具有相同父元素的元素是兄弟關系,彼此互為兄弟元素。例如:圖1中,

        元素、元素、

        元素、元素都是

        元素的子元素,是兄弟關系,互為兄弟元素。

        3.2 結構偽類中的結構信息

        CSS3定義了12個結構偽類,它們分別表示文檔樹的三種結構,定位三種元素。

        (1):root pseudo-class(根偽類),表示文檔樹的根節點,用來定位根元素。在HTML文檔中,html元素就是根元素,用來表示整個網頁。

        (2):empty pseudo-class(空偽類),表示文檔樹的空節點,用來定位空元素??展濣c是指既沒有文本子節點,也沒有元素子節點的節點,例如,在圖2中,第三個

        元素和元素就是空元素

        (3):nth-child()等其余10個結構偽類,表示文檔樹父子關系中的子元素節點,通過子元素的位置信息定位子元素。例如:在圖2中,

        元素

        有7個子元素,p:nth-child(3)表示匹配第3個子元素,而且,這個元素必須是

        元素。

        4 結構偽類功能及應用(Functions and applications

        of the structural pseudo-classes)

        CSS3中的12個結構偽類,分別定位文檔的根元素、空元素和子元素。根偽類和空偽類的應用較為簡單,其余定位子元素的結構偽類的應用較為復雜,尤其是帶參數結構偽類的應用靈活多變、較難理解。

        4.1 定位根元素

        根偽類(:root pseudo-class)用來定位文檔樹的根元素。例如,要設置整個頁面的背景顏色為藍色,則CSS代碼可寫成:

        :root {background-color: blue;} 或寫成

        html:root {background-color: blue;}

        4.2 定位空元素

        空偽類(:empty pseudo-class)用來定位文檔樹中的空元素。如果要匹配圖2中的空段落,為其設置背景顏色,則CSS代碼可寫成:

        p:empty{background-color: blue;}

        如果要匹配圖2中的所有空元素(一個

        元素和一個元素),為它們設置背景顏色,則CSS代碼可寫成:

        :empty{background-color: blue;}

        4.3 定位子元素

        匹配子元素的結構偽類共10個,可分為帶參數和不帶參數兩類。

        4.3.1 帶參數結構偽類

        帶參數結構偽類有四個,名稱均以“:nth-”為前綴,最后跟一對圓括號,可匹配一個或多個子元素。帶參數結構偽類通過建立子元素的位置索引來定位元素。下面主要以:nth-child()的應用為例,闡述帶參數結構偽類的工作機制。

        4.3.1.1 位置索引

        系統在匹配子元素時,按照子元素在兄弟元素中的相對位置,給每個子元素都設置了一個位置索引,起始值為1,需注意的是,獨立文本和非元素節點不參與位置索引的計數。不同的結構偽類,位置索引的編排規則不同。

        用:nth-child()偽類匹配子元素時,子元素位置索引的編排規則是,對所有兄弟元素從上到下順序索引,第1個子元素的位置索引為1。例如在圖2中,

        元素有7個子元素,
          元素的位置索引為1,元素的位置索引為7。

          4.3.1.2 偽類參數

          參數可以是表達式,也可以關鍵字。

          (1)表達式

          表達式的一般形式為an+b,其中,a和b是任意整型常量,n是大于等于零的整型變量,要特別注意的是,在CSS代碼中表達式中的變量一定要用字母n表示,否則無效。當n=0,1,2,...時,an+b的值構成了一個集合,其中正整數才表示一個子元素的位置索引,負整數和0是無效值,可直接忽略。當位置索引的值大于頁面中子元素的數量時,就沒有元素可選,其值也可忽略。

      91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合

例如:選擇器span:nth-child(3n-5)中,表達式3n-5的取值為{-5,-2,1,4,7,10,…},位置索引不能為零和負值,所以-5、-2無效,這個選擇器匹配的子元素的位置索引為1、4、7、10…,而且必須是元素。在圖2中,位置索引為1的是

    元素,位置索引為7的是元素,位置索引10超出了子元素的數量范圍,所以,這個選擇器只匹配到位置索引為4的元素。

    表達式an+b匹配元素的模式靈活多變,當a、b取特殊值時,出現了一些有趣的應用??梢苑謅=0和a≠0兩種情況。

    ①a=0

    當a=0,b>1時,an+b的值是一個常數,表示匹配位置索引的值為b的子元素。例如:p:nth-child(3),表達式中,a=0,b=3,表示匹配位置索引為3而且是

    元素的子元素。

    ②a≠0

    a.當a>0且b>0時

    表達式表示將兄弟元素分組,每組a個元素(最后一組為剩余元素),每組中的第b個元素被選中[1],或者說表達式表示在兄弟元素列表中,從第b個元素開始,每隔a個元素選中一個[2]。

    例如,假定圖2中

      元素擴展到10個列表項,則選擇器li:nth-child(3n+2),匹配的列表項的位置索引為{2,5,8,11,…},可以理解為將兄弟元素分成每3個一組,10個元素可分成4組,最后一組,只有一個元素,然后選中每組中的第2個元素;也可以表述為,從第2個元素開始,每隔3個元素選中一個;所以,選擇器匹配位置索引為2、5、8的列表項。

      如果要循環選中每組中的所有列表項,則選擇器可寫為:

      li:nth-child(3n+1),匹配每組中的第一個子元素;

      li:nth-child(3n+2),匹配每組中的第二個子元素;

      li:nth-child(3n+3),匹配每組中的第三個子元素。

      b.當a=1,b>0

      假設b=6,則表達式為n+6,取值集合為{6,7,8,9,…},所以,選擇器li:nth-child(n+6)將匹配位置索引大于等于6的所有元素。

      c.當a=-1,b>0

      假設b=6,則表達式為-n+6,取值集合為{6,5,4,3,…},所以,選擇器li:nth-child(-n+6)將匹配位置索引小于等于6的所有元素。

      (2)關鍵字

      關鍵字有“odd”和“even”,“odd”表示匹配位置索引為奇數的子元素,“even”表示匹配位置索引為偶數的子元素。例如,在圖2中,li:nth-child(even)將匹配到所有偶數列表項,相當于li:nth-child(2n);li:nth-child(odd)將匹配到所有奇數列表項,相當于li:nth-child(2n+1);所以,“關鍵詞”是表達式為“2n”和“2n+1”的語義化表示。

      4.3.2 其他帶參數結構偽類

      帶參數的結構偽類除:nth-child()外,還有:nth-last-child()、:nth-of-type()、:nth-last-of-type(),它們除位置索引的編排規則與:nth-child()不同之外,用法和:nth-child()相同。

      (1):nth-last-child()偽類

      :nth-last-child()偽類的位置索引的編排規則是,從倒數第一個元素開始,對所有兄弟元素建立索引。例如,在圖2中,選擇器p:nth-last-child(5),表示在所有兄弟元素中,選

      中位置索引為倒數第5個,而且是

      元素的子元素。

      (2):nth-of-type()偽類

      :nth-of-type()偽類的位置索引的編排規則是,從同類型兄弟元素中的第一個開始建立索引,元素類型由偽類前的元素選擇器決定。例如,在圖2中,選擇器p:nth-of-type(3),表示選擇第3個

      類型的兄弟元素。

      (3):nth-last-of-type()偽類

      :nth-last-of-type()偽類的位置索引的編排規則是,從倒數第一個同類型兄弟元素開始建立索引,元素類型由偽類前的元素選擇器決定。例如,在圖2中,選擇器p:nth-last-of-type(3),表示選擇倒數第3個

      類型的兄弟元素。

      4.3.3 不帶參數結構偽類

      在匹配子元素的結構偽類中,有六個不帶參數的結構偽類。本質上,它們是帶參數結構偽類取特殊數值時的快捷寫法[3],只用來匹配一個子元素。這種寫法更具語義,便于記憶。不帶參數結構偽類的功能及與不帶參數結構偽類的對應關系見表1。

      5 結論(Conclusion)

      CSS3結構偽類的引入,有效減少了HTML源代碼中類名的使用,使源代碼更加簡潔,便于維護。CSS3設計結構偽類是基于文檔樹的根節點、空節點、子節點等結構信息。CSS3結構偽類可用來匹配根元素、空元素和子元素,其中匹配子元素的結構偽類采用位置索引來定位元素,可分為帶參數和不帶參數兩類,不帶參數結構偽類本質上是帶參數結構偽類取特殊值時的語義寫法。帶參數結構偽類的參數可以是表達式an+b和關鍵字odd、even,它們都表示位置索引值的集合,通過位置索引值可定位到一個或多個子元素。

      參考文獻(References)

      [1] W3C.Selectors Level 3 W3C Candidate Recommendation 30 January 2018[EB/OL].https://www.w3.org/TR/css3-selectors.

      [2] Eric A.Meyer.CSS: The Definitive Guide[M].Published by O' Reilly Media, Inc.,June 2017:1127-11143.

      [3] CSS魔法.CSS揭秘[M].北京:人民郵電出版社,2016:178-182.

      [4] (英)弗雷恩(Frain,B.).田永強,譯.響應式Web設計:HTML5和CSS3實戰[M].北京:人民郵電出版社,2013:113-121.

      [5] 大漠.圖解CSS3核心技術與案例實戰[M].北京:機械工業出版社,2014:312-357.

      作者簡介:

      黃志剛(1965-),男,本科,高級工程師.研究領域:Web技術,大數據技術.

猜你喜歡
選擇器
74151在數據選擇和組合邏輯電路中的靈活應用
DIV+CSS網頁布局初探
四選一數據選擇器74LS153級聯方法分析與研究
一種自動飲料機的設計與實現
淺析CSS的選擇器基礎語法規則和工作原理
基于DIV+CSS技術的網頁設計研究
雙四選一數據選擇器74HC153的級聯分析及研究
基于NI Multisim 10.1數字邏輯選擇器的虛擬仿真
一種自動分析CSS的改進方法研究
面向FPGA 的低功耗多路選擇器設計方法