整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          如何運用position-sticky實現粘性布局?

          如何運用position:sticky實現粘性布局?

          擊右上方紅色按鈕關注“web秀”,讓你真正秀起來!

          前言

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

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

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

          sticky 英文字面意思是粘,粘貼,所以姑且稱之為粘性定位。下面就來了解下這個處于實驗性的取值的具體功能及適用場景。這是一個結合了 position:relative 和 position:fixed 兩種定位功能于一體的特殊定位,適用于一些特殊場景。

          什么是結合兩種定位功能于一體呢?

          元素先按照普通文檔流定位,然后相對于該元素在流中的 flow root(BFC)和 containing block(最近的塊級祖先元素)定位。而后,元素定位表現為在跨越特定閾值前為相對定位,之后為固定定位。

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

          兼容性

          講述具體示例之前,還是很有必要了解一下 position:sticky 的兼容性,除了IE以外了,其他新版瀏覽器都是Ok的,當然,很多老瀏覽器都是不行的。[CSS兼容性查詢網址](https://www.caniuse.com)

          如何運用position:sticky實現粘性布局?

          IOS 家族(SAFARI && IOS SAFARI)和 Firefox 很早開始就支持 position:sticky 了。而 Chrome53~55 則需要啟用實驗性網絡平臺功能才行。其中 webkit 內核的要添加上私有前綴 -webkit-。

          position:sticky 示例

          看看下面這張 GIF 圖,想想要實現的話,使用 JS + CSS 的方式該如何做?

          如何運用position:sticky實現粘性布局?

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

          而使用 position:sticky ,則可以非常方便的實現

          <div class="container">
           <div class="sticky-box">Javan的博客</div>
           <div class="sticky-box"></div>
           <div class="sticky-box">慕課網</div>
           <div class="sticky-box">Sticky</div>
          </div>
          
          .container {
           background: #eee;
           width: 600px;
           height: 1000px;
           margin: 0 auto;
          }
          .sticky-box {
           position: -webkit-sticky;
           position: sticky;
           height: 60px;
           margin-bottom: 50px;
           background: #10af7e;
           top: 0px;
          }
          div {
           font-size: 30px;
           text-align: center;
           color: #fff;
           line-height: 60px;
          }
          
          

          只需要給每個內容塊添加`position: -webkit-sticky;position: sticky;`就可以輕松實現了。

          注意

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

          1. 須指定 top, right, bottom 或 left 四個閾值其中之一,才可使粘性定位生效。否則其行為與相對定位相同。并且 top 和 bottom 同時設置時,top 生效的優先級高,left 和 right 同時設置時,left 的優先級高。

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

          > 如果 position:sticky 元素的任意父節點定位設置為 overflow:hidden,則父容器無法進行滾動,所以 position:sticky 元素也不會有滾動然后固定的情況。

          > 如果 position:sticky 元素的任意父節點定位設置為 position:relative | absolute | fixed,則元素相對父元素進行定位,而不會相對 viewprot 定位。

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

          公告

          喜歡小編記得點擊關注,了解更多資源哦!

          近遇見一個吸頂效果的需求,要想實現這個效果,使用UI庫也可以,但如果使用position的sticky粘黏屬性可以輕易實現,但在實際使用中需要注意一些細節,于是寫了個簡單demo,效果如下

          <script src="https://lf6-cdn-tos.bytescm.com/obj/cdn-static-resource/tt_player/tt.player.js?v=20160723"></script>

          代碼如下

          <!DOCTYPE html>
          <html lang="en">
          <head>
            <meta charset="UTF-8">
            <meta name="viewport" content="width=device-width, initial-scale=1.0">
            <title>sticky</title>
            <style>
              html,body{
                height: 100%;
              }
              .wrap{
                overflow: auto;
                height: 100%;
              }
              .div1{
                height: 30px;
                background: red;
                text-align: center;
                line-height: 30px;
                color: aliceblue;
                position: sticky;
                top: 0;
              }
              .div2{
                height: 500px;
                background: #333;
                margin-bottom: 20px;
              }
            </style>
          </head>
          <body>
            <div class="wrap">
              <div class="div1">A</div>
              <div class="div2"></div>
              <div class="div1">B</div>
              <div class="div2"></div>
              <div class="div1">C</div>
              <div class="div2"></div>
              <div class="div1">D</div>
              <div class="div2"></div>
            </div>
          </body>
          </html>

          ps:

          • sticky 元素會“固定”在離它最近的一個擁有“滾動機制”的祖先上
          • sticky會創建一個新的BFC(塊級格式化上下文)
          • 須指定 top, right, bottomleft 四個閾值其中之一,才可使粘性定位生效。否則其行為與相對定位相同,一般設置top:0

          osition: sticky; 基于用戶的滾動位置來定位。

          粘性定位的元素是依賴于用戶的滾動,在 position:relative 與 position:fixed 定位之間切換。

          在目標區域以內,它的行為就像 position:relative; 而當頁面滾動超出目標區域時,它的表現就像 position:fixed;,它會固定在目標位置。

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

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

          使用條件:

          1、父元素不能overflow:hidden或者overflow:auto屬性。

          2、必須指定top、bottom、left、right4個值之一,否則只會處于相對定位

          3、父元素的高度不能低于sticky元素的高度

          4、sticky元素僅在其父元素內生效

          ---------------------


          主站蜘蛛池模板: 国产一区二区免费在线| 精品人妻少妇一区二区| 国产伦精品一区二区三区免费迷| 亚洲电影唐人社一区二区| 亚洲一区精品无码| 久久人做人爽一区二区三区| 在线电影一区二区三区| 国产一区二区影院| 在线精品亚洲一区二区三区| 亚洲一区二区三区四区在线观看| 亚洲一区二区三区丝袜| 久久精品成人一区二区三区| 亚洲性无码一区二区三区| 国产一区内射最近更新| 国产在线精品一区二区在线观看| 精品一区二区视频在线观看| 国产在线无码视频一区| 亚洲国产精品一区第二页| 色婷婷香蕉在线一区二区| 综合久久一区二区三区 | 一区二区三区四区无限乱码| 农村人乱弄一区二区| 日本一区二区三区不卡视频| 人妻少妇精品一区二区三区| 欧美日本精品一区二区三区 | 日韩在线一区二区三区免费视频| 久久一区二区三区99| 日韩精品一区二区三区中文精品 | 日韩精品一区二区三区影院| 无码视频一区二区三区在线观看 | 久久久久一区二区三区| 竹菊影视欧美日韩一区二区三区四区五区| 国产日韩精品一区二区三区| 久久精品视频一区| 精品欧美一区二区在线观看| 国产天堂一区二区综合| 97久久精品无码一区二区| 中文人妻无码一区二区三区| 国产精品高清一区二区三区不卡| 色视频综合无码一区二区三区 | 精品国产免费观看一区|