アニメーションはJavaScriptで制御する方法もありますが、極力CSSでおこないます。
ちなみに脱jQueryの道 第一弾はこちら。
脱jQueryの道 初級編
タブメニュー
ディスプレイnone
とblock
をフェードインで切り替えたいときはキーフレームアニメーション使うと簡単です。
See the Pen NativeJS Tab Menu by webopixel (@webopixel) on CodePen.
JavaScript
(() => { document.querySelectorAll('.tab-block').forEach((tabContents) => { let activeIndex = 0; const tabNav = tabContents.querySelectorAll('.tab-nav li'); const tabBody = tabContents.querySelectorAll('.tab-body li'); tabNav.forEach((nav, index) => { nav.addEventListener('click', (e) => { if (activeIndex === index) return; tabBody[activeIndex].classList.remove('active'); tabNav[activeIndex].classList.remove('active'); e.target.classList.add('active'); tabBody[index].classList.add('active'); activeIndex = index; }); }); }); })();
アコーディオン
height:auto
はアニメーションできないので、一旦JSでheightを取得してます。
window.addEventListener('load')
後でないと正確なheightを取得できません。
See the Pen NativeJS Accordion Menu by webopixel (@webopixel) on CodePen.
JavaScript
window.addEventListener('load', () => { document.querySelectorAll('.accordion').forEach((accordion) => { let activeIndex = null; const accordionToggle = accordion.querySelectorAll('.submenu-toggle'); const accordionList = accordion.querySelectorAll('.accordion > li'); // autoはアニメーション設定できない為height取得 accordion.querySelectorAll('.submenu').forEach((submenu) => { submenu.style.height = submenu.clientHeight + 'px'; submenu.parentNode.classList.add('close'); }); accordionToggle.forEach((toggleBtn, index) => { toggleBtn.addEventListener('click', (e) => { if (activeIndex !== null && activeIndex !== index) { accordionList[activeIndex].classList.add('close'); } e.target.parentNode.classList.toggle('close'); activeIndex = index; }); }); }); });
ドロップダウンメニュー
マウスオーバー/アウトのクラスの切り替えだけでいけます。
See the Pen NativeJS Sub Menu by webopixel (@webopixel) on CodePen.
JavaScript
(() => { document.querySelectorAll('.nav-toggle').forEach((nav) => { nav.addEventListener('mouseenter', (e) => { e.target.classList.add('open'); }); nav.addEventListener('mouseleave', (e) => { e.target.classList.remove('open'); }); }); })();
スクロールすると変化する
スクロールするとナビゲーションがちょっと狭くなる例です。
これもwindow.addEventListener('scroll')
でクラスを切り替えるだけですね。
See the Pen NativeJS Scroll Change Navigation by webopixel (@webopixel) on CodePen.
JavaScript
window.addEventListener('scroll', () => { const globalNav = document.querySelector('#global-nav'); let scrollTop = document.scrollingElement.scrollTop; if (scrollTop > 10) { globalNav.classList.add('scroll'); } else { globalNav.classList.remove('scroll'); } });