@starting-styleは、要素が初めて表示される瞬間の開始スタイルを定義するCSSです。従来は遷移しにくかったdisplay: noneからの表示や、Popover・dialogがtop layerへ入る瞬間に、自然なフェードと移動を付けられます。
情報確認日:2026年8月20日
結論:開始値は@starting-style、離散状態はallow-discrete
必要な組み合わせ
- 通常の表示状態に
opacity: 1などの終了値を書く @starting-styleへ初回表示のopacity: 0などを書くdisplayやoverlayも遷移対象にするならallow-discreteを指定する- 未対応時でも内容は瞬時に表示される設計にする
Popoverを開閉して開始スタイルを確認する
WORKING DEMO
display状態をまたいでフェード+移動
保存しました
表示の開始値を@starting-style、開いた状態を:popover-openで定義しています。
「動きを減らす」設定ではアニメーションを無効にしています。
なぜ従来はdisplay:noneから遷移できなかったのか
transitionには変更前と変更後の計算済みスタイルが必要です。しかしdisplay: noneの要素は描画されず、表示された最初のstyle updateでは比較する前の値がありません。@starting-styleはその開始値を与えます。
またdisplayは連続的な数値ではなく離散プロパティです。これをtransitionの時間に含めるにはtransition-behavior: allow-discrete、または短縮記法の各項目へallow-discreteを指定します。
通常要素の最小例
.notice {
opacity: 1;
transform: translateY(0);
transition: opacity 200ms, transform 200ms;
}
@starting-style {
.notice {
opacity: 0;
transform: translateY(0.75rem);
}
}
DOMへ後から追加された要素や、以前レンダリングされていなかった要素が最初に描画されるとき、starting styleから通常スタイルへ遷移できます。同じ要素を表示したままクラス変更する通常のtransitionでは、必須ではありません。
Popoverで開閉の両方向を作る
.notice-popover {
opacity: 0;
transform: translateY(0.75rem) scale(0.96);
transition:
opacity 200ms,
transform 200ms,
display 200ms allow-discrete,
overlay 200ms allow-discrete;
}
.notice-popover:popover-open {
opacity: 1;
transform: translateY(0) scale(1);
}
@starting-style {
.notice-popover:popover-open {
opacity: 0;
transform: translateY(0.75rem) scale(0.96);
}
}
閉じた通常状態を透明にし、開いた状態を不透明にします。displayとoverlayを時間中に維持することで、閉じる途中で要素が即座に消えるのを防ぎます。
入れ子記法と独立記法
CSS nestingを使える構成なら、ルール内へ@starting-styleを入れて関連を近づけられます。一方、ビルドツールや既存の記述規約との互換性を優先するなら、前の例のような独立ブロックが読みやすい場合があります。
.toast {
opacity: 1;
transition: opacity 180ms;
@starting-style {
opacity: 0;
}
}
@keyframesとの使い分け
| 要件 | 向く方法 |
|---|---|
| 状態Aから状態Bへ滑らかに変える | transition |
| 初回表示の開始値を補う | @starting-style+transition |
| 途中に複数の演出点がある | @keyframes |
| 繰り返しや自動再生 | @keyframes |
@starting-styleはアニメーション全般の代替ではありません。「遷移前の計算済みスタイルが存在しない」という穴を埋めるものです。
動かないときの確認項目
- 通常状態にtransitionが指定されているか
- starting styleと通常状態に差があるか
- display等へ
allow-discreteを指定したか - セレクターの詳細度と記述順で上書きされていないか
- ブラウザ対応と
prefers-reduced-motionを確認したか
開始スタイルのルールは、同じ詳細度なら通常ルールより後に置くのが安全です。CSS Modulesやminifierを通す場合は、生成後CSSでも順序を確認します。
未対応環境の考え方
未対応ブラウザでは、開始スタイルが無視され、要素がアニメーションなしで表示されます。これを正常なフォールバックにできるよう、可視性や操作可能性をアニメーションへ依存させないでください。演出が必須要件ならJavaScript animationを検討しますが、通常の通知やPopoverでは瞬時表示で十分です。
よくある質問
@starting-styleだけでアニメーションしますか?
しません。開始値を定義するためのルールなので、通常状態にtransitionが必要です。
閉じるアニメーションにも必要ですか?
starting styleは主に表示開始を助けます。閉じる側は終了状態、transition、displayやoverlayの離散遷移を組み合わせます。
display:none以外でも使えますか?
使えます。DOMへ追加された要素など、前回のstyle updateで描画されていなかった要素の開始遷移に利用できます。
まとめ
@starting-styleは、初回表示に足りなかった「変更前の値」をCSSへ与えます。通常状態、開始状態、transitionを分け、displayやtop layerをまたぐ場合はallow-discreteを追加してください。未対応時は瞬時表示できることを成功条件にします。