こんにちは!静岡県浜松市でWEBデザイナーをしています小瀧です。
JavaScriptでクラスを追加したのに、なぜかCSSが反応しない。アニメーションも発火しない。表示が何も変わらない。
この現象は、初心者の方だけでなく、実務を積んでいる制作者でも定期的にハマる非常に多いトラブルのひとつです。
しかもこの問題は、エラーが出ないことが多いため、原因が特定しづらく、結果として「書き方は合っているはずなのに動かない」という精神的にも消耗する状況に陥りがちです。
しかし、この「反応しない問題」には、実はほぼ決まったパターンの原因が存在します。
そして、その原因を一度きちんと理解してしまえば、今後同じミスで何時間も悩むことはなくなります。
本記事では、JavaScriptでクラスを追加しても反応しないときに 最初に疑うべきポイント を、実務目線で体系的に解説します。
すべてコピペOKのコード付きで紹介しますので、今まさに詰まっている方も、そのまま検証しながら読み進めてください。
もっとも基本的なクラス追加の書き方
const box = document.querySelector('.box');
box.classList.add('active');
CSS側は次のように書きます。
.box {
width: 100px;
height: 100px;
background: #999;
}
.box.active {
background: #2563eb;
}
この構成が すべての基準形 になります。
これが動かない場合、ほぼ確実にどこかにミスが潜んでいます。
原因1:そもそも要素が取得できていない
もっとも多いのがこのパターンです。
const box = document.querySelector('.box');
console.log(box);
ここで null が出る場合、
クラスを追加する対象そのものが存在していません。
- HTMLに .box が存在しない
- クラス名の打ち間違い
- 動的に生成される要素を先に取得している
原因2:JavaScriptの読み込み順が間違っている
HTMLより先にJavaScriptが実行されると、要素は存在しません。
<script src="main.js"></script>
<div class="box"></div>
この場合、.box は取得できません。
正しい書き方
<div class="box"></div>
<script src="main.js"></script>
または
window.addEventListener('DOMContentLoaded', () => {
const box = document.querySelector('.box');
box.classList.add('active');
});
原因3:CSSのセレクタが間違っている
JavaScript側は正しくても、CSSが間違っているケースも非常に多いです。
NG例
.box .active {
background: red;
}
これは「.box の中の .active」を意味します。
正しくは
.box.active {
background: red;
}
ドットの位置ひとつで意味が完全に変わります。
原因4:すでに同じクラスが付いている
すでに active が付いている状態で add しても、見た目は変わりません。
<div class="box active"></div>
この状態で
box.classList.add('active');
を実行しても、何も変化は起こりません。
原因5:アニメーションが最初から適用されている
CSSアニメーションは「最初から適用」されていると、クラス追加による変化が起きません。
.box {
animation: fade 1s forwards;
}
この場合、クラスを付けても再生されません。
対策は
.box.active {
animation: fade 1s forwards;
}
原因6:display:none 状態でアニメーションさせている
.box {
display: none;
}
.box.active {
display: block;
animation: fade 1s;
}
この場合、アニメーションは基本的に再生されません。
安全な書き方は
.box {
opacity: 0;
pointer-events: none;
}
.box.active {
opacity: 1;
pointer-events: auto;
}
原因7:イベント自体が発火していない
btn.addEventListener('click', () => {
box.classList.add('active');
});
そもそもクリックイベントが発火していないケースもあります。
確認方法
btn.addEventListener('click', () => {
console.log('クリックされた');
});
ここが出ない場合、
・ボタン取得ミス
・要素の重なり
・z-indexの問題
などが疑われます。
実務で最も安全なクラス切り替えパターン
btn.addEventListener('click', () => {
box.classList.toggle('active');
});
・付いていなければ追加
・付いていれば削除
という 最も事故が起きにくい書き方 になります。
まとめ
・要素取得ミスが最頻出原因
・読み込み順は必ず確認
・CSSセレクタの書き間違いに注意
・display:none はアニメーション不可
・イベントが発火しているか必ず確認
・toggle を使うと事故が減る
JavaScriptのクラス追加が反応しないときは、
焦らず、上からひとつずつ潰すだけで必ず原因にたどり着きます。