James Cox
Posted on May 14, 2021
#TIL
Today I learned about HTML's native accordion-like functionality, encapsulated by the details element.
I'm sorry, James. Did you just say HTML has a built-in accordion???
I know! I couldn't believe it either. MIND BLOWN.
The HTML Details Element
<details>
creates a disclosure widget in which information is visible only when the widget is toggled into an "open" state. A summary or label must be provided using the element.
Let's slow our roll ...
While very cool, it is far from a perfect solution, in my opinion. Support for animation is limited, and requires a decent amount of JavaScript and CSS to work correctly.
There are certainly better options in terms of design and functionality, especially if you are using a design library like Bootstrap, Material UI or something similiar.
With that said, let's see it in action!
The Accordion
The Code
import "./styles.css";
export default function App() {
return (
<div className="App">
<h1>HTML Details Element</h1>
<div className="details-wrapper">
<details>
<summary>
<h2>This is an accordian</h2>
</summary>
<div>
<p>... made only with HTML and a sprinkle of CSS</p>
<ul>
<li>First wrap your accordion in a details tag</li>
<li>
Then create a summary section with some sort of h1 or p content
</li>
<li>
Then separately inside the details element create another
element, like a div
</li>
<li>
And if you want to style the accordion, you can create a cool
effect
</li>
<li>Animation is possible, but it will require javascript</li>
</ul>
</div>
</details>
</div>
</div>
);
}
Breaking It Down
Start with a <details>
tag.
<details>
</details>
Add a <summary>
tag. Whatever you put in the summary tag is what will the user will see when the accordion is closed. You MUST have a <summary>
tag for the details element, especially for accessibility purposes.
<details>
<summary>
// anything can go in here, but I chose an <h2>
<h2>This is an accordian</h2>
</summary>
</details>
Whatever you put inside the <details>
element and outside the <summary>
element is what will be in the expanded portion of the accordion.
It is definitely helpful to wrap your expanded-content in some sort of HTML element if you want to style your accordion.
<details>
<summary>
<h2>This is an accordian</h2>
</summary>
// I went with a <div> to reference in my CSS file
<div>
...content will go here when the accordion is open
</div>
</details>
And that's pretty much it! Of course styling is important, so let's peep that CSS:
/* only referencing the styles that pertain to the <details> element itself */
*,
*:before,
*:after {
box-sizing: border-box;
-webkit-tap-highlight-color: transparent;
}
summary {
cursor: pointer;
}
summary > * {
display: inline;
}
details > summary {
text-align: left;
width: 18rem;
background-color: rgb(88, 33, 241);
cursor: pointer;
padding: 0.5rem 1rem;
border-radius: 0.5rem;
}
details > summary > * {
display: inline;
}
details > div {
text-align: left;
width: 18rem;
border: 4px solid rgb(88, 33, 241);
margin-top: 0;
padding: 1rem;
border-bottom-left-radius: 0.5rem;
border-bottom-right-radius: 0.5rem;
}
details[open] summary {
border-bottom-left-radius: 0px;
border-bottom-right-radius: 0px;
}
summary[open] {
border-bottom-left-radius: 4px;
border-bottom-right-radius: 4px;
}
Not too bad, huh? If you're interested in seeing the full CSS code, it can be found here.
Conclusion
If you need a quick accordion and do not want to fiddle with a ton of JavaScript and CSS, HTML provides you a handy <details>
element.
Thank you for reading and I look forward to hearing any thoughts, questions or feedback you may have!
Posted on May 14, 2021
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.