作成日:2025/6/27,最終更新日:2025/7/4

JavaScript / TypeScriptのDOM操作【応用編】

要素の追加・class・属性・スタイル操作まで、DOMを自在に操るテクニックに関する解説

この記事では、JavaScriptやTypeScriptでWebページの要素を動的に操作する方法について、実務でもよく使われるテクニックをまとめて解説します。 要素の追加・削除、class操作、属性やスタイルの操作など、基本から一歩進んだ「DOMの応用操作」をマスターしましょう!


1. 要素の追加・削除

解説: 前章で紹介した document.querySelector() などで要素を取得できるようになったら、次は新しく要素を追加したり、削除したりする処理にも挑戦してみましょう。
ここでは、JavaScriptでHTMLの構造そのものを変える「動的なDOM操作」の基本を紹介します。




● 要素の追加:createElement & appendChild

次のようにして、新しいHTML要素を作り、ページに追加することができます:

const ul = document.querySelector('#myList');         // 追加先のul要素を取得
const newItem = document.createElement('li');         // 新しいli要素を作成
newItem.textContent = '追加された項目';               // 中身を設定
ul.appendChild(newItem);                              // ulの末尾に追加

これにより、指定した「ul要素」の中に「li要素」が1つ追加されます。
実行前と実行後で、HTML構造は次のように変化します:

(実行前)

<ul id="myList">
</ul>

(実行後)

<ul id="myList">
  <li>追加された項目</li>
</ul>

createElement() で作成した要素を appendChild() で追加することで、HTMLの構造がこのように変化します。


● 要素の削除:remove() の使い方

追加した要素を削除したいときは、remove() メソッドが使えます:

const item = document.querySelector('#targetItem'); // 削除したい要素を取得
item.remove();                                      // 要素を削除

このように、削除したい要素を取得し、remove() を実行するだけで、簡単にDOMから取り除くことができます。
実行の前後で、HTMLの構造がどう変わるかも見ておきましょう。

(実行前)

<ul>
  <li id="targetItem">削除される要素</li>
  <li>残る要素</li>
</ul>

(実行後)

<ul>
  <li>残る要素</li>
</ul>

※ 古いIEでは remove() がサポートされていませんが、現代の主要ブラウザ(Chrome, Edge, Firefox など)では問題なく使えます。


● 要素の追加と削除を組み合わせた例

ボタンを押すとリストに要素を追加し、別のボタンで削除する例です:

<ul id="myList"></ul>
<button id="addBtn">追加</button>
<button id="removeBtn">削除</button>

const ul = document.querySelector('#myList');
const addBtn = document.querySelector('#addBtn');
const removeBtn = document.querySelector('#removeBtn');

addBtn.addEventListener('click', () => {
  const li = document.createElement('li');
  li.textContent = '項目';
  ul.appendChild(li);
});

removeBtn.addEventListener('click', () => {
  const lastItem = ul.lastElementChild;
  if (lastItem) {
    lastItem.remove();
  }
});

実行例を以下に示します。(追加を押すと「項目」が追加され、削除を押すと最後の項目が削除されます。)

