DOM要素のclass属性を操作する

jsコード DOM操作

これまでに様々なDOM操作について学習してきましたが、今回はclass属性を操作する方法を学びます。

JavaScriptのDOM操作によって、class属性の値を追加、変更、削除することができます。

class属性の操作の種類

「class属性の操作」には、次のような種類があります。

  • class属性を取得する
  • class属性を作成・追加する
  • class属性のON/OFFを切り替える
  • class属性を削除する

いずれの操作においても、まずは対象のDOM要素を取得し、その要素のclass属性に対して操作する流れになります。

よって、querySelectorおよびquerySelectorAllは引き続き活躍します。

class属性を取得する

class属性を取得する方法は次の2種類あります。

  • DOM要素.className
    • 対象要素に指定されているclassの値を文字列型で取得する
  • DOM要素.classList

どのような動作になるか、それぞれサンプルプログラムで確認してみます。

classNameプロパティの使用例

sample.html
<!-- ここから上は省略 -->
<body>
  <p class="my-class1 my-class2 my-class3"></p>

  <script>
  let className = document.querySelector("p").className;
  console.log(className);
  </script>
</body>
</html>
デベロッパーツールのコンソール
> my-class1 my-class2 my-class3

👆このように、設定されているclass属性の値がすべて表示されます。

ただし、複数に見えても1つの文字列であることには注意してください。
1つ1つを切り出して使いたい場合には、splitメソッドを使用して配列に変換する等の処理が必要です。

classListプロパティの使用例

sample.html
<!-- ここから上は省略 -->
<body>
  <p class="my-class1 my-class2 my-class3"></p>

  <script>
  let classList = document.querySelector("p").classList;
  console.log(classList);
  </script>
</body>
</html>
デベロッパーツールのコンソール
▼ DOMTokenList(3) ['my-class1', 'my-class2', 'my-class3', value: 'my-class1 my-class2 my-class3']
    0: "my-class1"
    1: "my-class2"
    2: "my-class3"
    length: 3
    value: "my-class1 my-class2 my-class3"

👆ご覧の通り、先ほどのclassNameを使用した結果よりも複雑な内容が表示されています。

classListプロパティを使用すると、DOMTokenList型の値が取得されます。
通常の配列(Array)と異なるのは、最後に文字列としてのvalueが加えられている点です。
さらに、lengthが3であることから、そのvalueはリストの要素としては見なされていないことが分かります。

検証用のプログラムを作成して確認してみましょう。

sample.html
<!-- ここから上は省略 -->
<body>
  <p class="my-class1 my-class2 my-class3"></p>

  <script>
  let classList = document.querySelector("p").classList;

  // classListのlength分ループする
  for (let i = 0; i < classList.length; i ++) {
    console.log(classList[i]);
  }

  // for…ofでのループも試す
  for (item of classList) {
    console.log(item);
  }
  </script>
</body>
</html>
デベロッパーツールのコンソール
> my-class1
> my-class2
> my-class3
> my-class1
> my-class2
> my-class3

いずれのループの場合も、👆このようにそれぞれ3つの値のみ表示されています。

class属性を作成・追加する

class属性を作成する場合にも、classNameとclassListを使用します。

classNameプロパティの使用例

sample.html
<!-- ここから上は省略 -->
<body>
  <!-- 👇class属性は付与されていない -->
  <p>テスト</p>

  <script>
  document.querySelector("p").className = "my-class";
  </script>
</body>
</html>
デベロッパーツールの【要素】タブ
-- ここより上は省略 --
<body>
  <p class="my-class">テスト</p>
-- ここより下は省略 --

複数の値を追加することもできます。

sample.html
<!-- ここから上は省略 -->
<body>
  <!-- 👇class属性は付与されていない -->
  <p>テスト</p>

  <script>
  // 文字列内にスペース区切りで複数の値を指定する
  document.querySelector("p").className = "my-class1 myclass2";
  </script>
</body>
</html>
デベロッパーツールの【要素】タブ
-- ここより上は省略 --
<body>
  <p class="my-class1 my-class2">テスト</p>
-- ここより下は省略 --

classListプロパティの使用例

