CSS-Only Animated Accordion
Overview
This CodePen demonstrates how we can animate the opening and closing states of an accordion with fancy reveal animation using only CSS. This concept is suitable for creating FAQ sections, Table of Contents, and more.
How does it work?
We cannot transition height or any CSS property from zero to auto. If we
want to smoothly expand a collapsed accordion, we could set a
max-height and transition the height property
to a large value when we expand the section. However,
it may not properly work
if the content is larger than the max-height.
So, here we create a CSS grid with a grid item. Then we transition the
grid-template-rows property from 0fr to
1fr and the grid item transitions to its content height.
I used CSS clip-path and mix-blend-mode to
animate the background and text color of the accordion. Each accordion
has two pseudo-elements. We know that opacity,
clip-path and, visibility are animatable CSS
properties. So when the accordion is selected using the
:target pseudo-class, we transition the clip-path circle
radius to 200% of the
::before
pseudo-element. When the accordion is not selected, we do the same with
the
::after but this time with a delay. This creates an
illusion as it appears to clip from inside.
Since the accordion's title is an anchor element, users can also navigate through the items with their keyboard.
Inspiration
In a recent video, Kevin showed us a way to animate height from zero to auto value. Seeing that, I couldn't resist experimenting with the idea. Then I came up with this CSS-only accordion component and added the reveal animation too!
I would highly recommend watching his video, where he beautifully explains the technique and points out how he discovered it. Also, read Keith J. Grant's post and Nelson Menezes's post on the same topic.
Countdown to my birthday:
days
Hours
Minutes
Seconds