---------------

    ---------------

    このように、createElement() で要素を作り、appendChild() で追加、remove() で削除という一連の流れをマスターすれば、リストやUIパーツをユーザーの操作に応じて動的に変化させる処理が実装できるようになります。


    2. classの操作

    解説: HTML要素には「class属性」を付けて、CSSで見た目を整えるのが一般的です。
    JavaScriptからこのclass属性を動的に変更できると、ユーザーの操作に応じて「色を変える」「表示・非表示を切り替える」などが可能になります。




    ● classListを使った操作

    JavaScriptでは、要素のclassを操作するために classList というプロパティが用意されています。
    主に以下の3つのメソッドを使います:

    • add:classを追加する
    • remove:classを取り除く
    • toggle:classのON/OFFを切り替える

    ● 使用例:クリックでclassを切り替える

    次のコードでは、ボタンをクリックするたびに、背景色が切り替わります。

    <div id="box">クリックして色を変える</div>
    <button id="toggleBtn">切り替え</button>
    
    const box = document.querySelector('#box');
    const btn = document.querySelector('#toggleBtn');
    
    btn.addEventListener('click', () => {
      box.classList.toggle('highlight');
    });

    たとえば、CSSで次のようなclassを用意しておけば:

    .highlight {
      background-color: yellow;
      border: 2px solid orange;
    }

    ボタンを押すたびに「highlight」クラスが追加・削除され、背景色が変わります。


    ● add / remove を使った明示的な切り替え

    ON/OFFを明確に指定したい場合は、add()remove() を使いましょう。

    box.classList.add('active');    // classを追加
    box.classList.remove('active'); // classを削除

    状態に応じて見た目を変えるUIでは、このようにclassを動的に切り替えることがよくあります。


    ● 実行イメージ

    以下のような動作が実装できます:

    • ✅ ホバー時に装飾を追加(hoverイベントにadd)
    • ✅ チェックボックスの状態でクラスを付け替える
    • ✅ ナビメニューの開閉切り替え

    class操作を覚えると、CSSとの連携がとても強力になります。
    JSでスタイルを直接操作するよりも、CSSクラスを切り替えるほうが再利用性・保守性に優れるため、まずはclassListの使い方に慣れておきましょう。


    関連記事「DOM操作とイベントリスナーの基本」のaddEventListenerの基本で、実例も紹介していますので、そちらも合わせてご覧ください。
    ≫記事はこちらから≪


    3. 属性の取得・変更

    解説: HTMLの各要素には、「id」や「href」「src」「alt」など、さまざまな属性が設定されています。
    JavaScriptでは、これらの属性を 動的に読み取ったり書き換えたり できます。




    ● getAttribute:属性を取得する

    まずは、属性の値を読み取る方法です:

    <a id="link" href="https://example.com">リンク</a>
    
    const anchor = document.querySelector('#link');
    console.log(anchor.getAttribute('href')); // 結果 : https://example.com

    このように、getAttribute() を使うことで、HTMLタグに設定されている属性の値を取得できます。


    ● setAttribute:属性を変更する

    次は、属性の値を変更する方法です:

    anchor.setAttribute('href', 'https://chat.openai.com');
    console.log(anchor.getAttribute('href')); // 結果 : https://chat.openai.com

    このように、setAttribute() を使えば、リンクの飛び先などを動的に切り替えることができます。


    ● 実行前後の変化

    (変更前のHTML)

    <a id="link" href="https://example.com">リンク</a>

    (変更後のHTML)

    <a id="link" href="https://chat.openai.com">リンク</a>

    このように、JavaScriptを使って要素の属性値そのものを動的に変更できます。


    ● よく使う属性の例

    • img要素: src(画像パス)、alt(代替テキスト)
    • input要素: type, value, placeholder など
    • a要素: href(リンク先)
    • divなど: data属性(例:data-id, data-user など)

    getAttribute() / setAttribute() を使いこなせば、ユーザーの操作に応じて属性を動的に書き換えるようなインタラクティブなUIが実装できます。


    4. innerHTML vs textContent の違いと注意点

    解説: HTMLの中身(テキストや子要素)を取得・変更するには、innerHTMLtextContent を使います。
    どちらも似ていますが、使い方と用途がまったく異なるので注意が必要です。




    ● innerHTML:HTMLをそのまま扱う

    HTML構造ごと文字列として取得・上書きできます。

    // 初期HTML
    <div id="sample"><p>こんにちは</p></div>
    
    const box = document.querySelector('#sample');
    console.log(box.innerHTML); // 結果 : <p>こんにちは</p>
    
    box.innerHTML = '<strong>ようこそ</strong>';

    変更後のHTML①

    <div id="sample"><strong>ようこそ</strong></div>

    HTMLタグごと扱いたい場合や、動的に複数の要素を一括挿入したい場合に便利です。


    ● textContent:純粋なテキストだけ扱う

    タグを含まず、テキストのみを取得・上書きします。

    box.textContent = '<strong>ようこそ</strong>';

    変更後のHTML②

    <div id="sample">&lt;strong&gt;ようこそ&lt;/strong&gt;</div>

    このように、タグ文字列もそのまま表示され、HTMLとして解釈されません


    ● innerHTMLの注意点(安全性)

    innerHTMLはとても便利ですが、ユーザーの入力内容をそのまま挿入するのは危険です。
    悪意のあるスクリプトが実行される恐れがあり、XSS(クロスサイトスクリプティング)というセキュリティリスクを引き起こします。

    // NGな例(ユーザー入力をそのまま挿入)
    innerHTML = '<script>alert("危険!")</script>';

    セキュリティ面を考えると、基本は textContent を使うのが安全です。
    innerHTML は信頼できる定義済みHTMLを挿入する場合に限って使いましょう。


    まとめると、innerHTMLは「構造ごと」、textContentは「文字だけ」を扱うと覚えましょう。


    5. スタイルの操作

    解説: HTML要素の見た目(色・大きさ・配置など)を動的に変更したいときは、styleプロパティ を使います。
    JavaScriptから直接CSSを操作することで、画面に動きを加えたり、ユーザー操作に応じた見た目の変化を実現できます。




    ● styleプロパティの使い方

    JavaScriptで取得した要素に対して、CSSのプロパティを直接指定することができます:

    const box = document.querySelector('#myBox');
    box.style.color = 'red';           // 文字色を赤に
    box.style.backgroundColor = 'skyblue'; // 背景色を水色に
    box.style.fontSize = '20px';       // フォントサイズを20pxに
    

    このように、CSSのプロパティは キャメルケース(例:background-color → backgroundColor) で記述するのがポイントです。


    ● スタイル適用前後の比較

    適用前と適用後の違いを、HTMLとCSSの変化で確認してみましょう。

    【変更前】

    <div id="myBox">こんにちは</div>

    【変更後(style適用)】

    <div id="myBox" style="color: red; background-color: skyblue; font-size: 20px;">こんにちは</div>

    このように、styleプロパティを使えば、JavaScriptから直接CSSを動的に操作できます。
    ユーザーのアクションに応じた反応を作る際にも役立ちます。


    ● 注意点:classとの使い分け

    単発で一時的に見た目を変えたい場合は style プロパティでOKですが、
    複数のスタイルをまとめて切り替えたいときは classList の追加・削除のほうが便利です。

    // styleプロパティで個別に変更するよりも…
    element.style.border = '1px solid gray';
    element.style.padding = '10px';
    
    // classをまとめて切り替えたほうが管理しやすい
    element.classList.add('active-style');
    

    大規模なプロジェクトやチーム開発では、個別のプロパティ設定よりも、classを使った切り替えの方がスタイルの再利用や保守性が高まります。