Skip to content

Commit da2aeee

Browse files
committed
Sticky menus
1 parent 3afa597 commit da2aeee

File tree

3 files changed

+43
-5
lines changed

3 files changed

+43
-5
lines changed

web/scripts/build.mjs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -143,13 +143,13 @@ async function build() {
143143
const headings = getHeadingList().filter(({ level }) => level > 1);
144144
return `
145145
<div class="wrapper">
146-
<div class="docs-menu">
146+
<div class="docs-menu sticky">
147147
${isBlog ? blogMenu : docsMenu}
148148
</div>
149149
<div class="content">
150150
${html}
151151
</div>
152-
<div class="table-of-contents">
152+
<div class="table-of-contents sticky">
153153
${headings.map(({ id, raw, level }) => `<div class="toc-link"><a href="${htmlFileName}#${id}" class="h${level}">${raw}</a></div>`).join('\n')}
154154
</div>
155155
</div>`;

web/src/js/main.js

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ document.addEventListener('DOMContentLoaded', function(_event) {
1919
const dropdownTriggers = document.querySelectorAll(".dropdown .dropdown-wrapper > a");
2020
const currentVersion = document.querySelector('.versions-menu a.current');
2121
const dropdownBackdrop = document.querySelector('.dropdown .backdrop');
22+
const stickyBlocks = document.querySelectorAll('.sticky');
2223

2324
function toggleMenu() {
2425
menu.classList.toggle('active');
@@ -55,6 +56,29 @@ document.addEventListener('DOMContentLoaded', function(_event) {
5556
this.parentElement.classList.remove('active');
5657
})
5758

59+
function addStuck() {
60+
stickyBlocks.forEach(stickyBlock => {
61+
stickyBlock.classList.add('stuck');
62+
});
63+
}
64+
function removeStuck() {
65+
stickyBlocks.forEach(stickyBlock => {
66+
stickyBlock.classList.remove('stuck');
67+
});
68+
}
69+
let stuck = window.scrollY > 170;
70+
if (stuck) addStuck();
71+
window.addEventListener('scroll', () => {
72+
if (!stuck && window.scrollY > 170) {
73+
stuck = true;
74+
addStuck();
75+
}
76+
if (stuck && window.scrollY <= 170) {
77+
stuck = false;
78+
removeStuck();
79+
}
80+
});
81+
5882
hljs.addPlugin(new RunButtonPlugin());
5983
hljs.highlightAll();
6084
});

web/src/scss/parts/main.scss

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,17 +64,24 @@ main {
6464

6565
.docs-menu {
6666
position: sticky;
67-
top: 2rem;
67+
top: 1rem;
6868
align-self: flex-start;
6969

70-
padding: 1rem 0.5rem 1rem 0;
70+
padding: 0 0.5rem 1rem 0;
7171

7272
font-size: 0.875rem;
7373
flex-basis: 20%;
7474
flex-shrink: 0;
7575
line-height: 1.3;
7676

7777
border-right: 1px solid $border-color-lighter;
78+
height: calc(100vh - 170px);
79+
overflow-y: auto;
80+
scrollbar-width: none;
81+
82+
&.stuck {
83+
height: calc(100vh - 2rem);
84+
}
7885

7986
@include media('max', 'lg') {
8087
display: none;
@@ -127,10 +134,17 @@ main {
127134

128135
.table-of-contents {
129136
position: sticky;
130-
top: 2rem;
137+
top: 1rem;
131138
align-self: flex-start;
132139
font-size: 0.875rem;
133140
max-width: 20%;
141+
height: calc(100vh - 170px);
142+
overflow-y: auto;
143+
scrollbar-width: none;
144+
145+
&.stuck {
146+
height: calc(100vh - 2rem);
147+
}
134148

135149
@include media('max', 'xl') {
136150
display: none;

0 commit comments

Comments
 (0)