CSS粘性定位
粘性定位(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 定位。
參考檔案:https://juejin.im/post/5bfab13ee51d4568655eb676
https://juejin.im/post/5ecde4206fb9a047aa65edf0