Happylab Logo
發布於

Day24: Sticky Nav

Authors

簡介: 如何使用 JavaScript 和 CSS 來實現固定導航欄效果。

作品頁面:https://iris1114.github.io/javascript30/24_Sticky-Nav/

HTML

  • 包含一個 header 元素,用於顯示標題。
  • 包含一個 nav 元素,內部有多個 a 連結。
  • 包含一個 div 容器,內部有多個段落。
<!doctype html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>Document</title>
    <link rel="stylesheet" href="style-FINISHED.css" />
  </head>
  <body>
    <header>
      <h1>A story about getting lost.</h1>
    </header>

    <nav id="main">
      <ul>
        <li class="logo"><a href="#">LOST.</a></li>
        <li><a href="#">Home</a></li>
        <li><a href="#">About</a></li>
        <li><a href="#">Images</a></li>
        <li><a href="#">Locations</a></li>
        <li><a href="#">Maps</a></li>
      </ul>
    </nav>

    <div class="site-wrap">
      <p>
        Lorem ipsum dolor sit amet, consectetur adipisicing elit. Tempore
        tempora rerum, est autem cupiditate, corporis a qui libero ipsum
        delectus quidem dolor at nulla, adipisci veniam in reiciendis aut
        asperiores omnis blanditiis quod quas laborum nam! Fuga ad tempora in
        aspernatur pariatur fugit quibusdam dolores sunt esse magni, ut,
        dignissimos.
      </p>
      <p>
        Lorem ipsum dolor sit amet, consectetur adipisicing elit. Tempore
        tempora rerum, est autem cupiditate, corporis a qui libero ipsum
        delectus quidem dolor at nulla, adipisci veniam in reiciendis aut
        asperiores omnis blanditiis quod quas laborum nam! Fuga ad tempora in
        aspernatur pariatur fugit quibusdam dolores sunt esse magni, ut,
        dignissimos.
      </p>
      <p>
        Lorem ipsum dolor sit amet, consectetur adipisicing elit. Tempore
        tempora rerum, est autem cupiditate, corporis a qui libero ipsum
        delectus quidem dolor at nulla, adipisci veniam in reiciendis aut
        asperiores omnis blanditiis quod quas laborum nam! Fuga ad tempora in
        aspernatur pariatur fugit quibusdam dolores sunt esse magni, ut,
        dignissimos.
      </p>
      <p>
        Lorem ipsum dolor sit amet, consectetur adipisicing elit. Tempore
        tempora rerum, est autem cupiditate, corporis a qui libero ipsum
        delectus quidem dolor at nulla, adipisci veniam in reiciendis aut
        asperiores omnis blanditiis quod quas laborum nam! Fuga ad tempora in
        aspernatur pariatur fugit quibusdam dolores sunt esse magni, ut,
        dignissimos.
      </p>
      <p>
        Lorem ipsum dolor sit amet, consectetur adipisicing elit. Tempore
        tempora rerum, est autem cupiditate, corporis a qui libero ipsum
        delectus quidem dolor at nulla, adipisci veniam in reiciendis aut
        asperiores omnis blanditiis quod quas laborum nam! Fuga ad tempora in
        aspernatur pariatur fugit quibusdam dolores sunt esse magni, ut,
        dignissimos.
      </p>
      <p>
        Lorem ipsum dolor sit amet, consectetur adipisicing elit. Tempore
        tempora rerum, est autem cupiditate, corporis a qui libero ipsum
        delectus quidem dolor at nulla, adipisci veniam in reiciendis aut
        asperiores omnis blanditiis quod quas laborum nam! Fuga ad tempora in
        aspernatur pariatur fugit quibusdam dolores sunt esse magni, ut,
        dignissimos.
      </p>
      <p>
        Lorem ipsum dolor sit amet, consectetur adipisicing elit. Tempore
        tempora rerum, est autem cupiditate, corporis a qui libero ipsum
        delectus quidem dolor at nulla, adipisci veniam in reiciendis aut
        asperiores omnis blanditiis quod quas laborum nam! Fuga ad tempora in
        aspernatur pariatur fugit quibusdam dolores sunt esse magni, ut,
        dignissimos.
      </p>
      <p>
        Lorem ipsum dolor sit amet, consectetur adipisicing elit. Tempore
        tempora rerum, est autem cupiditate, corporis a qui libero ipsum
        delectus quidem dolor at nulla, adipisci veniam in reiciendis aut
        asperiores omnis blanditiis quod quas laborum nam! Fuga ad tempora in
        aspernatur pariatur fugit quibusdam dolores sunt esse magni, ut,
        dignissimos.
      </p>
    </div>

    <script src="scripts.js"></script>
  </body>
</html>

CSS

  • 設定了基本的頁面樣式,包括字體、顏色和佈局。
  • 設置了固定導航欄的樣式。
body {
  font-family: 'Arial', sans-serif;
  line-height: 1.6;
  margin: 0;
  padding: 0;
}

header {
  background: #333;
  color: #fff;
  padding: 1rem;
  text-align: center;
}

nav {
  background: #f4f4f4;
  padding: 1rem;
  position: sticky;
  top: 0;
  z-index: 1000;
}

nav ul {
  list-style: none;
  display: flex;
  justify-content: space-around;
  margin: 0;
  padding: 0;
}

nav ul li {
  margin: 0;
}

nav ul li a {
  color: #333;
  text-decoration: none;
  font-size: 1.2rem;
}

.site-wrap {
  padding: 2rem;
}

JavaScript

  • 使用 JavaScript 來實現固定導航欄效果。
const nav = document.querySelector('#main')
const topOfNav = nav.offsetTop

function fixNav() {
  if (window.scrollY >= topOfNav) {
    document.body.style.paddingTop = nav.offsetHeight + 'px'
    document.body.classList.add('fixed-nav')
  } else {
    document.body.style.paddingTop = 0
    document.body.classList.remove('fixed-nav')
  }
}

window.addEventListener('scroll', fixNav)

Note

  • 使用 position: sticky 來實現固定導航欄效果。
  • 使用 window.scrollY 來獲取頁面滾動的距離。
  • 使用 offsetTop 來獲取導航欄距離頁面頂部的距離。