JavaScript | DOM 操作:CSS / クラス操作 – classList.remove

JavaScript
スポンサーリンク

classList.remove とは何か

classList.remove は、要素から指定した「CSS クラス」を安全に取り除くメソッドです。指定したクラスが付いていなければ何も起こらず、エラーにもなりません。ここが重要です:className のような文字列操作と違い、スペース処理や部分一致のミスがなく、確実に“そのクラスだけ”を外せます。


基本の使い方(単体・複数のクラスを外す)

1つのクラスを外す

<div id="box" class="card highlight hidden"></div>
<script>
  const box = document.getElementById("box");
  box.classList.remove("hidden"); // → class="card highlight"
</script>
HTML

ここが重要です:該当クラスのみが消え、他のクラスには影響しません。

複数のクラスをまとめて外す

<div id="msg" class="message is-show type-info is-sticky"></div>
<script>
  const msg = document.getElementById("msg");
  msg.classList.remove("is-show", "is-sticky"); // 複数引数で一括削除
  // → class="message type-info"
</script>
HTML

ここが重要です:複数削除は一度に呼ぶと読みやすく、無駄な再描画も抑えられます。


className との違い(文字列操作より安全で明確)

文字列操作の罠を避ける

<div id="box" class="card highlight hidden"></div>
<script>
  const box = document.getElementById("box");
  // 文字列置換は危険(部分一致や余計なスペースの事故が起きやすい)
  box.className = box.className.replace("hidden", ""); // "highhiddenlight" などの事故に繋がる
  // 正解:remove を使う
  box.classList.remove("hidden");
</script>
HTML

ここが重要です:className は“生の文字列”。部分一致やスペース処理のミスが出やすいので、削除は常に classList.remove を選びます。


状態管理の定石(add/remove/toggle を役割で使い分け)

明示的なオフ操作は remove

<button id="save" class="btn is-active">保存</button>
<script>
  const save = document.getElementById("save");
  function deactivate() {
    save.classList.remove("is-active"); // 明確なオフ
  }
</script>
HTML

ここが重要です:オンは add、オフは remove、条件付きは toggle(, 条件)。役割分担で読みやすさと安全性が上がります。

排他的なクラスを整理する(エラー/成功の混在を防ぐ)

<input id="email" type="email" class="field">
<script>
  const email = document.getElementById("email");
  email.addEventListener("input", () => {
    if (email.validity.valid) {
      email.classList.remove("is-error");
      email.classList.add("is-valid");
    } else {
      email.classList.remove("is-valid");
      email.classList.add("is-error");
    }
  });
</script>
HTML

ここが重要です:remove と add をセットで使えば、状態が混ざる事故を確実に防げます。


まとめて「グループ」を外す(種類別に掃除する)

既知の候補を一括削除してから、必要なものだけ追加

<div id="toast" class="toast type-info is-show"></div>
<script>
  const toast = document.getElementById("toast");

  function setToast(type) {
    // まず、型クラスを掃除
    toast.classList.remove("type-info", "type-warning", "type-error");
    // 次に、表示状態の初期化
    toast.classList.remove("is-show", "is-sticky");
    // 必要なクラスだけを加える
    toast.classList.add(`type-${type}`, "is-show");
  }

  setToast("warning"); // → class="toast type-warning is-show"
</script>
HTML

ここが重要です:候補を“白リスト”で列挙して remove → add の順に適用すると、常に正しい集合に整います。


実践例(開閉 UI、モーダル、選択状態の解除)

ドロワーを閉じるときにクラスを外す

<button id="close">閉じる</button>
<aside id="drawer" class="drawer is-open theme-dark"></aside>
<script>
  const close = document.getElementById("close");
  const drawer = document.getElementById("drawer");

  close.addEventListener("click", () => {
    drawer.classList.remove("is-open"); // 閉じる
    drawer.classList.add("is-closed");
  });
</script>
HTML

モーダルを閉じたらボディの固定を解除

<div id="modal" class="modal is-open"></div>
<script>
  const body = document.body;
  function closeModal() {
    document.getElementById("modal").classList.remove("is-open");
    body.classList.remove("is-locked"); // スクロール固定解除
  }
</script>
HTML

選択状態を一括解除して、現在だけ有効化

<ul id="tabs">
  <li class="tab is-active">A</li>
  <li class="tab">B</li>
  <li class="tab">C</li>
</ul>
<script>
  const tabs = document.getElementById("tabs");
  tabs.addEventListener("click", (e) => {
    const t = e.target;
    if (!(t instanceof Element)) return;
    const li = t.closest(".tab");
    if (!li) return;

    // 既存の選択を一括解除
    tabs.querySelectorAll(".tab.is-active")
        .forEach(el => el.classList.remove("is-active"));

    // クリックしたタブだけ選択
    li.classList.add("is-active");
  });
</script>
HTML

ここが重要です:複数要素の“解除 → 現在だけ付与”は UX の基本パターン。remove の一括適用で事故が減ります。


よくある落とし穴と回避策(存在チェック・タイミング・契約)

要素の存在を確認してから操作する

const el = document.querySelector("#target");
if (!el) return;
el.classList.remove("is-active");
HTML

ここが重要です:DOM 構築前は null になります。defer で読み込むか、DOMContentLoaded 後に実行するのが安全です。

クラス名の契約(CSS と JS の取り決め)を合わせる

  • 契約: JS が外すクラスには、CSS 側で確実に意味がある(.is-active など)。
  • 命名: 状態は is-、タイプは type-、テーマは theme-* と分ける。 ここが重要です:契約が揃っていると remove/add の意図が明確になり、保守が楽になります。

部分一致を期待しない(正確な名前を渡す)

classList.remove は「完全一致」だけを外します。曖昧な名前や typo は効きません。ここが重要です:クラス名は定数化(例:const ACTIVE=”is-active”)するとミスが減ります。


ヘルパーで一元化(条件付きの外し方を短くする)

条件に応じて外す/付けるを一本化

function setFlag(el, name, on) {
  el.classList.toggle(name, !!on); // on=false なら remove、true なら add
}

// 使い方
setFlag(document.querySelector("#box"), "is-active", false); // remove
setFlag(document.querySelector("#box"), "is-active", true);  // add
JavaScript

ここが重要です:同じクラスをあちこちで add/remove するのはミスのもと。toggle(, 条件) を使い、ヘルパーで標準化すると読みやすくなります。


まとめ

classList.remove は、指定クラスだけを安全・確実に外せるメソッドです。className の文字列置換より堅牢で、複数クラスも一度に削除可能。状態管理では「オンを add、オフを remove、条件付きは toggle」を徹底し、排他的クラスは“白リスト掃除→必要だけ追加”で常に正しい集合へ整える。要素の存在と実行タイミングを守り、CSS とのクラス契約を揃える——この型を身につければ、初心者でも読みやすく壊れにくい UI 制御が書けます。

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