最近在實習的過程當中接到了這樣一個需求,網頁展現一篇文章的時候,右側須要有一個文章的標題列表,同時文章在滾動的時候滾動到對應標題的時候對應標題須要變色,同時點擊對應標題能夠跳轉到對應標題的位置,這裏用js原生實現了一下,由於本人水平緣由,有不少瑕疵,僅供參考。web
getTitle: function (markdown) {
let template = Array.from(markdown.querySelectorAll('h1,h2,h3,h4,h5,h6'));//獲取頁面上全部的標題
let length = template.length;
for (let i = 0; i < length; i++) {
template[i].setAttribute('id', `${template[i].tagName}${i}`);
}//給標題添加id,爲了以後添加錨點準備
return template;
}
複製代碼
createlist(data) {//傳入上一個函數獲取的標題列表
let ul = document.createElement('ul');
for (let j of data) {
let li = document.createElement('li');
let a = document.createElement('a');
a.appendChild(document.createTextNode(`${j.innerText}`));//將標題內容複製到a標籤上面
a.setAttribute('href', `#${j.id}`);//添加錨點
li.appendChild(a);
if (j.tagName === 'H2') li.style.paddingLeft = '15px';//不一樣級的列表添加縮進
if (j.tagName === 'H3') li.style.paddingLeft = '30px';
ul.appendChild(li);
}
return ul;
}
複製代碼
scroll(page, list) {
let article = page.querySelector('.page-article');
let h = Array.from(article.querySelectorAll('h1,h2,h3,h4,h5,h6'));//獲取標題列表,爲了獲取標題的位置
let alist = Array.from(list.querySelectorAll('a'));//獲取文章標題列表中的全部a標籤
article.onscroll = function () {
for (let i of h) {
let distance = i.offsetTop - article.scrollTop;
if (distance > 0 && distance < 20) {//滾動到標題的時候
let id = i.getAttribute('id');//獲取文章的h標題的id來指定對應的a標籤
for (let j of alist) {
j.style.color = 'black';
let href = j.getAttribute('href');
href = href.slice(1, href.length);//獲取和id對應的錨點的a標籤,這樣寫由於'#xxx',須要去掉#
if (href === id) j.style.color = 'blue';//變色
}
}
}
};
}
複製代碼