classListプロパティでclassの値を追加するには、addメソッドを使用します。

sample.html
<!-- ここから上は省略 -->
<body>
  <!-- 👇class属性は付与されていない -->
  <p>テスト</p>

  <script>
  document.querySelector("p").classList.add("my-class");
  </script>
</body>
</html>
デベロッパーツールの【要素】タブ
-- ここより上は省略 --
<body>
  <p class="my-class">テスト</p>
-- ここより下は省略 --

こちらも、addメソッドの引数に配列(Array)を渡すことで、複数の値を追加することができます。

sample.html
<!-- ここから上は省略 -->
<body>
  <!-- 👇class属性は付与されていない -->
  <p>テスト</p>

  <script>
  document.querySelector("p").classList.add(["my-class1", "myclass2"]);
  </script>
</body>
</html>
デベロッパーツールの【要素】タブ
-- ここより上は省略 --
<body>
  <p class="my-class1 my-class2">テスト</p>
-- ここより下は省略 --

両プロパティの使用上の注意

classNameとclassListプロパティは、要素のclass属性を作成・追加することができますが、大きな違いがあります。

  • classNameにclassの値を代入する
    • 元々class属性に値が存在していた場合、代入した値で上書きされます。
      つまり、元々あった値と同じ値を指定しない限り、既存の値は消滅します
  • classListのaddメソッドを使用する
    • 既存のclass属性の値に、メソッドの引数で指定した値を追加します。

class属性のON/OFFを切り替える

Webサイトで、何かの条件によってある要素の表示/非表示を切り替えたい場合があります。
そんな時に使えるのがtoggleメソッドです。

toggleメソッドは指定したclassの値のON/OFFを切り替えます。
具体的には、その値が既に存在していれば削除され、存在していない場合は追加されます。

toggleメソッドは、classListプロパティから使用できます。

以下のような仕様で、ページを作成してみましょう。

「切り替え」ボタンをクリックすると、「テストエリア」と書かれたpタグの表示と非表示が切り替わる。

html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>DOM操作</title>
  <!-- 以下のCSSを定義 -->
  <style>
    /* hideクラスを持つ要素は非表示 */
    .hide {
      display: none;
    }
  </style>
</head>
<body>
  <p>テストエリア</p>
  <button>切り替え</button>

  <script>
  // ボタン要素を取得
  let button = document.querySelector("button");
  
  // ボタン要素にイベントリスナーを追加
  button.addEventListener("click", function() {
    // p 要素のclass属性の「hide」をトグル(切り替え)する
    document.querySelector("p").classList.toggle("hide");
  });
  </script>
</body>
</html>

今回のサンプルでは、HTMLタグを一切の省略なしで掲載していますので、ぜひ実際に作成いただき動作を確認してみてください。

class属性を削除する

class属性を削除する場合にも、classNameとclassListともに使用可能です。

classNameを使う場合には対象の要素のclassNameに空文字を代入し、classListを使う場合にはremoveメソッドの引数に削除する値を指定します。

classNameに空文字を代入すると、元々存在していたclass属性の値はすべて消去されてしまうため、classListの使用を推奨します

classListプロパティの使用例

sample.html
<!-- ここから上は省略 -->
<body>
  <!-- my-class2を削除するサンプル -->
  <p class="my-class1 my-class2 my-class3"></p>

  <script>
  document.querySelector("p").classList.remove("my-class2");
  </script>
</body>
</html>
デベロッパーツールの【要素】タブ
-- ここより上は省略 --
<body>
  <p class="my-class1 my-class3"></p>
-- ここより下は省略 --

👆ブラウザを開き、デベロッパーツールの「要素」タブを確認すると、「my-class2」の値が削除されていることが分かります。

まとめ

  • DOM要素のclass属性を操作するには、classNameとclassListプロパティを主に使用する
  • classNameに値を代入すると、元の値は上書きされる
  • classListは、メソッドを使用して追加、削除を行うことができる

本記事についての質問、誤りの指摘、ご意見ご感想などありましたら、ぜひコメント頂ければ幸いです。

最後までお読みいただき、ありがとうございます。

『詳説 JavaScript』メニューに戻る

コメント

タイトルとURLをコピーしました