diff --git a/templates/default/assets/css/post.css b/templates/default/assets/css/post.css index 2c02735..3ca9aea 100644 --- a/templates/default/assets/css/post.css +++ b/templates/default/assets/css/post.css @@ -130,6 +130,12 @@ tr, th, td { padding-left: 50px; } +.active a { + color: var(--primary-color); + transform: scale(1.2); + font-weight: bold; +} + .image-preview-wrap { position: fixed; top: 0; diff --git a/templates/default/assets/js/post.js b/templates/default/assets/js/post.js index 4d3fb98..007329a 100644 --- a/templates/default/assets/js/post.js +++ b/templates/default/assets/js/post.js @@ -1,31 +1,40 @@ const tocBox = document.getElementById('toc-box'); - -const tList = document.getElementById('post-content').querySelectorAll('h1, h2, h3, h4, h5, h6'); +const postContent = document.getElementById('post-content'); +const tList = postContent.querySelectorAll('h1, h2, h3, h4, h5, h6'); const hList = ['H1', 'H2', 'H3', 'H4', 'H5', 'H6']; +const div = document.createElement('div'); -let tmpHtml = `
\n`; - -Array.from(tList, v => { - // get the level number +tList.forEach(v => { const H = hList.indexOf(v.nodeName) + 1 || 1; - tmpHtml += `
${v.textContent}
\n`; + const liDiv = document.createElement('div'); + liDiv.className = `li li-${H} toc-li`; + const a = document.createElement('a'); + a.id = v.id; + a.href = "#"; + a.textContent = v.textContent; + liDiv.appendChild(a); + div.appendChild(liDiv); + a.addEventListener('click', (event) => { + event.preventDefault(); + window.scrollTo({ top: v.offsetTop - 60, behavior: 'smooth' }); + }); }); -tmpHtml += `
` -tocBox.innerHTML = tmpHtml; - -Array.from(tList, v => { - const btn = document.getElementById('toc-box').querySelector(`#${v.id}`); - const ele = document.getElementById('post-content').querySelector(`#${v.id}`); - - if (!btn || !ele) { - return; - } - - btn.addEventListener('click', (event) => { - event.preventDefault(); - window.scrollTo({ top: ele.offsetTop - 60, behavior: 'smooth' }); +tocBox.appendChild(div); +window.addEventListener('scroll', () => { + let currentActive = null; + tList.forEach(v => { + if (window.scrollY >= v.offsetTop - 100) { + currentActive = v; + } }); + + if (currentActive) { + tList.forEach(v => { + document.getElementById(v.id).parentNode.classList.remove('active'); + }); + document.getElementById(currentActive.id).parentNode.classList.add('active'); + } }); function backToTop() {