使用 position:sticky 實現粘性布局,positionsticky

來源:互聯網
上載者:User

使用 position:sticky 實現粘性布局,positionsticky

如果問,CSS 中 position 屬性的取值有幾個?
大部分人的回答是,大概是下面這幾個吧?

{    position: static;    position: relative;    position: absolute;    position: fixed;}

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

{    /* 全域值 */    position: inherit;    position: initial;    position: unset;}

沒了嗎?偶然發現其實還有一個處於實驗性的取值,position:sticky(戳我查看MDN解釋):

{    position: sticky;}

臥槽,什麼來的?

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

 初窺  position:sticky

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

這是一個結合了 position:relative 和 position:fixed 兩種定位功能於一體的特殊定位,適用於一些特殊情境。

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

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

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

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

 不樂觀的相容性

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

看看 CANIUSE 下的:

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

IOS 家族(SAFARI && IOS SAFARI)和 Firefox 很早開始就支援 position:sticky 了。而 Chrome53~55 則需要啟用實驗性網路平台功能才行。其中 webkit 核心的要添加上私人首碼 -webkit-

 Chrome53~55 開啟實驗性網路平台功能

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

所以下面的 CodePen 樣本,需要上述幾個瀏覽器下觀看。

 

position:sticky 樣本

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

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

而使用 position:sticky ,則可以非常方便的實現(請在 SAFARI 或者 CHROME53+ 下觀看):

嗯,看看上面的 CSS 代碼,只需要給每個內容區塊加上

{    position: -webkit-sticky;    position: sticky;    top: 0;}

就可以輕鬆實現了。

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

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

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

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

 運用  position:sticky 實現頭部導覽列固定

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

(請在 SAFARI 或者 CHROME53+ 下觀看):

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

 生效規則

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

 開始使用?

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

推薦 fixed-sticky 。

 

系列 CSS 文章匯總在我的 Github 。

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.