などの疑問や悩みを解決してまいります。
フェードインさせて要素を表示させるサイトをよく見ますが、シンプルにかっこいいですよね。
しかし、さらに見せ方に一工夫加えたいと思っている方もいるのではないでしょうか。
今回は時間差でコンテンツをフェードインさせる方法を解説します。
本記事の前にスクロールして要素をフェードインさせる方法について学びたい方は下記からどうぞ。
-
【jQuery、アニメーション】スクロールして要素をフェードインさせる方法を解説します。
続きを見る
本記事の前に上下左右からフェードインで要素を表示させる方法を学びたい方は下記からどうぞ。
-
【jQuery、アニメーション】上下左右からフェードインで要素を表示させる方法を解説。
続きを見る
まずは完成形を見てみましょう。
See the Pen 時間差フェードイン by koutarou mori (@koutarou-mori) on CodePen.
このようにコンテンツをそれぞれ指定した時間で表示させています。
このフェードインさせる時間とコンテンツの配置を工夫することでさまざまな見せ方ができるので、ぜひこの時間差フェードインを学んで欲しいと思います。
HTMLの解説
<body>
<div class="inner">
<div class="fadeInBlock">
<div class="block fadeIn1500ms">
1.5秒遅れで下から上に移動しながら<br>フェードイン
</div><!-- /.block -->
<div class="block fadeIn1s">
1秒遅れで上から下に移動しながら<br>フェードイン
</div><!-- /.block -->
<div class="block fadeIn500ms">
0.5秒遅れで右から左に移動しながら<br>フェードイン
</div><!-- /.block -->
<div class="block fadeIn2s">
2秒遅れで左から右に移動しながら<br>フェードイン
</div><!-- /.block -->
</div><!-- /.fadeInBlock -->
</div><!-- /.inner -->
</body>
フェードインさせるコンテンツにblockクラスを指定し、それぞれにフェードイン用のクラスを追加で指定しています。
今回フェードイン用のクラスは、0.5秒後にフェードインをするfadeIn500ms
クラス、1秒後にフェードインをするfadeIn1s
クラス、1.5秒後にフェードインをするfadeIn1500ms
クラス、2秒後にフェードインをするfadeIn2s
クラスを用意しました。
CSSの解説
CSSはフェードインの動きに関する箇所に絞って解説していきます。
/* レイアウトCSS */
.inner {
width: 100%;
max-width: 1000px;
margin: 100px auto;
}
.fadeInBlock {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 20px;
}
.block {
color: #fff;
text-align: center;
display: flex;
justify-content: center;
align-items: center;
background-color: #333;
padding: 50px 20px;
}
/* ここから時間差フェードインアニメーション */
/* 1秒間かけてフェードイン */
.fadeIn1s {
animation-name: fadeIn1s;
animation-delay: 1s;
animation-duration: 1.5s;
animation-fill-mode: forwards;
transform: translateY(-50px);
opacity: 0;
}
@keyframes fadeIn1s {
0% {
}
100% {
transform: translateY(0);
opacity: 1;
}
}
/* 1.5秒間かけてフェードイン */
.fadeIn1500ms {
animation-name: fadeIn1500ms;
animation-delay: 1500ms;
animation-duration: 1.5s;
animation-fill-mode: forwards;
transform: translateY(50px);
opacity: 0;
}
@keyframes fadeIn1500ms {
0% {
}
100% {
transform: translateY(0);
opacity: 1;
}
}
/* 0.5秒間かけてフェードイン */
.fadeIn500ms {
animation-name: fadeIn500ms;
animation-delay: 500ms;
animation-duration: 1.5s;
animation-fill-mode: forwards;
transform: translateX(50px);
opacity: 0;
}
@keyframes fadeIn500ms {
0% {
}
100% {
transform: translateX(0);
opacity: 1;
}
}
/* 2秒間かけてフェードイン */
.fadeIn2s {
animation-name: fadeIn2s;
animation-delay: 2s;
animation-duration: 1.5s;
animation-fill-mode: forwards;
transform: translateX(-50px);
opacity: 0;
}
@keyframes fadeIn2s {
0% {
}
100% {
transform: translateX(0);
opacity: 1;
}
}
フェードインさせる要素をopacity: 0;で非表示にする
まずフェードインの動きを実装するので、フェードインさせるコンテンツは最初非表示にしておきます。
そのため非表示とするコンテンツにはopacity: 0;
で非表示にします。
animation-nameプロパティでアニメーションの名前を指定する
CSSアニメーションを実装するためにはアニメーションの名前を決めなくてはなりません。
ここで決めた名前を@keyframes
にセットすることでアニメーションを実装することができます。
今回は分かりやすくアニメーションが開始される秒数にちなんだ名前にしています。
0.5秒後にフェードインアニメーション開始 ⇒ fadeIn500ms
1秒後にフェードインアニメーション開始 ⇒ fadeIn1s
1.5秒後にフェードインアニメーション開始 ⇒ fadeIn1500ms
2秒後にフェードインアニメーション開始 ⇒ fadeIn2s
animation-delayプロパティでアニメーションの開始時間を指定
今回の時間差フェードインを実現する上で欠かせないプロパティです。
animation-delay
プロパティでアニメーションの開始時間を指定することができます。
時間を指定する際の単位は以下の通りです。
ポイント
〇 「s」は秒単位を示し、1sとすると1秒ということになる
〇 「ms」はミリ秒単位を示し、1000msで1秒となる(0.5sだと500msと同じになり0.5秒ということになる)
今回は以下のようにそれぞれ指定しています。
0.5秒後にフェードインアニメーション開始 ⇒ 500ms
1秒後にフェードインアニメーション開始 ⇒ 1s
1.5秒後にフェードインアニメーション開始 ⇒ 1500ms
2秒後にフェードインアニメーション開始 ⇒ 2s
animation-durationプロパティで再生時間を指定
animation-duration
プロパティはアニメーションが開始してから終了するまでの時間を指定するプロパティです。
値に指定できる時間はanimation-delay
プロパティと同様です。
今回は1.5秒間の間で要素をフェードイン表示させたいのでanimation-duration: 1.5s;
を指定しています。
animation-fill-mode: forwards;でアニメーション終了状態を維持
通常ですとCSSアニメーションは、一度アニメーションが実行されるとアニメーション開始前の状態に戻ってしまいます。
animation-fill-mode: forwards;
を指定することでアニメーションの終了した状態で維持してくれます。
要素を動かすためにtransformプロパティのtranslate()関数を使用する
要素を動かしながらフェードインさせるためには要素のスタート位置を決めて、アニメーション終了後には元々の位置に戻す動きを作る必要があります。
これを実現するためにtransform
プロパティのtranslate()
関数を使用します。
例えば上から下に50px移動しながらフェードインさせたい場合は、transform: translateY(-50px);
をスタート位置に指定して、アニメーション終了時にtransform: translateY(0);
とすることで実装することができます。
@keyframesで終了時にtransformプロパティのtranslateY(0);もしくはtranslateX(0);で位置を戻す
それぞれの要素はtransform
プロパティのtranslate()
関数で位置を指定していると解説しました。
@keyframes
の終了時にtranslate()
関数の値を0とすることで、スタート位置から元の位置に戻る動きを、フェードインしながら実現してくれます。
translateY()
関数に値を指定してスタート位置を決めて、@keyframes
の終了時に値を0とすることで縦の動きを、translateX()
関数に値を指定して@keyframes
の終了時に値を0とすることで横の動きを実現することができます。
@keyframesの終了時にopacity: 1;として要素を表示
フェードインさせる要素は原則として最初は要素を非表示にする必要があります。
なのでフェードイン用のクラスにはopacity: 0;
を指定して要素を透明にしました。
@keyframes
の終了時にopacity: 1;
を指定することで要素を表示させることができます。
jQueryを使用してスクロールに連動して時間差フェードインを実装する
次に応用でスクロールに連動して時間差フェードインを実装していきます。
まずは完成形を見てみましょう。
スクロールに連動した時間差フェードインの完成例は以下です。
See the Pen 時間差フェードイン(スクロール連動) by koutarou mori (@koutarou-mori) on CodePen.
最初に解説したコードを少し変更して、スクロールに連動した時間差フェードインを実装しています。
変更している箇所のみ解説していきます。
CSSの解説
今回変更となっているのはanimation-name
プロパティを今回用意した新たなクラスに移動させています。
.fadeInAnime1s {
animation-name: fadeIn1s;
}
.fadeInAnime1500ms {
animation-name: fadeIn1500ms;
}
.fadeInAnime500ms {
animation-name: fadeIn500ms;
}
.fadeInAnime2s {
animation-name: fadeIn2s;
}
このクラスを一定の高さまでスクロールしたら、フェードインさせる要素にJQueryを使用して追加するようにしています。
jQueryの解説
$(function () {
// ウィンドウをスクロールしたら…
$(window).scroll(function () {
// ウィンドウの高さを取得
const wHeight = $(window).height();
// スクロールした量を取得
const wScroll = $(window).scrollTop();
// それぞれのblockクラスに対して…
$(".block").each(function () {
// それぞれのblockクラスのウィンドウからの高さを取得
const bPosition = $(this).offset().top;
// スクロールした量が要素の高さを上回ったら
// その数値にウィンドウの高さを引き、最後に200pxを足す
if (wScroll > bPosition - wHeight + 200) {
$(".fadeIn1s").addClass("fadeInAnime1s");
$(".fadeIn750ms").addClass("fadeInAnime750ms");
$(".fadeIn500ms").addClass("fadeInAnime500ms");
$(".fadeIn250ms").addClass("fadeInAnime250ms");
}
});
});
});
スクロールに連動してフェードインさせる方法は、以下記事に解説がございます。
-
【jQuery、アニメーション】スクロールして要素をフェードインさせる方法を解説します。
続きを見る
スクロールで一定の高さまで来たら、addclass()
関数でフェードインさせるためのクラスを追加しています。
addClass(class) - jQuery 日本語リファレンス
このクラスが追加されることでスクロールに連動して時間差フェードインが実現できます。
時間差でフェードインさせる方法のまとめ
ポイント
- フェードインさせる要素はあらかじめ
opacity: 0;
で非表示にしておく animation-name
プロパティでアニメーションの名前を指定するanimation-delay
プロパティでアニメーションの開始時間を指定animation-duration
プロパティで再生時間を指定- 秒数の単位は「s」、ミリ秒の単位は「ms」で指定することができる
animation-fill-mode: forwards;
でアニメーション終了状態を維持@keyframes
で終了時にtransform
プロパティのtranslateY(0);
もしくはtranslateX(0);
で要素の位置を元に戻す@keyframes
の終了時にopacity: 1;
として要素を表示addClass()
関数はクラスを追加する関数