Creating & Using CSS Sprites

The idea of CSS sprites is pretty genius. For those of you who don't know the idea of a sprite, a sprite is basically multiple graphics compiled into one image. The advantages of using sprites are:

  1. Fewer images for the browser to download, which means fewer requests to the server.
  2. Total images size is generally smaller, so less download time for the user and less bandwidth consumption.
  3. No ugly mouseover code. No JavaScript -- only CSS!

For this example, I've used the DW illustration. I have a color version and a grayscale version which I have merged into one file as you can see below.

DW!

Now, it's time to see how the system works.

The HTML

	<a href="http://domain.com" id="logo-link"> </a>

Just a very simple anchor tag with a unique ID.

The CSS

#logo-link
{
	width:191px;
	height:151px;
	text-decoration:none;
	display:block;
	background-image:url(dw-logo-sprite.jpg);
	background-position:191px 0;
}
#logo-link:hover,#logo-link:active	{ background-position:0 0; }

When the image initially loads, I want the grayscale version, which is on the right site. For this reason, I set the link's initial background position 191 pixels to the left. When someone mouseovers the link, however, I want to show the color version. It's only then that I remove the 191 pixels.

Wanna see the working version?


Comments

  1. Mark

    I have known about this for a long time but I never knew it was called sprites. :)

  2. Bobby Hargett

    Another interesting side effect is that you can’t copy the image (in IE at least) and this gives you some image protection (for newbies that is).

    • Michael

      Yes you can copy the images in all browser. Does anyone now how to block that feature. I have seen it on several site but still cannot figure out how they do it. Thanks

  3. Jesus DeLaTorre

    Hey David, I’m curious as to what this does? href=”javascript:;”

  4. NYC guy

    It’s cool. Any tools can create the sprite images other than the expensive PS?

  5. david

    @Jesus: “javascript:;” tells the link to do nothing when clicked. I think another method is going “void(0);”.

    @NYC Guy: I recommend GIMP. Free, but not as powerful as Photoshop.

  6. design

    Good points, but make it more generally

  7. Rob Simpkins

    NYC Guy, I have found inkscape to be a useful tool instead of photoshop, and it is free to download online too :)

    http://www.inkscape.org.

  8. Lindsey

    I actually wrote a similar article last week explaining how to create the image, and the HTML/CSS for this for navigation images. Also, I explained how to have the text input there so it’s not jsut a blank tag so in case CSS is disabled (or background images – like if you are on a blackberry) a link will appear in it’s place.

    I really dig your font – is Cambria cross-browser/cross platform compatible?

  9. david

    @Lindsey: Awesome article — I hadn’t seen that. The text-indent is genius. Great addition!

    As far as Cambria, every browser I’ve checked my site in has it. I’m not a Mac guy, but I’m pretty sure it works there too.

  10. Ryan

    I don’t know what browser support is like for this (I’ve checked it in IE7 and Firefox5), but by the W3 recommendation for CSS 1 this should work:

    a.rollovers{
    background-position: 100% 0;
    }

    a.rollovers:hover, a.rollovers:focus, a.rollovers:active{
    background-position: 0 0;
    }

    I’m a fanatic about improving programming style. Mostly because I’m lazy. If this helps, consider it my way of saying thanks for a post that resolved my debate between keeping style in the stylesheet or avoiding ugly background flash.

  11. Ryan

    …ahem. Firefox 2, I mean. God knows where the 5 came from.

  12. Paul

    How about adding some mootools magic to the effect?

    Similar to what they did with JQuery here
    http://alistapart.com/articles/sprites2

  13. david

    @Paul: Thanks for the suggestion!

  14. Deyn Deny

    hi david, thx for this tut.. i use this for my navigation.

  15. Sven

    Thanks for sharing this.

    I am not good with css so I am hoping for some help with this “problem”:

    When I use the same css as you do and wants to line up some images (“share icons” and Smilies” with no hover) I get theme below each other and not in a line.

    I have tried to add the classic “nobr” tag and the css “white-space: nowrap;” – but still it breaks.

    Also: when I use this for share this icons and “smilies”, should I add the “background image” for each of the icons or is there a better way?

    I am sure this is a small problem for you css experts, but please give med some feedback on this.

    Thanks :)


    a.shock {
    background-image: url('css-spirite.gif');
    background-repeat: no-repeat;
    background-position: -40px -223px;
    width: 15px;
    height: 15px;
    display: block;
    overflow: hidden;
    }
    a.wink {
    background-image: url('css-spirite.gif');
    background-repeat: no-repeat;
    background-position: -116px -223px;
    width: 15px;
    height: 15px;
    display: block;
    overflow: hidden;
    }

    • Hiren Khambhayta

      It should work, dont know what happened to it. I have used it in my website and is working well. Its much helpfull. Before it was taking 7 sec to load but now it loads in just 3 seconds

    • Hiren Khambhayta

      It should work, dont know what happened to it. I have used it in my website (www.swastiksolutions.in) and is working well. Its much helpfull. Before it was taking 7 sec to load but now it loads in just 3 seconds

  16. easwee

    If I get your problem right you want to display links with icons all in one line? If so you defined display:block on the a – this means it is now a block element – not inline anymore. Block elements get a 100% width and always fall one under another.

    To solve this add float:left; to your links and all of your a tags will float to the left part of the containing div. Also don’t forget to clear them afterwards or set overflow:hidden on the container element so elements below won’t fall under links.

    Also avoid adding html elements just to solve design issues.

  17. Sven

    @easwee: Thanks for your reply.

    Well, I am learning more and more about CSS, like “inline” and “block”. Problem solved, thanks again :)

  18. sunnybear

    There is a free tool to create CSS Sprites automatically – http://sprites.in/ .
    If you are interested in website speedup you can also try Web Optimizer application (also as a WordPress or Joomla plugin) here – http://www.web-optimizer.us/

  19. wparena

    nice and have written article about your post on my blog

  20. David

    This is great i am going to name my first born son after you. :) Thanks for the info this helped a lot and it was easy to understand.

  21. Simon

    This is another one of those things you Google and get endless useless demos that are over complicated and dont work in IE.

    You example is straight to the point and works cross browser.

    Thanks for that

  22. vinay

    awesome stuff…..

  23. sogarab

    Good points
    Thank you so much

  24. Puneet

    I was searching for a tutorial for css sprites, and I got to look into so complicated codes. Yours were the simplest and easiest to understand

  25. Kaltech

    This is the very easiest method for creating and using sprites that I have ever seen. We will use this to our clients from now onwards. Thanks for the article.

  26. Site Internet Aubenas

    Thank you very much for this nice tutorial. Page Speed likes CSS sprite !

  27. Bruce Juice

    GREAT… straight to the point, no blubber. thanks, I am now about to use this on my site :)

  28. Onitsuka Tiger

    i want to know, how can i insert this code into my blog. i want to use the css sprite within my content wrapper. but i don’t know how.

  29. KB

    Another cool implementation of CSS sprite: Dynamic CSS Sprite implementation to give a painting effect. Read how to implement it by reading an easy to follow tutorial at http://blog.kunals.com/dynamic-css-sprite-implementation-gives-a-painting-effect/

  30. Polat Olu

    Hi,

    Nice Article! Thanks for sharing.

    There is a tool called Sprite Master Web to generate sprite sheets automatically. It generates sprite sheet and CSS code automatically with generating smallest sprite sheets using advanced algorithms.

    You can take a look at it from http://www.mobinodo.com/spritemasterweb

    Also, you may watch the quick video here: http://www.youtube.com/watch?v=458Qx7JW5PI


Be Heard!

Share your thoughts without being a jerk! And wrap your code in <code> tags, f00!

Name*:
Email*:
Website: