CSSで table > tr > td セレクタを利用してもテーブルにスタイルが反映されない - CSS

CSSで table > tr > td セレクタを利用してもテーブルにスタイルが反映されない現象について紹介します。

現象の確認

下記のHTMLファイルを準備します。
CssCellSpacing.css
table {
  border-collapse: separate;
  border-spacing: 8px;
  border: 1px
}

table > tr > td {
  background-color:#9beae5;
}
CssCellSpacing.html
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title></title>
  <link rel="stylesheet" href="CssCellSpacing.css" />
</head>
<body>
  <table>
    <tr>
      <td>ABC</td>
      <td>DEF</td>
      <td>GHI</td>
    </tr>
    <tr>
      <td>あいう</td>
      <td>えおか</td>
      <td>きくけ</td>
    </tr>
  </table>
</body>
</html>
上記のHTMLファイルをWebブラウザで表示します。table部分のスタイルは設定されていますが、テーブルのセルのスタイルはスタイルシートには記述してありますが、設定されていません。

原因

WebブラウザでHTMLファイルを解析する際にタグが追加されることが原因です。
先のWebページをデバッグツールで開き、DOMの要素を表示します。


HTMLが解析されDOMツリーが構築されると下記のHTMLタグになります。
tableタグの内部にtbodyタグが追加され、tbodyタグの内部に、tr tdタグが配置されることが確認できます。そのため、CSSセレクタで tableタグの子要素としてtrタグを指定すると選択対象に含まれない状態になります。
<html><head>
    <meta charset="utf-8">
    <title></title>
  <link href="CssCellSpacing.css" rel="stylesheet">
</head>
<body>
  <table>
    <tbody><tr>
      <td>ABC</td>
      <td>DEF</td>
      <td>GHI</td>
    </tr>
    <tr>
      <td>あいう</td>
      <td>えおか</td>
      <td>きくけ</td>
    </tr>
  </tbody></table>
</body></html>

対処法

下記のCSSファイルに変更します。子要素のセレクターではなく、下位要素のセレクターを利用することで、tbodyタグの子要素にtr td タグがあった場合でもセレクタが選択できる記述にします。
CssCellSpacing.css
table {
  border-collapse: separate;
  border-spacing: 8px;
  border: 1px
}

table tr td {
  background-color:#9beae5;
}

または、DOMツリー構築時に追加される tbody タグを含めて、tdタグを指定する記述にします。
CssCellSpacing.css
table {
  border-collapse: separate;
  border-spacing: 8px;
  border: 1px
}

table > tbody > tr > td {
  background-color:#9beae5;
}

表示結果

修正したCSSファイルでHTMLファイルをWebブラウザで表示します。下図の画面が表示されます。セルにスタイルが適用されていることが確認できます。

著者
iPentecのメインデザイナー
Webページ、Webクリエイティブのデザインを担当。PhotoshopやIllustratorの作業もする。
掲載日: 2018-01-25
iPentec all rights reserverd.