這次的功能非常實用,很多網站都有類似的效果。底下的導覽列,當使用者將視窗滾動到導覽列要消失在視窗的時候,導覽列就會釘在最上面。當你滾動回去時,它又會恢復。
個人codepen
<div class="container">
<header>
<h1>LOGO</h1>
</header>
<nav>
<ul>
<li class="logo"><a href="#">LOGO</a></li>
<li><a href="#">Home</a></li>
<li><a href="#">About Us</a></li>
<li><a href="#">Product</a></li>
<li><a href="#">Blog</a></li>
<li><a href="#">Contact Us</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>
</div>
</div>
const nav = document.querySelector("nav");
// 放在外面取值,確保offsetTop是固定的值,不被fixed影響
const navTop = nav.offsetTop;
function fixNav()
// 判斷是否滾超過nav元素,是的話在整個body加上新的class,反之。
if (window.scrollY >= navTop) {
document.body.classList.add("fix-nav");
// 有新的class之後,寫css去操作底下的nav讓他fixed
// 處理nva元素不佔位後的問題
document.body.style.paddingTop = nav.offsetHeight + "px";
} else {
document.body.classList.remove("fix-nav");
document.body.style.paddingTop = 0;
}
}
.site-wrap {
width: 500px;
margin: 60px auto;
background: white;
padding: 40px;
box-shadow: 2px 2px 10px rgba(0, 0, 0, 0.3);
transform: scale(0.99);
transition: transform 0.3s;
}
// nav的每一個元素都用flex-grow讓他自動撐大,所以這邊用width:0會沒作用。所以限制最大高度,就可以達到縮放效果。
// 或者將logo設定flex-grow: 0,之後再讓他flex-grow: 1也可以。
nav ul li {
flex: 1;
text-align: center;
}
.logo {
background: white;
max-width: 0;
/* flex-grow: 0; */
transition: 0.3s linear;
}
.fix-nav .logo {
max-width: 300px;
/* flex-grow: 1; */
}
前面操作了很多次dom元素的offset相關系列,這次就簡單多了。困難的應該是一開始你的html結構和css要怎麼設計比較好,畢竟會影響到你操作JS的行為~
影片的寫法一極棒,推薦學起來。