Navbar之固定顯示 & 回頂層按鈕之設定
id="nav"
去抓取整個Navbarconst navbar = document.getElementById("nav");
class="top-link"
去抓取回頂層按鈕const topLink = document.querySelector(".top-link");
window.addEventListener("scroll", function () {
//內容...
});
以下程式碼皆包含於
window.addEventListener()
中
const scrollHeight = window.pageYOffset;
window.pageYOffset
介紹請見下方參考欄
const navHeight = navbar.getBoundingClientRect().height;
getBoundingClientRect()
介紹請見【19】網頁練習 -Scroll網頁實作(中)
//如果網頁垂直位移量大於Navbar的相對高度
//也就是當網頁下滑到看不見Navbar時
if (scrollHeight > navHeight) {
//Navbar固定顯示
navbar.classList.add("fixed-nav");
} else {
//Navbar取消固定顯示
navbar.classList.remove("fixed-nav");
}
- 我們透過CSS來控制Navbar如何固定顯示 :
.fixed-nav {
position: fixed;
top: 0;
left: 0;
width: 100%;
background: var(--clr-white);
box-shadow: var(--light-shadow);
}
.fixed-nav .links a {
color: var(--clr-grey-1);
}
.fixed-nav .links a:hover {
color: var(--clr-secondary);
}
.fixed-nav .links-container {
height: auto !important;
}
//如果網頁垂直位移量大於500時
if (scrollHeight > 500) {
//顯示回頂層按鈕
topLink.classList.add("show-link");
} else {
//隱藏回頂層按鈕
topLink.classList.remove("show-link");
};
- 透過
show-link
,可以將原本top-link
中的visibility
由hidden
改成visible
,進而顯示按鈕
滾動網頁控制
class="scroll-link"
去抓取所有連結按鈕const scrollLinks = document.querySelectorAll(".scroll-link");
scrollLinks.forEach((link) => {
link.addEventListener("click", (e) => {
//內容...
});
});
以下程式碼皆包含於
link.addEventListener()
中
e.preventDefault();
- 意即停止按鈕<a>標籤跳轉的功能,因為我們要另外自己寫跳轉的方式。
preventDefault()
介紹請參考【15】網頁練習 - Lorem假文產生器。
const id = e.currentTarget.getAttribute("href").slice(1);
element.getAttribute(name)
會回傳element指定的屬性值。在例子中,將會回傳#home
的id字串- 之後再用
string.slice(beginSlice)
方法,將beginSlice
設為1,就可以去除id字串的第一個字(也就是#)
const element = document.getElementById(id);
const navHeight = navbar.getBoundingClientRect().height;
getBoundingClientRect()
的用法,請見【19】網頁練習 -Scroll網頁實作(中)
const containerHeight = linksContainer.getBoundingClientRect().height;
const fixedNav = navbar.classList.contains("fixed-nav");
let position = element.offsetTop - navHeight;
element.offsetTop
: 可以取得該元素上方邊緣與網頁實際上方邊緣的差距- 以About按鈕為例 :
if (!fixedNav) {
position = position - navHeight;
}
- 從主頁面往下滑時,我們會希望他留一個Navbar的寬度,這樣可以放入固定的Navbar :
- 所以此時的position,就得再減去一個Navbar的寬度 :
window.scrollTo({
left: 0,
top: position,
});
Window.scrollTo()
介紹,請見下方參考欄