CSS Stickyは実は簡単です
5053 ワード
どうしてこの文章を書くの?
Sticky
新しい知識点ではありません.この文章を書いたのは、最近効果を実現する過程で、Sticky
に対する理解にずれがあることに気づき、コードの実行結果が予想に及ばなかったからです.文章を書いてもう一度勉強することにした.Stickyとは
Sticky
(MDNをスティッキー効果に翻訳)は、CSS
属性position
のオプション値です.要素の位置決め方法を記述するために、比較的多く使用されているstatic
,fixed
,relative
,absolute
と同様に使用されます.効果的に見ると、
Sticky
は混合体のようで、ページが「臨界点」にスライドする前にrelative
と表現され、「臨界点」に達したときにfixed
と表現される.使用方法
CSS Sticky
を使用するには、2つの条件しか必要ありません.position: sticky;
top: 0; // right/bottom/left ,
top:0
は、要素がビューポート0 pxからスライドしたときにスライドを続け、要素が吸い上げられることを意味する.ここで効果を見ることができます(top値を修正してみてください)JSの実現案を比較する
CSS Sticky
がないまでは、同様の効果はJSで実現されていた.大まかな手順は次のとおりです.fixed
に変更します.window.addEventListener('scroll', () => {
const rect = elem.getBoundingClientRect();
//
})
npmでstickyキーワードを検索すると、優れたパッケージもたくさん使えます.react-stickyを例にとると、条件を満たすと
placeholder
要素(ページのジッタを防止)が作成され、header
がfixed
に位置決めされます.右側は
Chrome Dev-Tools
のlayers
パネルで、青色部分は生成されたplaceholder
である.2つのシナリオの火炎図の比較(拡大効果のために
cpu
を6倍に遅らせた)CSS方案
CSS Sticky
を使用すると、仕事はすべてGPU
に任せられ、JS
メインスレッドのリソースを占有せず、移動端で異常にスムーズです.React Sticky
scroll event
コールバックでgetBoundingClientRect
を呼び出し続ける必要があるため、getBoundingClientRect
はページの再描画をトリガーし、うっかりフレームカートンを落とす.この効果を達成するためだけに(ページには他の内容はありません)大動乾戈性の価格比は低いです.結論:
Sticky
効果を実現し、優先選択CSS Sticky
理解上の偏差
1.Containing Blockでのみ有効です。
例を修正して、1つのdivで
Sticky Header
を包んで、Sticky
の効果が失効したことを発見します!!! ...
<div class="wrapper">
<header>Sticky Headerheader>
div>
...
ドキュメントによると、
Sticky
の効果はContaining Block内でのみ有効であり、Containing Block
画面をスライドアウトすると、Stickey Element
もスライドします.wrapper
の高さを修正して、効果を見ます..wrapper {
height: 100px;
background-color: #e6e6e6;
}
複数の
Sticky Element
を1つに置くと、前の1つが後ろの1つに突き出される特効があり、実際には本当に突き出されるのではなく、Containing Block
がそれを引きずっていく.コードはここを見て
2.OverflowはStickyに影響する
例のコードを修正し、
#root
にoverflow: auto
を加える#root {
overflow: auto;
}
Sticky
効果は再び失われます(overflow
他の非visible
に設定された有効値も同様です.)関連するドキュメントをたくさん見て、私の結論は:
Sticky Element
のoffset値は、nearest scrolling ancestor
(最も近いスクロール祖先)に基づいて計算され、上の祖先要素が一致しない場合は、ビューポートが参照物として使用されます.問題は、
overflow-x
またはoverflow-y
のいずれかが非visible
である場合、探しているターゲット要素とみなされますが、ウィンドウをスクロールする過程で、Sticky Element
とそれが見つけたターゲット祖先要素のoffset
の値は変更されていないため、Sticky
は機能しません.症状に応じて薬を処方し、転がりが「誤マッチング」された祖先元素内で発生すれば回復する
Sticky Effect
である.#root {
overflow: auto;
height: 100vh;
}
互換性
prefixed
を含めると、現在css sticky
携帯電話端末の互換性は94.14%に達しており、残りの5.86%のユーザーの世話をする必要がある場合は、polyfillまたはposition: fixed
を使用することもできます.関連リンク
転載先:https://juejin.im/post/5cde75636fb9a07ef562048a