Responsive Column Layouts 123
Typically, to create a column layout, you would need to add the first or last classes to reset the margin space and clear the float. Today I'm going to share a very simple CSS trick to create a responsive column layout using nth-of-type pseudo class. I use this trick to code the WordPress themes at Themify. It doesn't require any first or last class and the number of columns can be adjusted base on the viewport. In other words, it can be toggled from 4-column to 3-column or 2-column, etc.
View Demo Responsive Column/Grid
The Inconvenience of Using The First & Last Classes
Normally we would add a .first or .last class to clear the margin space and float in the grid. Adding the first and last class is very tedious, not to mention that it gets more complicate if you need to make it responsive.
Using nth-of-type
The :nth-of-type(An+B) expression makes it very easy to clear the float and margin without having to add .first or .last class. For example:
.grid4 .col:nth-of-type(4n+1)= target every 4th .col element, starting from the first.grid3 .col:nth-of-type(3n+1)= target every 3rd .col element, starting from the first.grid2 .col:nth-of-type(2n+1)= select every 2th .col element, starting from the first
.grid4 .col:nth-of-type(4n+1),
.grid3 .col:nth-of-type(3n+1),
.grid2 .col:nth-of-type(2n+1) {
margin-left: 0;
clear: left;
}
Making it Responsive With Media Queries
To make it responsive and fluid, use percentage value instead of pixel value.
/* col */
.col {
background: #eee;
float: left;
margin-left: 3.2%;
margin-bottom: 30px;
}
/* grid4 col */
.grid4 .col {
width: 22.6%;
}
/* grid3 col */
.grid3 .col {
width: 31.2%;
}
/* grid2 col */
.grid2 .col {
width: 48.4%;
}
Changing From 4-column to 3-Column
To change the 4-column to 3-column on viewport width that is less than 740px:
- change the .grid4 .col width to 31.2% (one-third width)
- reset the left margin and clear property
- then re-apply the left margin and clear property using nth-of-type(3n+1) to form a 3-column grid
@media screen and (max-width: 740px) {
.grid4 .col {
width: 31.2%;
}
.grid4 .col:nth-of-type(4n+1) {
margin-left: 3.2%;
clear: none;
}
.grid4 .col:nth-of-type(3n+1) {
margin-left: 0;
clear: left;
}
}
Changing 4-column and 3-column to 2-column
To switch the 4-column and 3-column to 2-column on viewport width that is less than 600px: basically use the same trick as above to reset the .col width and float.
@media screen and (max-width: 600px) {
/* change grid4 to 2-column */
.grid4 .col {
width: 48.4%;
}
.grid4 .col:nth-of-type(3n+1) {
margin-left: 3.2%;
clear: none;
}
.grid4 .col:nth-of-type(2n+1) {
margin-left: 0;
clear: left;
}
/* change grid3 to 2-column */
.grid3 .col {
width: 48.4%;
}
.grid3 .col:nth-of-type(3n+1) {
margin-left: 3.2%;
clear: none;
}
.grid3 .col:nth-of-type(2n+1) {
margin-left: 0;
clear: left;
}
}
Making all columns Fullwidth (see demo)
To make all columns to full width on viewport width that is less than 400px: set width to 100% and reset the margin and float.
@media screen and (max-width: 400px) {
.col {
width: 100% !important;
margin-left: 0 !important;
clear: none !important;
}
}
Internet Explorer Issues
Both media queries and nth-of-type are not supported by Internet Explorer 8 or older. You can use selectivizr.js to provide nth-of-type support for IE and respond.js for media queries. Unfortunately, selectivizr.js and respond.js don't work well together (ie. nth-of-type doesn't work within the media queries). This means the only fall back with this responsive grid is that the columns can not be switched from 4-column to 3-column or 2-column.
thank you.i was searching this!!!
Really a helpful and interesting article. compliments come back to see you soon
Wow, if I didn’t know about this, then I guess I wasn’t a very good web designer. Does anyone know of anyone who offer website design services, so I can learn from their design? Thanks, that will help me improve my skills and make a living.
Hey,
Thanks for sharing such informative article this us.This is really helpful.
Regards,
Jenifer Taylor
Nice Article! Looking forward for it.
Hi,
Thanks for your very informative style of teaching. I really find this skill useful
Nice article it will help me a lot :)
asssssssssssasas
Phwoar. This appeals to my nerd sensibilities. Thanks for sharing. Shame as always about the problem of IE, but seems like an acceptable solution.
Nice post. I just loved the columns layouts :)
Hi,
Telling you that I have a quit problem regarding on columns layout and I found your release a complement on my knowledge this time.
Thank you
Many thanks for sharing this nice tips. I recently tried to apply in http://www.webdesignslive.com but got no luck, mainly not shared about responsive
thanks for the great tutor.
i try to put
border:1px solid #999
in this line
.col {
background: #eee;
float: left;
margin-left: 3.2%;
margin-bottom: 30px;
/* just comment – border:1px solid #999 */
}
but i see column is not balance, or error :D
can u fix this problem, thanks in advanced
i am so sorry with my bad question :(
http://facebook.com
Excellent column layout. :)
I am in love with it simply :)
great post, thans :)
Thanks for making it so simple !
I didn’t know how the format of the columns before and as the time I am going to search some info, I find it was easy now.
Interesting trick, thanks for sharing and to help ourselves to all to improving our knowledge.
Great article and thanks for sharing.