兩種方式實(shí)現(xiàn)導(dǎo)航吸頂效果

導(dǎo)航吸頂效果是前端開發(fā)中常用的需求,通常方法時(shí)監(jiān)聽頁面滾動,當(dāng)滾動距離大于導(dǎo)航距離父元素的距離時(shí)就設(shè)置導(dǎo)航固定定位。此時(shí)需要注意的是,當(dāng)給導(dǎo)航設(shè)置固定定位后會脫離標(biāo)準(zhǔn)流,下面的內(nèi)容就會頂上去原來的位置,因此需要有一個(gè)元素占位,這樣滾動距離不大時(shí)不會導(dǎo)致內(nèi)容被遮蓋的現(xiàn)象。另外還有一種純CSS的實(shí)現(xiàn)方式,則很少為人知曉。且聽我慢慢道來。

方式一:使用JS監(jiān)聽滾動的方式實(shí)現(xiàn)

  • 結(jié)構(gòu)
<body>
  <div class="header">頭部信息欄</div>
  <div class="navbar" id="navbar">中部導(dǎo)航欄</div>
  <!-- 占位 -->
  <div class="position hide" id="position"></div>
  <div class="content">
    內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)部部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)
  </div>
</body>
  • 樣式
body{
  margin: 0;
}
.header{
  width: 100%;
  height: 100px;
  background-color:pink;
  text-align: center;
  line-height: 100px;
}
.navbar{
  width: 100%;
  height: 40px;
  line-height: 40px;
  background-color: green; 
  text-align: center;
}
.position{
  width: 100%;
  height: 40px;
}
/* 方式一:添加類 */
.fixed{
  position: fixed;
  top: 0;
  left: 0;
}
/* 方式二:使用屬性選擇器
.navbar[data-fixed="fixed"] {
  position: fixed;
  top: 0;
  left: 0;
}
*/
.hide{
  display: none
}
  • 邏輯
var navbar = document.getElementById('navbar')
var position = document.getElementById('position')
var navbarTop = navbar.offsetTop; // 獲取導(dǎo)航欄到父元素的頂部距離
// 監(jiān)聽滾動
window.onscroll = function () {
  // 獲取滾動的距離
  var scrollTop = document.documentElement.scrollTop || window.pageYOffset || document.body.scrollTop ;
  /*方式一:動態(tài)綁定類*/
  // 滾動高度>元素距離頂部的位置時(shí)添加類,否則移除類
  scrollTop > navbarTop ? navbar.classList.add('fixed') : navbar.classList.remove('fixed')
  // 控制占位內(nèi)容是否顯示
  scrollTop > navbarTop ? position.classList.remove('hide') : position.classList.add('hide')
  /* 方式二:動態(tài)綁定屬性
  navbar.setAttribute('data-fixed', scrollTop > navbarTop ? 'fixed' : '');
  */
}

方式二:使用純CSS的方式實(shí)現(xiàn)

注意:該方式存在兼容性問題,請謹(jǐn)慎使用,注意兼任。

  • 結(jié)構(gòu)
<body>
  <div class="header">頭部信息欄</div>
  <div class="navbar" id="navbar">中部導(dǎo)航欄</div>
  <div class="content">
    內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)內(nèi)部部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)部區(qū)域內(nèi)
  </div>
</body>
  • 樣式
  body {
    margin: 0;
  }
  .header {
    width: 100%;
    height: 100px;
    background-color: pink;
    text-align: center;
    line-height: 100px;
  }
  .navbar {
    width: 100%;
    height: 40px;
    line-height: 40px;
    background-color: green;
    text-align: center;
    /* 粘性定位*/
    position: sticky;
    left: 0;
    top: 0;
    z-index: 99
  }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補(bǔ)...
    _Yfling閱讀 14,096評論 1 92
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,088評論 4 61
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,621評論 1 32
  • 隨筆 人生有度, 過則為災(zāi); 人生無完滿, 缺憾亦是美; 功不求盈, 業(yè)不求滿; 花看半開時(shí), 酒飲微醉處……
    任鐵玲閱讀 1,049評論 24 38
  • 今天又被豆瓣上某君的話啪啪打臉了,我是典型的“思想上的巨人,行動上的矮子”,凡事堅(jiān)持不了幾天,便會淺嘗輒止...
    青風(fēng)蔚蘭閱讀 201評論 0 2

友情鏈接更多精彩內(nèi)容