The CSS-Only Accordion Effect

Published April 9, 2008 by CSS Newbies.

Update: I’ve created an advanced version of this technique that works in IE6! Read more here.

The Accordion Effect is fast becoming one of the most commonly used (and perhaps abused?) effects of the Web 2.0 world. Most JavaScript frameworks make such an effect fairly easy to pull off – heck, MooTools even built their reputation on it in the early days. So what makes this accordion effect special? It doesn’t require a single line of JavaScript.

First off, what is an “accordion” effect? Generally speaking, the accordion effect takes several larger elements and then compresses them into a small space so that only a small portion (like a heading) of most or all of the elements is visible. Then, when the user interacts with that element — either by clicking on it or maybe only mousing over — the accordion expands so that the element of interest is visible, and the other elements shrink down automatically. When it’s in use, it looks a bit like an accordion expanding and contracting: hence the name.

Our accordion will work exactly the same way: all of the elements will be partially visible when the user loads the page. And then when they mouse over a particular section, it will instantly expand – and the other elements will contract – to make reading more easy.

example of accordion effect before and after the user mouses over it

So how do we accomplish this trick? First, we start with our XHTML, which just consists of a couple of divs with some IDs applied:

<div id="accordion">
	<div id="part1">
		<p>This text is in part 1.</p>
	</div>
	<div id="part2">
		<p>This text is in part 2.</p>
	</div>
	<div id="part3">
		<p>This text is in part 3.</p>
	</div>
	<div id="part4">
		<p>This text is in part 4.</p>
	</div>
</div>

My first div defines where my accordion starts and ends. The divs nested inside are just parts of my accordion – they don’t even technically need IDs unless I want to style them differently. That’s all the XHTML it takes!

So now, let’s start building our accordion. We start by defining the physical limitations of our space:

#accordion { 
	width: 500px; 
	margin: 100px auto; }

All I’ve done is give my accordion a specific width and centered it in the page for a nice visual effect. Now, I have to create the default state for the divs inside of my accordion:

#accordion div {
	float: left;
	width:25%;
	height: 300px;
	overflow: hidden;}

This snippet floats all of my divs to the left and gives them a specific width and height. I’ve chosen a width of 25% because I have four elements in my accordion, so they all split that width up evenly by default. If I’d had five elements, I would have used 20%, and so on. My height of 300 pixels also becomes the height of my accordion div.

The overflow: hidden part here is also crucially important. This is what prevents my divs from either resizing to fit their content or spilling their content out of the containing div and onto our page. It also creates a nice visual effect… people will wonder what content they’re missing, and will mouse over the area to investigate.

extra text is hidden from the user, inspiring curiosity.

So now that we’ve created our default state, we need to create our hover or “active” state. This requires two CSS rules. The first looks like this:

#accordion:hover div { width: 20px; }

We’re using the :hover pseudo-class here in a pretty creative way – we’re telling all of the divs inside of the div we’re hovering over to change. Specifically, we’re shrinking them all down to 20 pixels to make room for our expanded accordion section. So now we just need to make sure it expands:

#accordion:hover div:hover {
	width: 440px;
	overflow: auto; }

The :hover pseudo-class comes into play here again. Now, we’re applying styles to an element we’re hovering over, inside of an element we’re hovering over. We’re styling this element differently than our others by giving it a specific width – 440 pixels, i.e. 500 pixels minus the 20 pixels taken up by our other three divs – and setting its overflow to “auto.” These two classes cause our active div to expand, and then give it a scroll bar if the content is too long.

And that’s all there is to creating a CSS-only accordion box! If you’d like to see it in action, click here. The only change I’ve made to the full version is I’ve added a few background styles and some interior padding to each of the accordion sections to make them stand out and look a little more attractive.

This example creates a horizontal accordion box. But it’s just as easy to create a vertically oriented accordion. All we really need to do is eliminate the floats on our nested divs and turn most of our width tags into height tags. Here is the markup:

#accordion {
	width: 500px;
	height: 400px;
	margin: 20% auto; }
#accordion div {
	height:25%;
	overflow: hidden;}
#accordion:hover div {
	height: 20px; }
#accordion:hover div:hover {
	height: 340px;
	overflow: auto; }

