iT邦幫忙

1

[快速入門前端 12] CSS 選擇器 (2) 複合選擇器 — 後代選擇器及兄弟選擇器

  • 分享至 

  • xImage
  •  

元素間的關係

除了我們之前講到的交集、併集選擇器外,複合選擇器還有後代、兄弟、子選擇器等依照元素間結構關係來選取到該元素的選擇器,所以在講接下來的選擇器之前我們先來簡單介紹一下 HTML 元素之間的關係。

在下面這段程式中我們可以看到結構為 <div> 包裹著 <form<a><span>,而 <form> 標籤中又包含兩個 <input>

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
  </head>
  <body>
    <div>
        <form> 
            <input type="text" name="userName">
            <input type="button" value="button">
        </form>
        <a>test 123</a>
        <span>test 456</span>
    </div>
  </body>
</html>

從最外層的結構來看,<div>包著三個標籤,所以我們稱 <form><a><span> 為子元素,而 div 為他們的父元素。除此之外,在同一層的元素被稱為兄弟元素,所以這邊的 <form><a><span> 互為兄弟元素。
https://ithelp.ithome.com.tw/upload/images/20230517/20158509cLBl2l7JZU.jpg

其實 HTML 的結構關係就像是家庭的關係,有父子、兄弟、祖先和後代,下圖是同一段程式碼的下一層解析。我們可以看到 <input> 是在 <div> 的子元素 <form> 中,所以對 <div> 來說,<input> 是他的後代元素 (在結構關係中不論是子元素、孫子元素、曾孫元素...等都被稱為後代元素);而反過來 <div><input> 的祖先元素。
https://ithelp.ithome.com.tw/upload/images/20230517/20158509z2fUl9o3n0.jpg

後代選擇器

後代選擇器的功能顧名思義就是選中元素中符合條件的後代元素,這邊的後代元素包含子元素,可以理解為 ... 中的元素,例如 div p .red 可以解釋為選擇 div 中的 p 標籤中的擁有 red 這個 class 的元素

語法:

元素1 元素2 元素3... 元素n { /* 元素必須由外層寫到內層 */
  屬性名: 屬性值;
}

範例:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <style>
      div a { /* 選擇 div 中的 a */
        color: red;
      }
    </style>
  </head>
  <body>
    <div>
        <a>123我要變紅色</a> <!-- 變紅色 -->
    </div>
    <a>我會變成紅色嗎? 不會</a> <!-- 不符合 div a 這個選擇器,不會變色 -->
  </body>
</html>

子選擇器

子選擇器的規則比後代選擇器更加嚴謹,只會選中元素的子元素,其他後代不受影響。

語法:

元素1 > 元素2 > 元素3... > 元素n { /* 元素必須由外層寫到內層 */
  屬性名: 屬性值;
}

範例:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <style>
        .block > a { /* 選擇 div 中的子元素 a */
            color: red;
        }
    </style>
  </head>
  <body>
    <div class="block">
        <a>123我要變紅色</a> <!-- 是 .block 的兒子,會變紅色 -->
        <div>
            <a>我是兒子還是孫子?</a> <!-- 是 .block 的孫子,不會變色 -->
        </div>
        <span>我是兒子但我不是 a</span> <!-- 符合子元素,但不符合標籤為 a,不會變色 -->
    </div>
    <a>我會變成紅色嗎? 不會</a> <!-- 不符合 div a 這個選擇器,不會變色 -->
  </body>
</html>

兄弟選擇器

兄弟選擇器會選擇該元素符合條件的兄弟元素,主要分為通用兄弟選擇器及相鄰兄弟選擇器,比較特別的是兄弟選擇器只會選擇到該元素之後的兄弟元素 (如範例)。

  • 通用兄弟選擇器:選擇某元素後的所有兄弟元素
  • 相鄰兄弟選擇器:選擇某元素後的第一個兄弟元素

語法:

/* 通用兄弟選擇器 */
元素1 ~ 元素2 { /* 元素2必須是元素1後面的兄弟元素 */
  屬性名: 屬性值;
}

/* 相鄰兄弟選擇器 */
元素1 + 元素2 { /* 元素2必須是元素1後面的第一個兄弟元素 */
  屬性名: 屬性值;
}

通用兄弟元素範例:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <style>
        h1 ~ a {
            color: red;
        }
    </style>
  </head>
  <body>
    <a>我也是兄弟但我在前面</a> <!-- h1 元素前面的兄弟元素不會變色 -->
    <h1>我是標題</h1>
    <a>123</a>
    <div>
        <a>我會變色嗎?</a> <!-- h1 的兄弟 div 的子元素不會變色 -->
    </div>
    <a>123</a>
    <a>123</a>
  </body>
</html>

相鄰兄弟元素範例:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <style>
        h1 + a {
            color: red;
        }
    </style>
  </head>
  <body>
    <a>我也是兄弟但我在前面</a>
    <h1>我是標題</h1>
    <a>123</a> <!-- 只有這個元素符合 h1 後面的第一個兄弟元素 a -->
    <div>
        <a>我會變色嗎?</a>
    </div>
    <a>123</a>
    <a>123</a>
  </body>
</html>


上一篇:[快速入門前端 11] CSS 選擇器 (2) 複合選擇器 — 交集和併集
下一篇:[快速入門前端 13] CSS 選擇器 (3) Pseudo-Classes 偽類 - 動態偽類
系列文章列表:[快速入門前端] 系列文章索引列表


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言