いろいろなWebサイトで、スクロールしていくと画像がフェードインしてきたり、上下左右からスライドしながら出現したりするのを見かけます。
実現方法をネットで調べると、例えばX方向にスライドしながら出現させる場合は、
- CSSで初期状態のX方向の位置をずらしておく。
- jQueryで、スクロール量が所定値を超えたらX方向の位置を適切な位置に戻す。
という方法が採られるようです。X方向の位置の指定には”transform: translateX(xpos)”が使用され、xposは1.では0以外の値、2.では0が指定されます。
これだと、1枚の画像に適用する場合や、複数の画像に対して同じ出現方法を適用する場合はいいのですが、複数の画像を異なる方法で出現させたい場合は、個別にjQueryコードを用意しなきゃならんの?と思ったので、共通のjQueryコードで実現する方法を考えてみました。
思いついたのは、
- 各画像に個別IDと共通クラスを設定する。
- jQueryで、スクロール量が所定値を超えたら共通クラスを持つオブジェクトにクラス(例:”visible”)を追加する(クラスの追加は「スクロール時にヘッダを固定する」でも使いました)。
- CSSで個別id単独の場合と、クラス”visible”が追加された場合のスタイルを設定する。
という方法です。
早速試してみます。
1. 右からフェードイン
figureタグに対し、ID “fadeinImg1″、クラス”fadein”を設定しています。
CSS設定、jQueryコードは下記の通りです。
<CSS>
#fadeinImg1 {
opacity: 0;
transform: translate(200px, 0);
transition: 1s;
}
#fadeinImg1.visible {
opacity: 1;
transform: translate(0, 0);
}
- opacity:初期状態は0(透明)、クラス”visible”付加時は1。これは以降も共通です。
- X方向の位置を、初期状態では右に200pxずらし、クラス”visible”付加時は元に戻します。
<jQuery>
jQuery(function() {
var _window = jQuery(window),
_fadein = jQuery('.fadein');
_window.on('scroll', function() {
_fadein.each(function() {
var _element = jQuery(this);
var elePos = _element.offset().top;
var scroll = _window.scrollTop();
var winHeight = _window.height();
if (scroll > elePos - winHeight + 200) {
_element.addClass('visible');
} else {
_element.removeClass('visible');
}
});
});
});
“_fadein.each(function() { })”で、クラス”fadein”を持つ全オブジェクトに対し、下記の処理を行います。
- _element:クラス”fadein”を持つ各オブジェクト
- elePos:_elementの左上隅のY座標値
- scroll:スクロール量
- winHeight:ウィンドウの高さ
- スクロール量が所定値より大きい場合(scroll > elePos – winHeight +200)、オブジェクトにクラス”visible”を追加し、それ以外の場合はオブジェクトからクラス”visible”を削除します。
今回は繰り返し動作を確認できるよう、クラス”visible”を削除する処理も入れています。
なお、上記のjQueryコードは全画像共通なので、以降は示しません。
2. 左からフェードイン
figureタグに対し、ID “fadeinImg2″、クラス”fadein”を設定しています。
CSS設定は下記の通りです。
<CSS>
#fadeinImg2 {
opacity: 0;
transform: translate(-200px, 0) rotateZ(360deg);
transition: 1s;
}
#fadeinImg2.visible {
opacity: 1;
transform: translate(0, 0) rotateZ(0);
}
- X方向の位置を、初期状態では左に200pxずらし、クラス”visible”付加時は元に戻します。
- Z軸周りの回転動作を追加しています。”transform”は一度に複数の動作を指定できます!
3. 上からフェードイン
figureタグに対し、ID “fadeinImg3″、クラス”fadein”を設定しています。
CSS設定は下記の通りです。
<CSS>
#fadeinImg3 {
opacity: 0;
transform: translate(0, -200px);
transition: 1s;
}
#fadeinImg3.visible {
opacity: 1;
transform: translate(0, 0);
}
- Y方向の位置を、初期状態では上に200pxずらし、クラス”visible”付加時は元に戻します。
ゆっくりスクロールすると、画像が表示されたり消えたりしてちょっと微妙です。
4. 下からフェードイン
figureタグに対し、ID “fadeinImg4″、クラス”fadein”を設定しています。
CSS設定は下記の通りです。
<CSS>
#fadeinImg4 {
opacity: 0;
transform: translate(0, 200px) rotateY(360deg);
transition: 1s;
}
#fadeinImg4.visible {
opacity: 1;
transform: translate(0, 0) rotateY(0);
}
- Y方向の位置を、初期状態では下に200pxずらし、クラス”visible”付加時は元に戻します。
- Y軸周りの回転動作を追加しています。
5. 拡大しながらフェードイン
figureタグに対し、ID “fadeinImg5″、クラス”fadein”を設定しています。
CSS設定は下記の通りです。
<CSS>
#fadeinImg5 {
opacity: 0;
transform: scale(0.5, 0.5);
transition: 3s;
}
#fadeinImg5.visible {
opacity: 1;
transform: scale(1, 1);
}
- 縦横の倍率を、初期状態では0.5倍とし、クラス”visible”付加時は等倍に戻します。
- これまでより遷移時間を長くしています。
以上、ひとつのjQueryコードで5通りの画像の表示方法を実践してみました。通常はこんなバラバラな表示方法を使うことはないと思いますが^_^;
最後までお読みいただきありがとうございました。