すべての主要ブラウザで利用可能になったアットルール@starting-styleとは
本記事では2024-08-06にリリースされた Firefox 129をもって主要なブラウザすべてで利用可能になったアットルール @start-style
について紹介します。
@starting-style
トランジション開始時のスタイルを指定できる @starting-style
はトランジションされる要素に対して、CSS プロパティの開始値を定義するためのプロパティです。
従来の CSS 記法では display: none;
が指定されている要素にトランジションを使用した場合、トランジションが発生しませんでした。
そこで、@starting-style
ルールを用いてトランジション開始時のスタイルをしているすることで元の要素に display: none;
が指定されていたとしても正しくトランジションを発火させることができるようになります。
.open-content {
display: none;
width: 100px;
@starting-style {
width: 0px;
}
}
.open {
display: block;
transition: width 4s;
}
記法
記法は既存のアットルールと同様に、独立したブロックとして記述する方法か、既存ルールセットの入れ子として記述する方法の二パターンが存在します。
@starting-style {
.hoge {
// style
}
}
.fuga {
// style
@starting-style {
// style
}
}
注意点
@starting-style
は対象となる要素がDOMとしてレンダーされた時もしくは display: none;
から可視状態になった時のみ機能します。
そのため、たとえば既に描画されているコンテンツにトランジションを発火させる時、トランジションの開始フレームを既存の状態から変化させるといった用途で使用することはできません。
下の例は、すでに表示されている要素にトランジションを適用する際、開始直後に一度透明化させる意図で @starting-style
を適用したものです。
display: none;
が適用されている要素は opacity: 0;
が正しく適用されている一方で、既に表示されている方の要素はトランジションが開始しても透明化されていないことがわかります。
そのため、一度発火したトランジションを再度同様に発火させるためには @starting-style
が適用されている要素を削除して再生成するまたは一度 display:none;
へ状態を戻す必要があります。
もし、描画済みの要素に開始フレームを適用したいのであれば @starting-style
ではなく、既存の CSS アニメーションを利用するようにしましょう。
制限事項
Firefox 129現在、初期状態が display: none;
となっている要素に対しては @starting-style
が適用されない部分的サポートという形で導入されています。
今後フルサポートされるまでは Firefoxで前述したような実装ができないため、お気をつけください。
Discussion