使用 position sticky 實現粘性布局

2021-09-22 06:58:26 字數 3309 閱讀 2525

如果問,css 中 position 屬性的取值有幾個?

大部分人的回答是,大概是下面這幾個吧? 1

2

3

4

5

6

額,其實,我們還可以有這 3 個取值: 1

2

3

4

5

6

沒了嗎?偶然發現其實還有乙個處於實驗性的取值,position:sticky(戳我檢視mdn解釋): 1

2

3

臥槽,什麼來的?

前端發展太快,新東西目接不暇,但是對於有趣的東西,還是忍不住一**竟。(只怪當初...)

sticky 英文本面意思是粘,貼上,所以姑且稱之為粘性定位。下面就來了解下這個處於實驗性的取值的具體功能及實用場景。

這是乙個結合了position:relativeposition:fixed兩種定位功能於一體的特殊定位,適用於一些特殊場景。

什麼是結合兩種定位功能於一體呢?

元素先按照普通文件流定位,然後相對於該元素在流中的 flow root(bfc)和 containing block(最近的塊級祖先元素)定位。

而後,元素定位表現為在跨越特定閾值前為相對定位,之後為固定定位。

這個特定閾值指的是 top, right, bottom 或 left 之一,換言之,指定 top, right, bottom 或 left 四個閾值其中之一,才可使粘性定位生效。否則其行為與相對定位相同。

在講述具體示例之前,還是很有必要了解一下position:sticky的相容性,嗯,不樂觀的相容性。

看看 caniuse 下的截圖:

****,這麼好的屬性支援性居然這麼慘淡。

ios 家族(safari && ios safari)和 firefox 很早開始就支援position:sticky了。而 chrome53~55 則需要啟用實驗性網路平台功能才行。其中 webkit 核心的要新增上私有字首-webkit-

位址列輸入chrome://flags/,找到enable-experimental-web-platform-features,選擇啟用:

所以下面的 codepen 示例,需要上述幾個瀏覽器下**。

嗯,上面的文字描述估計還是很難理解,看看下面這張 gif 圖,想想要實現的話,使用 js + css 的方式該如何做:

按照常規做法,大概是監聽頁面 scroll 事件,判斷每一區塊距離視口頂部距離,超過了則設定該區塊position:fixed,反之去掉。

而使用position:sticky,則可以非常方便的實現(請在 safari 或者 chrome53+ 下**):

嗯,看看上面的 css **,只需要給每個內容區塊加上 1

2

3

4

5

就可以輕鬆實現了。

簡單描述下生效過程,因為設定的閾值是top:0,這個值表示當元素距離頁面視口(viewport,也就是fixed定位的參照)頂部距離大於 0px 時,元素以 relative 定位表現,而當元素距離頁面視口小於 0px 時,元素表現為 fixed 定位,也就會固定在頂部。

不理解可以再看看下面這兩張示意圖(top:20px 的情況,取自開源專案fixed-sticky):

距離頁面頂部大於20px,表現為position:relative;

距離頁面頂部小於20px,表現為position:fixed;

運用position:sticky實現導航欄固定,也是最常見的用法:

(請在 safari 或者 chrome53+ 下**):

同理,也可以實現側邊導航欄的超出固定。

position:sticky的生效是有一定的限制的,總結如下:

須指定 top, right, bottom 或 left 四個閾值其中之一,才可使粘性定位生效。否則其行為與相對定位相同。

設定為position:sticky元素的任意父節點的 overflow 屬性必須是 visible,否則position:sticky不會生效。這裡需要解釋一下:

達到設定的閥值。這個還算好理解,也就是設定了position:sticky的元素表現為relative還是fixed是根據元素是否達到設定了的閾值決定的。

上面從相容性也看到了,情況不容樂觀,但是用於某些布局還是能省很多力的,如果真的希望用上這個屬性,可以採用一些開源庫來實現相容。

推薦 fixed-sticky 。

系列 css 文章彙總在我的 github 。

到此本文結束,如果還有什麼疑問或者建議,可以多多交流,原創文章,文筆有限,才疏學淺,文中若有不正之處,萬望告知。

使用GraphEdit使用

1 註冊元件。其實乙個filter就是乙個com元件,所以使用之前需要註冊,可以有兩種方法對元件進行註冊。1.直接使用命令。命令列下輸入 regsvr32 hqtlystd.ax 編譯之後你會在工程目錄下的debug中找到hqtlystd.ax,這個就是要用的filter 即可註冊成功。2.vc6....

MySQL使用學習使用 mysql學習使用

1 mysql學習 1 安裝 ubuntu下直接安裝 apt get install mysql server 2 檢查伺服器是否啟動 sudo netstat tap grep mysql,如果啟動成功,出現以下資訊 tcp00localhost.localdomain mysql listen ...

學習使用CSDN markdown使用

建立乙個自定義列表 如何建立乙個註腳 注釋也是必不可少的 katex數學公式 新的甘特圖功能,豐富你的文章 uml 圖表 flowchart流程圖 匯出與匯入 你好!這是你第一次使用markdown編輯器所展示的歡迎頁。如果你想學習如何使用markdown編輯器,可以仔細閱讀這篇文章,了解一下mar...