Blog

スクロールに合わせて要素の色を変更する方法

2021.07.30 コーディング

ファーストビューが黒系で下にあるコンテンツ背景が白系みたいな場合、要素の色などを背景に合わせて変更したいというときがあります。

CSSのmix-blend-modeプロパティなんかもあるのですが、いざ使ってみるとしっくり来なかったりすることがわりとあります。

ということで今回は、jQueryでスクロールによってクラス付加→色変更という方法をご紹介します。

スクロールに合わせて要素の色を変更する方法

まずはCSSで元の色とスクロール後の色を指定しておきます。

「#logo」という要素に「.invert」というクラスが付くと色が変わります。

CSS
#logo {
	background: #fefefe; /* 元の色 */
}

#logo.invert {
	background: #111111; /* スクロール後の色 */
}

スクロール位置が任意の場所を越えたら色を変更する

スクロール位置が任意の場所(ここでは500px)を越えたら「#logo」に「.invert」を付加します。

JavaScript
jQuery(function(){

	var logo = jQuery('#logo');
	jQuery(window).scroll(function () {
		if (jQuery(this).scrollTop() > 500) { //スクロールが500pxを越えたら
			logo.addClass('invert');
		} else { //スクロールが500pxを越えなければ
			logo.removeClass('invert');
		}
	});

});

スクロール位置がウィンドウの高さを越えたら色を変更する

ファーストビューが全画面表示の場合はウィンドウの高さを取得して、そこを超えたら「#logo」に「.invert」が付くようにします。

JavaScript
jQuery(function(){

	var logo = jQuery('#logo');
	var height = jQuery(window).height(); //ウィンドウの高さ
	jQuery(window).scroll(function () {
		if (jQuery(this).scrollTop() > height) { //スクロールが画面の高さを越えたら
			logo.addClass('invert');
		} else { //スクロールが画面の高さを越えなければ
			logo.removeClass('invert');
		}
	});

});

レスポンシブにしてみる

レスポンシブデザインの場合、レイアウトによってファーストビューの高さが変わることもあります。

その場合には、ウィンドウ幅によって色が変わるスクロール位置を切り替えます。

JavaScript
jQuery(function($) {
	
	var logo = jQuery('#logo');
	var height = jQuery(window).height();
	var w = $(window).width(); //ウィンドウの高さ
	var x = 960; //タブレットの画面幅
	var y = 560; //スマホの画面幅
	
    if ( w > x ) { //画面幅が961px以上のとき
		
		jQuery(window).scroll(function () {
			if (jQuery(this).scrollTop() > height) { //スクロールが画面の高さを越えたら
				logo.addClass('invert');
			} else { //スクロールが画面の高さを越えなければ
				logo.removeClass('invert');
			}
		});

	} else if( x >= w && w > y ) { //画面幅が561px以上960px以下のとき
		
		jQuery(window).scroll(function () {
			if (jQuery(this).scrollTop() > 500) { //スクロールが500pxを越えたら
				logo.addClass('invert');
			} else { //スクロールが500pxを越えなければ
				logo.removeClass('invert');
			}
		});
		
	} else { //画面幅が560px以下のとき
		
		jQuery(window).scroll(function () {
			if (jQuery(this).scrollTop() > 250) { //スクロールが250pxを越えたら
				logo.addClass('invert');
			} else { //スクロールが250pxを越えなければ
				logo.removeClass('invert');
			}
		});

	}
});

まとめ

以上、スクロールに合わせて要素の色を変更する方法でした。

最近ではCSSでかなりのことができるようになりましたが、それでもJSでないと難しいことやJSでやった方が簡単なこともあります。

どうしておけば後のメンテナンスが楽かなども踏まえて実装できるといいかもしれませんね。