The ::details-content pseudo-element solves a problem that existed since <details> was introduced: you couldn’t style the content area without wrapping it in a div.
::details-content
Baseline 2025 newly available
Supported in Chrome: yes.
Supported in Edge: yes.
Supported in Firefox: yes.
Supported in Safari: yes.
Since September 2025 this feature works across the latest devices and browser versions. This feature might not work in older devices or browsers.
The problem: you want the summary and content to look different, so you’d need to add a wrapper div just for styling:
<!-- The old way: wrapper required for styling --><details> <summary>How do I return an order?</summary> <div class="content-wrapper"> <p> Visit your order page and click "Return Item". You'll receive a prepaid shipping label via email within 24 hours. </p> </div></details>details::summary { padding: 1rem; background: white;}
.content-wrapper { padding: 1rem; background: #f9fafb; border-top: 1px solid #e5e7eb;}Now with ::details-content, forget the wrapper:
<!-- Clean HTML, no wrapper needed --><details> <summary>How do I return an order?</summary> <p> Visit your order page and click "Return Item". You'll receive a prepaid shipping label via email within 24 hours. </p></details>details::summary { padding: 1rem; background: white;}
details::details-content { padding: 1rem; background: #f9fafb; border-top: 1px solid #e5e7eb;}Here’s what that looks like in action:
How do I return an order?
Visit your order page and click "Return Item". You'll receive a prepaid shipping label via email within 24 hours. Ship the item back in original condition.
What's your return window?
We accept returns within 30 days of purchase. Items must be unused, in original packaging, and have the original receipt or proof of purchase.
Do you offer refunds or exchanges?
You can choose between a full refund or an exchange for a different size or color. Refunds are processed within 5-7 business days after we receive your return.
What if my item arrives damaged?
Contact our support team immediately with photos of the damage. We'll send a replacement at no cost or process a full refund, whichever you prefer.
You can also animate it:
details::details-content { opacity: 0; transition: opacity 300ms, content-visibility 300ms allow-discrete;}
details[open]::details-content { opacity: 1;}This fades the content in/out smoothly when opening and closing. The allow-discrete keyword lets content-visibility participate in the transition—important for performance when you have lots of content inside.
::details-content hit Baseline status in September 2025, so it works everywhere: Chrome 131+, Firefox 143+, Safari 18.4+, and Edge 131+. For older browsers, fall back to wrapper divs.
Use it for FAQs, documentation sidebars, expandable menus, pricing tiers, anything where the content needs to look different from the trigger. You get cleaner HTML, less CSS, full control over the content area, and no semantic compromises.