WEBOPIXEL

脱jQueryの道その2:あの機能は素のJavaScriptでどうやるんだろ編

Posted: 2019.04.18 / Category: javascript 

脱jQueryの道の第二弾です。プラグインを使うまでもない小さな機能はjQuery使わない場合どう書くんだろう。ということでやてってみたいと思います。

Sponsored Link

アニメーションはJavaScriptで制御する方法もありますが、極力CSSでおこないます。
ちなみに脱jQueryの道 第一弾はこちら。

脱jQueryの道 初級編

タブメニュー

ディスプレイnoneblockをフェードインで切り替えたいときはキーフレームアニメーション使うと簡単です。

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');
	}
});