Spaces:
Sleeping
Sleeping
| /** | |
| * Slide up/down | |
| * Code from https://dev.to/bmsvieira/vanilla-js-slidedown-up-4dkn | |
| * @param target | |
| * @param duration | |
| */ | |
| let slideUp = (target: HTMLElement, duration = 500) => { | |
| target.classList.add('transiting'); | |
| target.style.transitionProperty = 'height, margin, padding'; | |
| target.style.transitionDuration = duration + 'ms'; | |
| ///target.style.boxSizing = 'border-box'; | |
| target.style.height = target.offsetHeight + 'px'; | |
| target.offsetHeight; | |
| target.style.overflow = 'hidden'; | |
| target.style.height = "0"; | |
| target.style.paddingTop = "0"; | |
| target.style.paddingBottom = "0"; | |
| target.style.marginTop = "0"; | |
| target.style.marginBottom = "0"; | |
| window.setTimeout(() => { | |
| target.classList.remove('show') | |
| target.style.removeProperty('height'); | |
| target.style.removeProperty('padding-top'); | |
| target.style.removeProperty('padding-bottom'); | |
| target.style.removeProperty('margin-top'); | |
| target.style.removeProperty('margin-bottom'); | |
| target.style.removeProperty('overflow'); | |
| target.style.removeProperty('transition-duration'); | |
| target.style.removeProperty('transition-property'); | |
| target.classList.remove('transiting'); | |
| }, duration); | |
| } | |
| let slideDown = (target: HTMLElement, duration = 500) => { | |
| target.classList.add('transiting'); | |
| target.style.removeProperty('display'); | |
| target.classList.add('show'); | |
| let height = target.offsetHeight; | |
| target.style.overflow = 'hidden'; | |
| target.style.height = "0"; | |
| target.style.paddingTop = "0"; | |
| target.style.paddingBottom = "0"; | |
| target.style.marginTop = "0"; | |
| target.style.marginBottom = "0"; | |
| target.offsetHeight; | |
| ///target.style.boxSizing = 'border-box'; | |
| target.style.transitionProperty = "height, margin, padding"; | |
| target.style.transitionDuration = duration + 'ms'; | |
| target.style.height = height + 'px'; | |
| target.style.removeProperty('padding-top'); | |
| target.style.removeProperty('padding-bottom'); | |
| target.style.removeProperty('margin-top'); | |
| target.style.removeProperty('margin-bottom'); | |
| window.setTimeout(() => { | |
| target.style.removeProperty('height'); | |
| target.style.removeProperty('overflow'); | |
| target.style.removeProperty('transition-duration'); | |
| target.style.removeProperty('transition-property'); | |
| target.classList.remove('transiting'); | |
| }, duration); | |
| } | |
| let slideToggle = (target, duration = 500) => { | |
| if (window.getComputedStyle(target).display === 'none') { | |
| return slideDown(target, duration); | |
| } else { | |
| return slideUp(target, duration); | |
| } | |
| } | |
| export default function () { | |
| const toggleMenu = document.getElementById('toggle-menu'); | |
| if (toggleMenu) { | |
| toggleMenu.addEventListener('click', () => { | |
| if (document.getElementById('main-menu').classList.contains('transiting')) return; | |
| document.body.classList.toggle('show-menu'); | |
| slideToggle(document.getElementById('main-menu'), 300); | |
| toggleMenu.classList.toggle('is-active'); | |
| }); | |
| } | |
| } |