徹底理解粘性定位 - position: sticky

粘性定位可以被認(rèn)為是相對(duì)定位(position: relative)和固定定位(position: fixed)的混合宪卿。元素在跨越特定閾值前為相對(duì)定位佑钾,之后為固定定位休溶。例如:

.sticky-header {  position: sticky;  top: 10px; }

在 視口滾動(dòng)到元素 top 距離小于 10px 之前,元素為相對(duì)定位孽尽。之后杉女,元素將固定在與頂部距離 10px 的位置,直到視口回滾到閾值以下婆瓜。

粘性定位常作用在導(dǎo)航和概覽信息(標(biāo)題,表頭猴蹂,操作欄磅轻,底部評(píng)論等)上。這樣撮躁,用戶在瀏覽詳細(xì)信息時(shí)杨帽,也能看到信息的概覽和做一些操作注盈,給用戶帶來(lái)便捷的使用體驗(yàn)山害。

粘性定位看著很簡(jiǎn)單冤荆,但也很容易出現(xiàn)不生效的情況。為幫助大家徹底理解粘性定位外邓,本文會(huì)從 3 個(gè)方面來(lái)介紹:

  • 粘性定位的原理。
  • 不生效的情況丧枪。
  • 具體的例子。

原理

為便于理解粘性定位恋博,這里引入四個(gè)元素:視口元素,容器元素秦士,粘性約束元素 和 sticky 元素提针。它們的關(guān)系如下:


視口元素:顯示內(nèi)容的區(qū)域皆愉。會(huì)設(shè)置寬久锥,高。一般會(huì)設(shè)置 overflow:hidden歹苦。
容器元素:離 sticky 元素最近的能滾動(dòng)的祖先元素。
粘性約束元素:粘性定位的父元素。有時(shí)辣吃,也會(huì)出現(xiàn)粘性約束元素就是容器元素的情況。
sticky 元素:設(shè)置了 position: sticky; 的元素。

滾動(dòng)時(shí)节榜,sticky 元素設(shè)置的 left, right, top, bottom 的值相對(duì)的是容器元素。當(dāng)粘性約束元素滾出視口時(shí)让歼,sticky 元素也會(huì)滾出視口。

不生效的情況

情況1: 未指定 top, right, top 和 bottom 中的任何一個(gè)值

此時(shí),設(shè)置 position: sticky 相當(dāng)于設(shè)置 position: relative

要生效呢岗,要指定 top, right, top 或 bottom 中的任何一個(gè)值突那。

情況2: 垂直滾動(dòng)時(shí),粘性約束元素高度小于等于 sticky 元素高度

不生效的原因:當(dāng)粘性約束元素滾出視口時(shí),sticky 元素也會(huì)滾出視口。粘性約束元素比 sticky 元素還小射窒,sticky 元素沒(méi)有顯示固定定位狀態(tài)的機(jī)會(huì)点寥。

同樣的蔽莱,水平滾動(dòng)時(shí)兽间,粘性約束元素寬度小于等于 sticky 元素寬度時(shí),也不會(huì)生效。

情況3: 粘性約束元素和容器元素之間存在 overflow: hidden 的元素

該情況的示例代碼:

<div class="viewport">
  <div class="container"> <!-- 容器元素 -->
    <div style="overflow: hidden">
      <div> <!-- 粘性約束元素 -->
        <div class="stick-elem">...</div>  <!-- sticky 元素 -->
        ...
      </div>
    </div>
  </div>
</div>

要生效稠集,要把 overflow: hidden 的元素移除痹籍。

具體的例子

例子1: 頁(yè)面滾動(dòng)

這個(gè)例子悠垛,我們來(lái)實(shí)現(xiàn)頁(yè)面滾動(dòng)到文章內(nèi)容時(shí),文章標(biāo)題吸頂?shù)男Ч?/p>

HTML 結(jié)構(gòu)如下:

<div class="header">網(wǎng)站頭部</div>
<!-- 粘性約束元素 -->
<div class="article">
  <!-- sticky 元素 -->
  <h2 class="title">徹底理解粘性定位 - position: sticky</h2>
  <div class="content">...</div>
</div>
<div class="footer">網(wǎng)站底部</div>

在這個(gè)例子中蓉坎,視口元素和容器元素都是 body。sticky 元素是 .title勿侯,因此只要在 sticky 元素上設(shè)置如下樣式即可:

.title {
  position: sticky;
  top: 0;
  background-color: #fff;
}

例子2: 文章列表

這個(gè)例子兵钮,我們來(lái)實(shí)現(xiàn)一塊區(qū)域下有多篇文章掘譬,區(qū)域滾動(dòng)到文章內(nèi)容時(shí)泰演,對(duì)應(yīng)的標(biāo)題和操作按鈕吸頂?shù)男Ч?/p>

