以前にdetails要素の開閉アニメーションをJavaScriptを併用して実装する記事を投稿しましたが、今回はCSSのみでフェードの切り替えを対応する方法を検討してみます。
サンプルコード
今回は以下のHTMLで実装を試していきます。
<details class="accordion">
<summary class="accordion__title">リゼ・ヘルエスタ</summary>
<div class="accordion__content">
<p>ヘルエスタ王国の第二皇女。<br>
文武両道学園主席、真面目で誰にでも優しくかなりの人望がある。<br>
王位継承の資格者として日々鍛錬や人とのコミュニケーションを大事にしている。</p>
<p>ファンアート:<a href="https://twitter.com/hashtag/%E3%83%98%E3%83%AB%E7%B5%B5%E3%82%B9%E3%82%BF">#ヘル絵スタ</a></p>
</div>
</details>
まずはkeyframesを使用する方法です。
CSSは必要な箇所のみの抜粋になりますので、全体のコードはデモページをご確認ください。
.accordion[open] .accordion__content {
animation: fadeIn 400ms ease;
}
@keyframes fadeIn {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
open属性が付与された際にkeyframesでフェードインのアニメーションを行っています。
keyframesを使用するデモページ
この実装の場合、フェードアウトのアニメーションはできません。
次に以前投稿した@starting-styleの記事でも試した、@starting-styleを使用する方法を試してみます。
.accordion__content {
opacity: 0;
transition:
opacity 400ms,
display 400ms allow-discrete;
}
.accordion[open] .accordion__content {
opacity: 1;
@starting-style {
opacity: 0;
}
}
この場合も先ほどと同様に、フェードインのアニメーションは再現できましたが、フェードアウトのアニメーションができないようでした。
@starting-styleを使用するデモページ
::details-content
最後に試す方法が::details-content疑似要素です。
::details-content疑似要素は、details要素の折りたたみ可能な要素(details要素内のsummary要素以外)を表します。
detail要素はShadow DOMを使って実装されていて、::details-content疑似要素は折りたたみ要素をラップするslotを対象とするようです。
::details-content疑似要素を使って設定を試してみます。
その際、content-visibilityプロパティとallow-discreteキーワードをあわせてtransitionに設定する必要があります。
.accordion::details-content {
opacity: 0;
transition:
content-visibility 400ms allow-discrete,
opacity 400ms;
}
.accordion[open]::details-content {
opacity: 1;
}
この場合はフェードイン、フェードアウト共にアニメーションさせることができました。
::details-contentを使用するデモページ
対応ブラウザ
::details-content疑似要素は主要ブラウザで対応しています。
ただ、chromeはバージョン131(2024年11月)、Safariは18.4(2025年3月)、Firefoxは143(2025年9月)と比較的最近サポートされているので、対応範囲によってはkeyframesを使った方法にするなどの検討が必要そうです。
コメントが承認されるまで時間がかかります。