written on:2 Feb, 2008 by Alen Grakalic
Pure Css Data Chart
Delicious | Digg | Stumble | Reddit | Float | Subscribe to RSS Feed
![]()
Data visualization is mostly achieved with flash applications or with help of some programming languages. Are those solutions the only way to present, let's say simple data chart? How about giving it a try with nothing but good ol' css?
Take a look at the Demo | Download Css Chart
Approach
In this example I am not using JavaScript or any backend application. All I rely on is well formed markup and css.
So, the goal is to present data chart. We could say that a chart is a two dimensional object. So, the best structural and
semantical choice is definition list. Why? Well, for starter, it is a list of items. Although the list is linear, we
could interpret definition titles (dt elements) as items on x axis and definition descriptions (dd elements) as values on y axis.
If that doesn't make sense because of my poor explanation skills :) what I'll do here is turn this:

into this

with css alone.
The markup
In my example I have used a period of last 12 days and presented my working energy level in percentages,
100% being the best I've felt about working ever. As you can see, on 6th day it went up a bit because I
received a solid paycheck and that boosted me up :)
Anyway, to structure this kind of data I chose definition list. Definition title contains the day title
<dt>Day 1</dt>
And definition description contains the value
<dd>36</dd>
Inside the definition description element I will add a span and nested em element. Not for structural purposes,
but to give myself enough elements to work with. I will also assign classes that I can use later on.
So definition description looks like this now:
<dd><span class="type2 p80"><em>80</em></span></dd>
Styling it
Definition list contains acts as a chart container, so I'll assign background image to it and set the width and height to match the dimension of the chart. Also, I'll remove default margins and paddings
dl#csschart, dl#csschart dt, dl#csschart dd{
margin:0;
padding:0;
}
dl#csschart{
background:url(bg_chart.gif) no-repeat 0 0;
width:467px;
height:385px;
}
Definition titles have no visual purpose here, so I'll hide them:
dl#csschart dt{
display:none;
}
Moving on to the real thing. Definition descriptions contain 2 child elements: span and em. That gives me 3 elements to work with.
I will put <dd> in the correct position by adding margins, setting their height so it matches 100% value and width that matches
a column of the background chart. The <dd> are floated left so they will line up.
Each <dd> has position relative so the child elements can relate to them.
dl#csschart dd{
position:relative;
float:left;
display:inline;
width:33px;
height:330px;
margin-top:22px;
}
dl#csschart dd.first{
margin-left:33px;
}
Span elements represent the column and em elements are those squares in the middle with values. Spans are positioned absolutely and placed at the bottom, so they could "grow" from bottom up based on their percentage.
dl#csschart span{
position:absolute;
display:block;
width:33px;
bottom:0;
left:0;
z-index:1;
color:#555;
text-decoration:none;
}
dl#csschart span em{
display:block;
font-style:normal;
float:left;
line-height:200%;
background:#fff;
color:#555;
border:1px solid #b1b1b1;
position:absolute;
top:50%;
left:3px;
text-align:center;
width:23px;
}
Here's the scheme of one chart bar

So, how do we set exact height?
We do that by setting the height in percentages for span element. You've noticed in the markup section
above that span has two css classes. First one defines it's type (type1 - type4). In my case types
are used to represent different color. The second class (p0 - p100) is the one that actually defines
span's height.
dl#csschart span.p0{height:0%;}
dl#csschart span.p1{height:1%;}
dl#csschart span.p2{height:2%;}
.
.
.
dl#csschart span.p100{height:100%;}
So besides putting the value as a text, we have to provide a css class that matches
<dd><span class="type2 p80"><em>80</em></span></dd>
That will do the trick.
Of course, the markup could be generated programatically or by hand, whatever works best for you.
About the author:
Designer, developer and a passionate standardista with large experience in all types of front-end work. Started to get involved with web in 1999. and turned freelance in 2005., the same year he started Css Globe. Alen's work has been featured on numerous css galleries including famous Css Zen Garden official list. Available for contract work.
Enjoyed the article?
Subscribe to our RSS feed or share it with your friends.
Delicious | Digg | Stumble | Reddit | Float | Subscribe to RSS Feed
Comments
Subscribe
Join 3800+ subscribers and receive our content instantly.
Follow us on Twitter
Want to be the first to know when a new article is published?
Sponsors

PSD to HTML: You Design - We XHTML

FlashDen - The Best Flash Files

Sitegrinder 2 Photoshop Plugin

Look Professional with FreshBooks
Recent Articles
- Easiest Tooltip and Image Preview Using jQuery
- 4 Uber Cool Css Techniques For Links
- CSS do's and dont's Part 1: CSS Selecting
- Easy Scroll: Accessible Content Scroller
- Pure CSS Animated Progress Bar





Shani elharrar on 3 Feb, 2008 wrote:
Thanks for sharing.
Dennison Uy - Graphic Design on 3 Feb, 2008 wrote:
cssglobe on 3 Feb, 2008 wrote:
The purpose of this article wasn't to replace google's api. It is here to demonstrate another way of creative css usage. I wrote it step by step so folks can see where I am going at, understand the technique and use it later for charts or something similar. Hopefully I made it clear, sometimes I fail, but what I want to do is share some of the ideas I have and help people learn css. Is API here to educate or even help in understanding how things work? I don't think so.
cssglobe on 3 Feb, 2008 wrote:
Karim on 3 Feb, 2008 wrote:
Second, wouldn't it be more interesting if you style the "dd" element directly? without adding a "span"? Something like: [dd class="type2 p80"][em]8[/em][/dd] ?
cssglobe on 3 Feb, 2008 wrote:
As for dd, I use dd or one reason, it acts as a 100% container. That way I can be really precise. If you put percentages on dd, height would relate to dl element. As you can see dl element is wider and taller than 100% bar should be.
Sangesh on 4 Feb, 2008 wrote:
I just love this article. Thanks for sharing.
An Jay on 4 Feb, 2008 wrote:
Trainingstagebuch on 4 Feb, 2008 wrote:
Greetings
Nils
hellbringer on 4 Feb, 2008 wrote:
cssglobe on 4 Feb, 2008 wrote:
David on 4 Feb, 2008 wrote:
Personally I'd use the inline height definitions. Inline styling is generally deprecated, but in this case the height relates directly the meaning of the element, so to me it makes sense to define it inline.
pepa on 6 Feb, 2008 wrote:
When inline styling is deprecated, then use height attribute of image.
Matthew on 8 Feb, 2008 wrote:
http://www.mausonio.com/?p=50
Thanks again for the inspiring article.
Demetrios Kyriakis on 9 Feb, 2008 wrote:
The background containing the axis is totally hardcoded, so basicaly:
- it can render on the y axis only percentages, and this only till 100%
- it can render on y only values till 12 and with the hardcoded label "days".
So this is more "image" based than "pure CSS" :(.
The look is however very nice: would you please make upgrade that is a little more general? i.e. not hardcoded axis?
Thank you,
Demetrios.
Dennison Uy - Graphic Design on 9 Feb, 2008 wrote:
cssglobe on 10 Feb, 2008 wrote:
cssglobe on 10 Feb, 2008 wrote:
Background chart image is a part of the visualization process, just like the background images for bars are.
cssglobe on 10 Feb, 2008 wrote:
If some readers fail to see the value of it, and hopefully learn something, I am very sorry.
You may use the weapons of choice for every thing you do but don't throw away new ideas :)
Gregorio Espadas on 4 Mar, 2008 wrote:
Skim on 9 Apr, 2008 wrote:
Thanks for sharing this one.