DEV Community

kaede
kaede

Posted on

HTML CSS 基礎 Part 05 -- 表に font-awesome のアイコンを組み込む

why

テーブルから詳細にリンクする際、右矢印があるとわかりやすい。
しかし、文字の→をそのまま書くとダサい。

font-awesome を使うと美しいが、ハマりどころがあったので記事に残す

結論

これらに気をつければ、生成された html に、後付けでアイコンを付与できる。ただの js を使うだけで。

  1. Table Row の tr の一つ上の要素、tbody の child として tr を取得できる。 a. querySelectorAll("tbody tr") では取得できなかったので。
  2. 各セルに append するときは毎回別の i タグを生成すると、すべてのセルに反映される。 a. 毎回生成せずに使い回すと最後の append しか反映されなかったので。

css

目に優しく暗く

body {
  background-color: #282c34;
  color: #f8f8f2;
}

table {
  width: 100%;
  border-collapse: collapse;
}

table, th, td {
  border: 1px solid #6272a4;
}

th, td {
  padding: 15px;
  text-align: left;
}

thead {
  background-color: #44475a;
}

tr:nth-child(even) {
  background-color: #32363c;
}

Enter fullscreen mode Exit fullscreen mode

html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <link rel="stylesheet" href="style.css">
  <link 
    href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css" 
    rel="stylesheet"
  >
  <title>ts-dom</title>
</head>
<body>
  <table>
    <thead>
      <tr>
        <th>#</th>
        <th>金額</th>
        <th>リンク</th>
      </tr>
    </thead>

    <tbody>
      <tr>
        <th>1</th>
        <th>100</th>
        <th>詳細</th>
      </tr>
      <tr>
        <th>2</th>
        <th>200</th>
        <th>詳細2</th>
      </tr>
      <tr>
        <th>3</th>
        <th>300</th>
        <th>詳細3</th>
      </tr>
    </tbody>
  </table>

</body>
<script src="main.js"></script>
</html>
Enter fullscreen mode Exit fullscreen mode

font-awesome の cdn リンクと、シンプルなテーブル。
css と js のリンク。

js

const tbody = document.querySelector('tbody');
let tableRows = Array.from(tbody.children);

  tableRows.forEach(row => {
    const iElement = document.createElement("i");
    iElement.classList.add("fas","fa-arrow-right")

    let thElements = Array.from(row.getElementsByTagName('th'));

    let thirdTh = thElements[2];

    thirdTh.appendChild(iElement)
  });
Enter fullscreen mode Exit fullscreen mode
  1. 一つ上の要素の child で複数取得。 a. querySelectorAll では取得できなかったので。ハマりどころ1
  2. 配列に変換して forEach で回す
  3. i タグを生成して、class を付与。 a. 毎回生成せずに使い回すと最後の append しか反映されなかった。ハマりどころ2
  4. th タグの 3 つめを取得。左から 3 つめのセル。
  5. i タグを th タグの 3 つめに append

Image description

これで、既存のテーブルの 3 列目のセルにのみ font-awesome のアイコンを付与できた。

Top comments (1)

Collapse
 
jzm2000 profile image
Jin Zhiming

tr:nth-child(even)不太懂是什么用法