通常、疑似要素は JavaScript で直接操作できませんが、Web Animation API を利用すると比較的簡単に素の JavaScript でアニメーションを設定することができます。
animate() メソッドの第2引数(または KeyframeEffect() の第3引数)のオブジェクトで pseudoElement プロパティに疑似要素を指定することで、通常の要素と同じようにアニメーションを設定できます。
pseudoElement プロパティには疑似要素セレクターを表す文字列(::after、::before、および ::marker)を指定することができます。
以下は p 要素のテキストの左側に擬似要素 ::before で作成した三角形を表示して、テキストをクリックすると疑似要素の三角形を回転するアニメーションの例です。
三角形が回転している状態でクリックすると、アニメーションを停止します。
Click !
<p id="triangle">Click !</p>
疑似要素 ::before で正三角形のアイコンを挿入しています。
関連ページ:CSS 擬似要素 ::before ::after
#triangle {
position: relative;
padding-left: 30px;
cursor: pointer;
}
#triangle::before {
content: "";
position: absolute;
top: 0;
bottom: 0;
left: 0;
margin: auto 0;
border-bottom: calc(10px * 1.732) solid #139563;
border-left: 10px solid transparent;
border-right: 10px solid transparent;
width: 0;
height: 0;
transform-origin: 50% 58%;
}
アニメーションの設定方法は色々な方法がありますが、以下では animate() メソッドで Animation オブジェクトを作成し、クリックイベントで再生・停止するようにしています。
関連ページ:JavaScript でアニメーション Web Animation API
document.addEventListener('DOMContentLoaded', () => {
// 対象の要素を取得
const target = document.getElementById('triangle');
// animate() で Animation オブジェクトを作成
const animation = target.animate(
// キーフレームオブジェクトに回転のアニメーションを指定
{ rotate: ["0deg", "360deg"] },
{
duration: 3000,
// pseudoElement プロパティに対象の擬似要素を指定
pseudoElement: "::before",
iterations: Infinity
}
);
// アニメーションの自動再生を停止
animation.cancel();
// クリックイベントのリスナーを設定
target.addEventListener("click", (e) => {
const playState = animation.playState;
if(playState === 'running') {
// アニメーションが再生中の場合は停止
animation.pause();
}else{
// アニメーションが再生中でなければ再生
animation.play();
}
});
});