粘性定位(position:sticky)
1.定義
粘性定位可以被認為是相對定位和固定定位的混合。元素在跨越特定閾值前為相對定位,之后為固定定位。(MDN傳送門)
這個特定閾值指的是 top, right, bottom 或 left 之一,換言之,指定 top, right, bottom 或 left 四個閾值其中之一,才可使粘性定位生效。否則其行為與相對定位相同。
2.流盒概念
粘性定位中有一個“流盒”(flow box)的概念,指的是粘性定位元素最近的可滾動元素(overflow 屬性值不是 visible 的元素)的尺寸盒子,如果沒有可滾動元素,則表示瀏覽器視窗盒子。
3.使用時的注意之點
在css的選擇器里面直接寫position:sticky就可以了,不再舉例,主要是強調以下幾點:
(1)粘性元素的位置只相對於第一個有滾動的父級塊元素定位(scrolling mechanism,通過 overflow 設置為 overflow/scroll/auto/overlay 的元素),而不是父級塊元素。codepen示例
(2)只有當設置對應的方向(top/right/bottom/left),才會有作用,並且可以互相疊加,可以同時設置四個方向。
(3)即使設置了 position: sticky,也只能顯示在父級塊元素的內容區域,他無法超出這個區域,除非你設置了負數的值。
(4)position: sticky 並不會觸發 bfc,簡單來講就是計算高度的時候不會計算 float 元素。
(5)當設置了 positi on: sticky 之后,內部的定位會相對於這個元素(codepen示例)
(6)雖然 position: sticky 表現的像 relative 或者 fixed,所以也是可以通過 z-index 設置他們的層級。當這個元素的后面的兄弟節點會覆蓋這個元素的時候,可以通過 z-index 調節層級。(codepen示例)
(7)粘性布局元素的父級元素在可視范圍內,該元素的布局為relative,反之,則為fixed
4.開發實例
(1)堆疊效果
堆疊效果(stacking)指的是頁面滾動時,下方的元素覆蓋上方的元素。下面是一個圖片堆疊的例子,下方的圖片會隨着頁面滾動,覆蓋上方的圖片(查看 demo)。
(2)表頭鎖定
大型表格滾動的時候,表頭始終固定,也可以用sticky實現(查看 demo)。
PS:需要注意的是,sticky必須設在<th>元素上面,不能設在<thead>和<tr>元素,因為這兩個元素沒有relative定位,也就無法產生sticky效果。
5.粘性定位失效的兩種情況
(1)粘性定位元素的父元素和Ⅶ自身高度計算值一樣的時候
(2)設定為 position:sticky 元素的任意父節點的 overflow 屬性必須是 visible,否則 position:sticky 不會生效
如果 position:sticky 元素的任意父節點定位設置為 overflow:hidden,則父容器無法進行滾動,所以 position:sticky 元素也不會有滾動然后固定的情況。
如果 position:sticky 元素的任意父節點定位設置為 position:relative | absolute | fixed,則元素相對父元素進行定位,而不會相對 viewprot 定位。
6.兼容性問題
各大瀏覽器內核對該屬性的支持如下圖所示
參考文檔:https://juejin.im/post/5bfab13ee51d4568655eb676
https://juejin.im/post/5ecde4206fb9a047aa65edf0