CSSのトランジションは、要素のスタイルが変化する際に滑らかなアニメーション効果を提供する便利な機能です。このトランジションが終了するタイミングを検知して追加の処理を行いたい場合に、JavaScriptのtransitionend
イベントを活用できます。今回は、transitionend
イベントの基礎から応用例までをまとめていきたいと思います。
transitionend
イベントは、CSSのtransition
プロパティを使用したスタイル変化が終了したタイミングで発生するイベントです。
これを利用すると、トランジション終了後に動的な処理を実行したり、次の動作を開始することができます。
- トランジションが完全に終了した後に発生します。
- トランジション対象のプロパティ名を取得することが可能です。
- 対象要素に複数のトランジションが設定されている場合、それぞれのプロパティ終了ごとに発生します。
以下のようにaddEventListener
を使ってイベントを検知します。
element.addEventListener('transitionend', (event) => {
console.log('トランジションが終了しました:', event.propertyName);
});
以下は、ボタンをクリックしてトランジションをトリガーし、終了後に追加の処理を行う例です。
See the Pen Untitled by tones (@tonescodedesign) on CodePen.
const box = document.getElementById('box');
const button = document.getElementById('trigger');
// ボタンをクリックしてトランジションをトリガー
button.addEventListener('click', () => {
box.classList.toggle('expand');
});
// トランジション終了時に処理を実行
box.addEventListener('transitionend', (event) => {
console.log(`トランジションが終了しました: ${event.propertyName}`);
alert('トランジションが完了しました!');
});
<button id="trigger">トランジション開始</button>
<div class="box" id="box"></div>
.box {
width: 100px;
height: 100px;
background-color: lightblue;
transition: all 1s ease;
margin: 50px auto;
}
.box.expand {
width: 200px;
height: 200px;
background-color: lightcoral;
}
transitionend
イベントの引数で渡されるevent
オブジェクトには、以下のような便利なプロパティがあります。
propertyName
: トランジションが適用されたCSSプロパティ名。elapsedTime
: トランジションが実行された時間(秒単位)。pseudoElement
: トランジションが疑似要素に適用されている場合、その名前(通常は空文字列)。
box.addEventListener('transitionend', (event) => {
console.log('対象プロパティ:', event.propertyName);
console.log('経過時間:', event.elapsedTime, '秒');
});
CSSで複数のプロパティに対してトランジションを設定している場合、各プロパティごとにtransitionend
イベントが発生します。
.box {
transition: width 1s, height 2s;
}
この場合、transitionend
イベントはwidth
とheight
のトランジション終了時にそれぞれ発生します。
以下は、トランジション終了後に次のアクション(例えば新しいスタイルの適用)を行う例です。
See the Pen transitionend by tones (@tonescodedesign) on CodePen.
const box = document.getElementById('box');
const button = document.getElementById('start');
button.addEventListener('click', () => {
box.classList.add('move');
});
box.addEventListener('transitionend', () => {
box.style.backgroundColor = 'lightcoral';
console.log('次のスタイルを適用しました');
});
<button id="start">トランジション開始</button>
<div class="box" id="box"></div>
.box {
width: 100px;
height: 100px;
background-color: lightblue;
transition: all 1s ease;
}
.box.move {
transform: translateX(200px);
}
複数のCSSプロパティが同時にトランジションする場合、それぞれのプロパティに対してtransitionend
イベントが発生します。そのため、特定のプロパティの終了だけを検知したい場合はevent.propertyName
を条件として利用します。
box.addEventListener('transitionend', (event) => {
if (event.propertyName === 'width') {
console.log('幅のトランジションが終了しました');
}
});
トランジションが途中で中断される(例えばdisplay: none
が適用される)と、transitionend
イベントは発生しません。
transitionend
イベントを活用すると、トランジション終了時のタイミングで次の動作を追加したり、スタイルを更新したりすることができるので、インタラクティブなユーザー体験を提供したい場合に非常に役立ちます。