HTML 結(jié)構(gòu)如下:

<!-- 視口元素 -->
<div class="viewport">
  <!-- 容器元素 -->
  <div class="container">
    <!-- 文章:粘性約束元素 -->
    <div class="article">
      <div class="sticky-header">
        <h2>徹底理解粘性定位 - position: sticky</h2>
        <div class="options">
          <button>轉(zhuǎn)發(fā)</button>
          <button>點(diǎn)贊</button>
        </div>
      </div>
      <div class="article-content">...</div>
  </div>
  <!-- 文章 -->
  <div class="article">...</div>
  <div class="article">...</div>
</div>

在這個(gè)例子中,視口元素是 .viewport葱轩,容器元素是 .container睦焕。sticky 元素是 .sticky-header。核心樣式如下:

/* 視口元素 */
.viewport {
  width: 50%;
  overflow: hidden;
  height: 200px;
}
/* 容器元素 */
.container {
  overflow: auto;
  height: 100%;
}
/* 粘性約束元素 */
.article {
  margin-bottom: 10px;
}
/* sticky 元素 */
.sticky-header {
  position: sticky;
  top: 0;
  padding: 5px 0;
  background-color:#fff;
}

例子3: 甘特圖

最后靴拱,我們來(lái)做個(gè)復(fù)雜點(diǎn)的例子:甘特圖垃喊。如下圖所示:

需要實(shí)現(xiàn):

  • 左側(cè)事項(xiàng)菜單總在最左側(cè)。
  • 菜單的頭部和時(shí)間軸吸頂缭嫡。
  • 時(shí)間軸的年總在月的最左邊缔御。

實(shí)現(xiàn)代碼有點(diǎn)多,就不在這里貼了妇蛀。獲取完整源碼,關(guān)注公眾號(hào): 前端GOGOGO笤成,回復(fù): 粘性定位评架。

最后

粘性定位的瀏覽器兼容性也很好:95.76% 的瀏覽器支持[1]。大家可以放心的使用~

推薦閱讀:

  • position:sticky 粘性定位的幾種巧妙應(yīng)用[2]

參考資料

[1]95.76% 的瀏覽器支持: https://caniuse.com/css-sticky
[2]position:sticky 粘性定位的幾種巧妙應(yīng)用: https://segmentfault.com/a/1190000039858711

原文:https://jishuin.proginn.com/p/763bfbd62bc0

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末炕泳,一起剝皮案震驚了整個(gè)濱河市纵诞,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌培遵,老刑警劉巖浙芙,帶你破解...
    沈念sama閱讀 219,490評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異籽腕,居然都是意外死亡嗡呼,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門皇耗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)南窗,“玉大人,你說(shuō)我怎么就攤上這事⊥蛏耍” “怎么了窒悔?”我有些...
    開(kāi)封第一講書人閱讀 165,830評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)敌买。 經(jīng)常有香客問(wèn)我简珠,道長(zhǎng),這世上最難降的妖魔是什么虹钮? 我笑而不...
    開(kāi)封第一講書人閱讀 58,957評(píng)論 1 295
  • 正文 為了忘掉前任聋庵,我火速辦了婚禮,結(jié)果婚禮上芜抒,老公的妹妹穿的比我還像新娘珍策。我一直安慰自己,他們只是感情好宅倒,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布攘宙。 她就那樣靜靜地躺著,像睡著了一般拐迁。 火紅的嫁衣襯著肌膚如雪蹭劈。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 51,754評(píng)論 1 307
  • 那天线召,我揣著相機(jī)與錄音铺韧,去河邊找鬼。 笑死缓淹,一個(gè)胖子當(dāng)著我的面吹牛哈打,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播讯壶,決...
    沈念sama閱讀 40,464評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼料仗,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了伏蚊?” 一聲冷哼從身側(cè)響起立轧,我...
    開(kāi)封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎躏吊,沒(méi)想到半個(gè)月后氛改,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,847評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡比伏,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評(píng)論 3 338
  • 正文 我和宋清朗相戀三年胜卤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片凳怨。...
    茶點(diǎn)故事閱讀 40,137評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡瑰艘,死狀恐怖是鬼,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情紫新,我是刑警寧澤均蜜,帶...
    沈念sama閱讀 35,819評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站芒率,受9級(jí)特大地震影響囤耳,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜偶芍,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評(píng)論 3 331
  • 文/蒙蒙 一充择、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧匪蟀,春花似錦椎麦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,023評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至段化,卻和暖如春嘁捷,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背显熏。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,149評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工雄嚣, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人喘蟆。 一個(gè)月前我還...
    沈念sama閱讀 48,409評(píng)論 3 373
  • 正文 我出身青樓缓升,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親蕴轨。 傳聞我的和親對(duì)象是個(gè)殘疾皇子仔沿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容