And you can see it in action here.

As with any trick this cool, there are some caveats. Most significantly: this technique does not work in IE6, (update: now works in IE6! Read more here) because IE6 doesn’t support hover states on anything other than anchors. Therefore, you can make it work if you’re willing to make a sacrifice: if you wrap all of your divs in anchor tags, and then apply the hover state to those anchors instead of your divs, the technique should work the same (I haven’t tried it, though). However, that wouldn’t be particularly semantic or valid, so I’m not showing it here.

Also, if you apply any padding or borders to your #accordion div, that can cause some problems. The border and padding are part of your div, and therefore part of your :hover class. However, if you’re hovering over the containing div’s padding, you aren’t hovering over one of the sections of your accordion – meaning all of your interior divs will shrink down to their smallest size, and none will grow to fill the space. It took me half an hour of debugging to figure this one out. :)

So there you have it. Use it, share it, love it. And let me know in the comments if you come up with a particularly interesting or attractive implementation – mine is obviously pretty simple!

276 Responses

  1. nonton movie (reply)

    Thanks For All Of Your Effort On This Site. Ellie Really Likes Getting Into Research And It’s Simple To Grasp Why. I Hear All Concerning The Lively Way You Offer Precious Thoughts On Your Web Blog And Strongly Encourage Participation From Other Ones On That Situation Then Our Own Simple Princess Has Been Understanding A Lot Of Things. Take Advantage Of The Remaining Portion Of The Year. You Are Conducting A Useful Job.

  2. home page (reply)

    The Accordion Effect is fast becoming one of the most commonly used (and perhaps abused?) effects of the Web 2.0 world. Most JavaScript frameworks make such an effect fairly easy to pull off – heck, MooTools even built their reputation on it in the early days. So what makes this accordion effect special? It doesn’t require a single

  3. Jasa Pembuatan Website (reply)

    we will explain some important terms as a basis for your education if not known. The web site (English: website) is an interconnected web pages which are generally located on the same servant contains a collection of information provided by individuals, groups, or organizations.

  4. Tự Truyện (reply)

    Trang đọc truyện chữ, truyện tự sáng tác, truyện dịch online hay nhất Việt Nam. Than gia sáng tác, dịch và convert truyện với các tác giả nổi tiếng và tâm huyết

  5. Thiết kế website giới thiệu (reply)

    Dạng quảng bá cơ bản này sẽ được hiển thị ở cột bên phải của trang News feed, bao gồm tối đa 25 ký tự tiêu đề, 90 kí tự mô tả ngắn và một hình ảnh cuốn hút có kích thước 100×72 pixel.

    Đích đến của quảng bá chính là các trang fanpage, website site site của bạn hoặc một địa chỉ bất kì nào bạn muốn. Khi tạo những quảng bá này, bạn cần đặt ra mục tiêu là những lượt click của khách hàng chỉ qua 1 hình ảnh trình bày nhỏ và vài dòng giới thiệu ngắn gọn. Hãy đặt thử nghiệm với content, hình ảnh khác nhau để đi đến một quyết định cuối cùng thực sự tác động đến thị hiếu khách hàng.

  6. Masha driving Spiderman's car nearly hit Joker (reply)

    Just desire to say your article is as amazing.
    The clarity in your publish is just nice and that i could
    think you are a professional in this subject.
    Fine together with your permission allow me to clutch your RSS feed to keep updated with forthcoming post.
    Thanks one million and please keep up the gratifying work.

  7. Pingback: 精选30个优秀的CSS技术和实例 - 福建百科网,福建百科教育,泉州平面设计培训,泉州室内设计培训,泉州平面设计培训学校,电脑培训学校,,办公文秘商务文秘培训,网店创业培训,平面媒体设计培训,泉

  8. pemadam (reply)

    dl Untuk Beli baru pemadam maupun isi ulang kami memberikan garansi selama 2 tahun ( atau mengikuti peraturan dari PMK) apabila terjadi pengurangan tekanan di dalam tabung yang diliat dari indikator meteran tekanan tabung. Melayani penjualan partai dan eceran serta melayani Jual pemadam api untuk proyek yang sedang berjalan.

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>