🤖

position: stickyをつける要素が兄弟か従兄弟かで挙動が変わる?!

2024/04/11に公開

はじめに

テーブルをマークアップする際に、sticky固定したい行が複数ある場合、設計の仕方で挙動が変わりますのでご注意をという話です。
(以下vue.jsでサンプルコード書いております)

①兄弟にstickyがついている場合

<div style="height: 200px; overflow-y: auto">
    <div style="position: sticky; top: 0">ヘッダ-兄</div>
    <div v-for="i in 15" :key="i">{{ i }}</div>
    <div style="position: sticky; top: 0">ヘッダ-弟</div>
    <div v-for="i in 15" :key="i">{{ i }}</div>
</div>


前のsticky要素の上に後ろのsticky要素が重なっていく

②従兄弟にstickyがついている場合

<div style="height: 200px; overflow-y: auto">
    <div style="height: 300px">
      <div style="position: sticky; top: 0">ヘッダ-本人</div>
      <div v-for="i in 15" :key="i">{{ i }}</div>
    </div>
    <div style="height: 300px">
      <div style="position: sticky; top: 0">ヘッダ-従兄弟</div>
      <div v-for="i in 15" :key="i">{{ i }}</div>
    </div>
</div>


前のsticky要素が後ろのsticky要素に押し出される

結論

stickyを付与してる要素の親、つまり同じscroll container内に複数sticky要素がある場合は、scroll containerが押し出されるわけではないので、指定の場所にとどまるが、別scroll containerであればscroll container自体がスクロールで押し出されるので、sticky要素も押し出される感じになる。という感じ

Discussion