見出し画像

【CSS】position: stickyが効かない原因と解決策

既存のサイトに、Tableのヘッダ行を固定した表をposition: stickyを使い追加したかったのですが、全く固定されず、原因究明にすごく時間がかかってしまったので、その原因と解決策です。

position: stickyが効かない原因

先祖要素に指定していたoverflow: hiddenが原因でした。
先祖要素のoverflowに初期値(visible)以外が指定されている場合、
stickyは無効化されるようです。

(参考)
position - CSS: カスケーディングスタイルシート | MDN
https://developer.mozilla.org/ja/docs/Web/CSS/position

解決策

今回実装した既存のサイトが、先祖要素に指定したoverflow: hiddenを削除すると崩れてしまうため、変更はできませんでした。
先祖要素のoverflow: hiddenは残したまま、ヘッダ行を固定する方法です。

<実装サンプル>

画像1

この図のように、tableの外側を縦スクロールが表示されるように、overflow-y: scroll を指定した要素で囲み、その要素内でtableのヘッダ行が固定されるようにしました。

まずは、
▼overflow: hiddenが先祖要素に無い場合(通常パターン)

HTML

<div class="l-main">
 <table>
   <thead>
     <tr>
       <th></th>
       <th>Heading---1</th>
       <th>Heading---2</th>
       <th>Heading---3</th>
     </tr>
   </thead>
   <tbody>
     <tr>
       <td>item---1</td>
       <td>Lorem ipsum dolor sit amet.</td>
       <td>Lorem ipsum dolor sit amet.</td>
       <td>Lorem ipsum dolor sit amet.</td>
     </tr>
     <!--省略-->
   </tbody>
 </table>
</div>

CSS
thタグを画面上部に来たら固定されるように設定します。

th{
   position: sticky;
   top: 0;
}


overflow: hiddenが先祖要素にある場合

HTML
通常パターンのtableの外側を縦スクロールが表示されるように、overflow-y: scrollを指定した要素で囲みます。

<div class="sticky-scroll">
  <table>
    <thead>
      <tr>
        <th></th>
        <th>Heading---1</th>
        <th>Heading---2</th>
        <th>Heading---3</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td>item---1</td>
        <td>Lorem ipsum dolor sit amet.</td>
        <td>Lorem ipsum dolor sit amet.</td>
        <td>Lorem ipsum dolor sit amet.</td>
      </tr>
      <!--省略-->
    </tbody>
  </table>
</div> 

CSS
table
の外側に縦スクロールが出るように高さ、スクロールを設定します。
その他は、通常パターンと同じです。

.sticky-scroll{
   overflow-y: scroll;
   width: 100%;
   height: 60vh;
}

参考リンク

こちらの記事を参考にさせていただきました。
CSSのposition: stickyでテーブルのヘッダー行・列を固定する
https://qiita.com/orangain/items/6268b6528ab33b27f8f2


この記事が気に入ったらサポートをしてみませんか?