{"id":8485,"date":"2026-02-04T20:06:54","date_gmt":"2026-02-05T01:06:54","guid":{"rendered":"https:\/\/frontendmasters.com\/blog\/?p=8485"},"modified":"2026-02-04T20:08:35","modified_gmt":"2026-02-05T01:08:35","slug":"an-over-the-top-spoiler-design-with-the-details-element","status":"publish","type":"post","link":"https:\/\/frontendmasters.com\/blog\/an-over-the-top-spoiler-design-with-the-details-element\/","title":{"rendered":"An Over-The-Top Spoiler Design with the Details Element"},"content":{"rendered":"\n<p>After reading <a href=\"https:\/\/frontendmasters.com\/blog\/performance-optimized-video-embeds-with-zero-javascript\/\">Stefan Bauer&#8217;s fancy idea for toggling a video preview<\/a> to a real embedded video with a <code>&lt;details&gt;<\/code> element, it had me thinking just how powerful having an generic &#8220;toggle&#8221; is in HTML. In CSS, ages ago, we <a href=\"https:\/\/css-tricks.com\/the-checkbox-hack\/\">got the <code>:checked<\/code> pseudo selector<\/a>, and it has been used to gosh-danged high heaven to make interactive things on websites. It&#8217;s just a toggle. And now toggles are getting easier and easier to make. <\/p>\n\n\n\n<p>On top of that, we don&#8217;t have to be as tricky with how we structure things to use that toggle. When all we had was <code>:checked<\/code>, we had to use <code>:checked ~ .something-else<\/code> style selectors to do more interesting things on the page. Now we essentially just don&#8217;t have to. <\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">body<\/span><span class=\"hljs-selector-pseudo\">:has(<\/span><span class=\"hljs-selector-id\">#toggle<\/span><span class=\"hljs-selector-pseudo\">:checked)<\/span> {\n  <span class=\"hljs-comment\">\/* style the body *\/<\/span>\n\n  .something-else {\n    <span class=\"hljs-comment\">\/* style anything else *\/<\/span>\n  }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>DOM be damned. <\/p>\n\n\n\n<p>This is basically the same with a <code>&lt;details&gt;<\/code> element (toggle). <\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">details<\/span> {\n  <span class=\"hljs-comment\">\/* style the &lt;details&gt; *\/<\/span>\n\n  &amp;&#91;open] {\n    <span class=\"hljs-comment\">\/* style the details when it is open *\/<\/span>\n  }\n\n  <span class=\"hljs-selector-tag\">body<\/span><span class=\"hljs-selector-pseudo\">:has(<\/span>&amp;<span class=\"hljs-selector-attr\">&#91;open]<\/span>) {\n     <span class=\"hljs-comment\">\/* style the body when the details is open *\/<\/span>\n\n     .something-else {\n       <span class=\"hljs-comment\">\/* style something else when body has an open details element *\/<\/span>\n     }\n  }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>That feels like weirdly a lot of power \ud83d\ude05. <\/p>\n\n\n\n<div class=\"wp-block-cp-codepen-gutenberg-embed-block cp_embed_wrapper\"><iframe id=\"cp_embed_019c2ac7-e99e-755c-b2b0-250fb9d00bf5\" src=\"\/\/codepen.io\/editor\/anon\/embed\/019c2ac7-e99e-755c-b2b0-250fb9d00bf5?height=450&amp;theme-id=1&amp;slug-hash=019c2ac7-e99e-755c-b2b0-250fb9d00bf5&amp;default-tab=result\" height=\"450\" scrolling=\"no\" frameborder=\"0\" allowfullscreen allowpaymentrequest name=\"CodePen Embed 019c2ac7-e99e-755c-b2b0-250fb9d00bf5\" title=\"CodePen Embed 019c2ac7-e99e-755c-b2b0-250fb9d00bf5\" class=\"cp_embed_iframe\" style=\"width:100%;overflow:hidden\">CodePen Embed Fallback<\/iframe><\/div>\n\n\n\n<p>That had me thinking we could basically reveal another entire background (almost like a <code>::backdrop<\/code>) that covers everything but the details (just to call a ton of attention to it, again like a modal). <\/p>\n\n\n\n<div class=\"wp-block-cp-codepen-gutenberg-embed-block cp_embed_wrapper\"><iframe id=\"cp_embed_019c1504-e731-71ad-8b57-ce3ab676a458\" src=\"\/\/codepen.io\/editor\/anon\/embed\/019c1504-e731-71ad-8b57-ce3ab676a458?height=450&amp;theme-id=1&amp;slug-hash=019c1504-e731-71ad-8b57-ce3ab676a458&amp;default-tab=result\" height=\"450\" scrolling=\"no\" frameborder=\"0\" allowfullscreen allowpaymentrequest name=\"CodePen Embed 019c1504-e731-71ad-8b57-ce3ab676a458\" title=\"CodePen Embed 019c1504-e731-71ad-8b57-ce3ab676a458\" class=\"cp_embed_iframe\" style=\"width:100%;overflow:hidden\">CodePen Embed Fallback<\/iframe><\/div>\n\n\n\n<p>That&#8217;s probably about enough being weird for a Wednesday.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>You can style anything you want on the entire page when any given details element is open or closed.<\/p>\n","protected":false},"author":1,"featured_media":8489,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"sig_custom_text":"","sig_image_type":"featured-image","sig_custom_image":0,"sig_is_disabled":false,"inline_featured_image":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[1],"tags":[7,211],"class_list":["post-8485","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog-post","tag-css","tag-details"],"acf":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2026\/02\/spoiler-mode.png?fit=2480%2C1382&ssl=1","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/frontendmasters.com\/blog\/wp-json\/wp\/v2\/posts\/8485","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/frontendmasters.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/frontendmasters.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/frontendmasters.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/frontendmasters.com\/blog\/wp-json\/wp\/v2\/comments?post=8485"}],"version-history":[{"count":7,"href":"https:\/\/frontendmasters.com\/blog\/wp-json\/wp\/v2\/posts\/8485\/revisions"}],"predecessor-version":[{"id":8493,"href":"https:\/\/frontendmasters.com\/blog\/wp-json\/wp\/v2\/posts\/8485\/revisions\/8493"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/frontendmasters.com\/blog\/wp-json\/wp\/v2\/media\/8489"}],"wp:attachment":[{"href":"https:\/\/frontendmasters.com\/blog\/wp-json\/wp\/v2\/media?parent=8485"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/frontendmasters.com\/blog\/wp-json\/wp\/v2\/categories?post=8485"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/frontendmasters.com\/blog\/wp-json\/wp\/v2\/tags?post=8485"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}