|
12 | 12 | var menuPanel = navContainer.querySelector('[data-panel=menu]')
|
13 | 13 | if (!menuPanel) return
|
14 | 14 | var nav = navContainer.querySelector('.nav')
|
| 15 | + var navBounds = { encroachingElement: document.querySelector('footer.footer') } |
15 | 16 |
|
16 | 17 | var currentPageItem
|
17 | 18 | if (menuPanel.classList.contains('is-loading')) {
|
|
31 | 32 | }
|
32 | 33 | }
|
33 | 34 |
|
| 35 | + fitNavInit({}) |
| 36 | + window.addEventListener('load', fitNavInit) |
| 37 | + window.addEventListener('resize', fitNavInit) |
| 38 | + |
34 | 39 | menuPanel.querySelector('.nav-menu-toggle').addEventListener('click', function () {
|
35 | 40 | var collapse = !this.classList.toggle('is-active')
|
36 | 41 | find(menuPanel, '.nav-item > .nav-item-toggle').forEach(function (btn) {
|
|
155 | 160 | function find (from, selector) {
|
156 | 161 | return [].slice.call(from.querySelectorAll(selector))
|
157 | 162 | }
|
| 163 | + |
| 164 | + function fitNavInit (e) { |
| 165 | + if (e.type) { |
| 166 | + window.removeEventListener('scroll', fitNav) |
| 167 | + nav.style.height = '' |
| 168 | + } |
| 169 | + if (window.getComputedStyle(nav).position === 'fixed') { |
| 170 | + navBounds.availableHeight = window.innerHeight |
| 171 | + navBounds.preferredHeight = nav.getBoundingClientRect().height |
| 172 | + fitNav() |
| 173 | + window.addEventListener('scroll', fitNav) |
| 174 | + } |
| 175 | + if (e.type !== 'resize' && currentPageItem) scrollItemToMidpoint(menuPanel, currentPageItem) |
| 176 | + } |
| 177 | + |
| 178 | + function fitNav () { |
| 179 | + var scrollDatum = menuPanel.scrollTop + menuPanel.offsetHeight |
| 180 | + var reclaimedHeight = navBounds.availableHeight - navBounds.encroachingElement.getBoundingClientRect().top |
| 181 | + nav.style.height = reclaimedHeight > 0 |
| 182 | + ? Math.max(0, Math.round(navBounds.preferredHeight - reclaimedHeight)) + 'px' |
| 183 | + : '' |
| 184 | + menuPanel.scrollTop = scrollDatum - menuPanel.offsetHeight |
| 185 | + } |
158 | 186 | })()
|
0 commit comments