- `hide()`はただのdisplay:noneではない
- CSSの`display:none`とは何をしているのか
- jQueryの`hide()`がやっていること
- `show()`との関係
- CSSと混ぜると起きる問題
- アニメーション時の違い
- `visibility:hidden`との違い
- よくあるバグ
- どちらを使うべきか
- 最後に
`hide()`はただのdisplay:noneではない
結論から言うと、jQueryの`hide()`は単に`display:none`を設定しているだけの関数ではありません。
見た目の結果は似ていますが、内部で行っている処理と副作用がかなり違います。
その違いを理解していないと、
- クリックできなくなる
- 表示が戻らない
- レイアウトが壊れる
- アニメーションが変になる
といった現象に遭遇します。
CSSの`display:none`とは何をしているのか
まずCSSの`display:none`です。
.box{ display:none; }
これはブラウザに対して
「この要素はレイアウトに参加しない」
と指示しています。
結果:
- 画面に表示されない
- サイズを持たない
- クリック不可
- レイアウトから完全に消える
DOMから削除されるわけではありませんが、レイアウト計算上は存在しない扱いになります。
JavaScriptから設定する場合:
document.getElementById("box").style.display = "none";
非常にシンプルです。
jQueryの`hide()`がやっていること
では`hide()`です。
$("#box").hide();
これは内部で単純なstyle変更をしている…わけではありません。
jQueryは次の情報を保持します。
- 元のdisplay値
- 要素の可視状態
- アニメーション状態(バージョンによる)
つまり`hide()`は「不可視にする命令」であり、
CSSプロパティの単純代入ではありません。
実際の挙動は次です。
1 現在のdisplay値を保存
2 displayをnoneに変更
3 jQuery内部データに状態記録
この保存処理が重要です。
`show()`との関係
なぜ保存するのでしょうか。
理由は`show()`です。
$("#box").show();
もし単純に`display:block`を設定してしまうと問題が起きます。
例えば元がインライン要素:
<span id="box">text</span>
`display:block`にするとレイアウトが変わります。
jQueryは元の値(inline, inline-block など)を復元します。
つまり`hide()`と`show()`はセットで動作する設計です。
CSSと混ぜると起きる問題
ここが実務で最も多いトラブルです。
.box{ display:none; }
$("#box").show();
これで表示されないことがあります。
理由は、CSSの優先順位です。
jQueryはstyle属性を書き換えますが、CSSの`!important`や特定のセレクタの方が優先される場合があります。
つまり
- CSSが非表示を指定
- jQueryが表示を指示
という矛盾が起きます。
アニメーション時の違い
さらに違いが出るのがアニメーションです。
$("#box").hide(400);
これは即座に`display:none`にはなりません。
内部的には以下が行われます。
- heightの縮小
- paddingの調整
- opacity変化
- 完了後display:none
つまり`hide()`は単なる表示切替ではなく、
アニメーション付き可視状態管理です。
CSSでは同じことは起きません。
display:none;
これは瞬時です。
`visibility:hidden`との違い
似たプロパティに`visibility:hidden`があります。
| プロパティ | 挙動 |
| display:none | レイアウトから消える |
| visibility:hidden | 位置は残る |
| jQuery hide() | 状態管理付き非表示 |
`visibility:hidden`では空白が残りますが、`hide()`はレイアウトから消えます。
よくあるバグ
代表的なものです。
1 表示が戻らない**
$("#box").hide(); $("#box").css("display","block"); $("#box").show();
jQuery内部の保存状態と矛盾し、挙動が壊れます。
2 アニメーションが効かない**
CSSでdisplay:noneにすると、jQueryの`fadeIn()`が動かない場合があります。
理由は「初期状態が計算できない」ためです。
3 高さが0になる**
`hide()`直後に高さを取得すると0になります。
$("#box").hide(); console.log($("#box").height());
レイアウトから除外されているためです。
どちらを使うべきか
使い分けの目安です。
| 用途 | 推奨 |
| 静的非表示 | CSS display:none |
| トグル表示 | jQuery hide()/show() |
| アニメーション | jQueryまたはCSS transition |
| 初期非表示 | CSS |
特に初期表示をjQueryで制御するのは注意が必要です。
ページ読み込み時に一瞬表示される「ちらつき」が発生します。
最後に
`hide()`と`display:none`は似ていますが、役割が違います。
CSSは見た目の定義、jQueryは状態の制御です。
問題が起きるのは、
見た目の仕組みと状態管理の仕組みを混在させたときです。
トラブルを避けるコツは単純で、
「最初の表示状態はCSS、操作はJavaScript」に分離することです。
この原則だけで、多くの不可解な表示バグは防げます。