CSSの記述だけでも、いろんな表現やアニメーションもできるようになりました。
そんなCSSで使う animation
プロパティに、JavaScriptの .addEventListener
の animationend
を使うことで、アニメーションが完了した時に指定した処理を実行させることができます。
今回は、そんな animationend
のイベントを使ったスニペットです。是非、参考にしてみてください。
.addEventListener
JavaScriptの .addEventListener
は、指定した要素のイベント毎に呼び出される関数を設定するメソッドです。以下は書き方で、「event」には読んでそのままですがイベントを指定します。
document.getElementById('element').addEventListener('event', () => {
// ここに処理内容
});
この記事でのイベントは2種で、以下のイベントを使用して処理を実行させています。
- click … マウスによるクリックやスマホのタップで発生します。
- animationend … CSSの animation プロパティが完了したときに発生します。
click
は比較的よく使うイベントですが、指定要素の animationプロパティが完了した時に実行される animationend
で時間差を作ります。
後述するJavaScriptのコードで、特に「animationend
」を注目してみてください。
アニメーションさせながら画像を時間差で表示するサンプル
「アニメーション開始」のボタンを押すと、3つのキャラクターが真ん中から順に下から上に向かってアニメーションで表示されます。
表示後「アニメーション開始」を押すとリセットがかかり、さらにもう一回ボタンを押すともう一度アニメーションで表示されます。
画像は順番にアニメーション表示されます。
実装の手順と方法
それぞれのコードの解説の前に、実装の手順と方法について簡単にご説明します。
はじめに、設置したい場所へHTMLを記述します。
<div class="animeObj">
<!-- 画像3種 -->
<img src="https://dubdesign.net/wp-content/uploads/2022/07/obj002.svg" alt="左" class="item item2">
<img src="https://dubdesign.net/wp-content/uploads/2022/07/obj001.svg" alt="真ん中" class="item item1">
<img src="https://dubdesign.net/wp-content/uploads/2022/07/obj003.svg" alt="右" class="item item3">
<!-- 画像3種 -->
</div>
<button id="animeBtn"><i class="fas fa-play-circle"></i> アニメーション開始</button>
次に、JavaScriptのコードをページに記述します。これは、Grid.jsの機能やテーブルセルを指定するオプションです。
コードは <body>〜</body>
で、</body>
の閉じタグ(クロージングタグ)の前に記述しましょう。
// 各要素を取得
const item1 = document.querySelector('.item1');
const item2 = document.querySelector('.item2');
const item3 = document.querySelector('.item3');
const animeBtn = document.getElementById('animeBtn');
// ボタンクリックの処理
animeBtn.addEventListener('click', () => {
// item2〜3はclass削除。item1はトグルでclass追加・削除。
item2.classList.remove('active');
item3.classList.remove('active');
item1.classList.toggle('active');
});
item1.addEventListener('animationend', () => {
// item1のアニメーションが完了したらitem2に.activeを付与
item2.classList.add('active');
});
item2.addEventListener('animationend', () => {
// item2のアニメーションが完了したらitem3に.activeを付与
item3.classList.add('active');
});
最後にCSSを記述します。
/* コンテナ */
.animeObj {
display: flex;
align-items: flex-end;
justify-content: center;
margin-bottom: 30px;
gap: 25px;
background: url(https://dubdesign.net/wp-content/uploads/2022/07/samplebg.svg)no-repeat;
background-size: cover;
background-position-y: bottom;
height: 320px;
padding-bottom: 30px;
}
/*各item */
.animeObj .item {
width: 100%;
max-width: 80px;
opacity: 0;
transform: translateY(50%);
}
/* クリックでactive付与後 */
.item1.active,
.item2.active, .item3.active {
animation: itemMove 1s ease both;
}
/* アニメーションを定義 */
@keyframes itemMove {
0% {
opacity: 0;
transform: translateY(50%);
}
50% {
opacity: 1;
}
100% {
opacity: 1;
transform: translateY(0);
}
}
これで完成です。
ざっくりとしたコードの解説
コードはHTML・JavaScript・CSSの3種類です。ざっくりですが、順に解説していきます。
HTML
HTMLは「animeObj」のclass名を持つ親要素に、img
タグの子要素が3つ並べます。そして、button
タグが「animeObj」の親要素と並列で並ぶ構造です。
<div class="animeObj">
<!-- 画像3種 -->
<img src="https://dubdesign.net/wp-content/uploads/2022/07/obj002.svg" alt="左" class="item item2">
<img src="https://dubdesign.net/wp-content/uploads/2022/07/obj001.svg" alt="真ん中" class="item item1">
<img src="https://dubdesign.net/wp-content/uploads/2022/07/obj003.svg" alt="右" class="item item3">
<!-- 画像3種 -->
</div>
<button id="animeBtn"><i class="fas fa-play-circle"></i> アニメーション開始</button>
JavaScript
JavaScriptは、まずはじめに各要素を全て取得して、その後は「ボタンクリック時」「item1〜2の要素のアニメーションが完了した時」の2つで処理をそれぞれ実行させます。
// 各要素を取得
const item1 = document.querySelector('.item1');
const item2 = document.querySelector('.item2');
const item3 = document.querySelector('.item3');
const animeBtn = document.getElementById('animeBtn');
// ボタンクリックの処理
animeBtn.addEventListener('click', () => {
// item2〜3はclass削除。item1はトグルでclass追加・削除。
item2.classList.remove('active');
item3.classList.remove('active');
item1.classList.toggle('active');
});
item1.addEventListener('animationend', () => {
// item1のアニメーションが完了したらitem2に.activeを付与
item2.classList.add('active');
});
item2.addEventListener('animationend', () => {
// item2のアニメーションが完了したらitem3に.activeを付与
item3.classList.add('active');
});
コメントアウトにもそれぞれ書いていますが、.addEventListener
が入れ子状に処理内容が記述されてるので、雰囲気的にも理解しやすい構造だと思います。
CSS
CSSは、flexboxのレイアウトで画像を並べ、JavaScriptで .item
のclass名を持つ要素に付与される「active」で、アニメーションが走り、それぞれの要素が時間差で表示させています。
/* コンテナ */
.animeObj {
display: flex;
align-items: flex-end;
justify-content: center;
margin-bottom: 30px;
gap: 25px;
background: url(https://dubdesign.net/wp-content/uploads/2022/07/samplebg.svg)no-repeat;
background-size: cover;
background-position-y: bottom;
height: 320px;
padding-bottom: 30px;
}
/*各item */
.animeObj .item {
width: 100%;
max-width: 80px;
opacity: 0;
transform: translateY(50%);
}
/* クリックでactive付与後 */
.item1.active,
.item2.active, .item3.active {
animation: itemMove 1s ease both;
}
/* アニメーションを定義 */
@keyframes itemMove {
0% {
opacity: 0;
transform: translateY(50%);
}
50% {
opacity: 1;
}
100% {
opacity: 1;
transform: translateY(0);
}
}
ちなみに今回の animetion
は、opacity
と一緒に下から上に動かす形でアニメーションさせていますが、それ以外のアニメーションについては以下の記事も参考にしてみてください。
関連記事 CSSのanimationプロパティでできるアニメーション20選
さいごに
CSSで基本のアニメーションを作り、JavaScriptで時間差をつけるだけなので、応用すればLPのヒーローエリアなどのエリアを装飾できます。
また、カスタマイズも簡単なので是非参考にして使ってみてください。