スクロールすると固定したオブジェクトが消える

sticky で画面上部に固定したオブジェクトがスクロールすると消えた。

作成日: 2025年4月1日
更新日: 2025年4月1日

タグ一覧

CSS

注意

本現象の原因と解決策について

本稿では遭遇した現象の原因については、調査と検証が足りないため掲載していない。従って解決方法の効果も保証できない。

環境による差異

HTML や CSS のレンダリングはブラウザやデバイスなど環境に左右されるため、この方法で解決するとは限らない。

現象

要素の固定

<nav> 要素を以下の方法で画面上部に固定した。

HTML

<html>
    <body>
        <nav>
            <ul>
                <li>アイテム1</li>
                <li>アイテム2</li>
                <li>アイテム3</li>
            </ul>
        </nav>
        <!-- メインコンテンツ -->
    </body>
</html>

スタイル

html { height: 100%; }

body { height: inherit; }

nav {
	position: sticky;
	top: 0;
}

発生した問題

固定した <nav> がスクロール中に消失する。

再現

発生した現象をできる限り再現した。スクロールすると途中で「ナビゲーション」が消えるはずだ。 [F1]

子要素

解決

<body>heightinherit から max-content へ変更する。

変更前

body { height: inherit; /* 100% */ }

変更後

body { height: max-content; }

再現

実際に <body>heightinherit から max-content 変更したときの変化を再現した。「変更前」は下へスクロールすると「ナビゲーション」が消えるが「変更後」は消えない。

変更前

子要素

変更後

子要素

まとめ

発生した現象

スクロールすると sticky で固定した要素が消えた。

解決策

子要素が飛び出さないように親要素と子要素の高さを合わせた。

追記

html の height による問題

その後 CSS を編集していると、今回の現象は <html>height: 100% を指定したことが原因である可能性が出てきた。現時点では原因が height 自体の問題か、値の 100% に問題があるのか、それ以外の問題かは判っていない。とにかく bodyheight に設定に関わらず <html> から height の設定を削除すれば、スクロールで <nav> が消えないという結果を得た。

削除する部分

html { height: 100%; }

html の height を削除した例の再現

<html> から height を削除した際の挙動を再現した。それぞれ <body>height を変更しているが、いずれもスクロールによって「ナビゲーション」は消失は発生しないはずだ。

body の height を削除した場合

子要素

body { height: inherit; } の場合

子要素

body { height: max-content; } の場合

子要素

脚注