Using the CSS @import Rule

box of crayons

Even the most complex style sheet starts out with a single rule. But when you’re working on a particularly massive and complex website, over time your style sheet will inevitably start to reflect the site’s size and complexity. And even if you employ every trick for organizing your CSS in the book, you might find that the sheer size of the file is simply overwhelming. At that point, you might want to consider splitting your style sheet up into several smaller CSS files. That’s when the @import rule can come in quite handy.

The @import rule is another way of loading a CSS file. You can use it in two ways. The simplest is within the header of your document, like so:

1
2
3
<style>
	@import url('/css/styles.css');
</style>

But that isn’t necessarily the best method for keeping your XHTML small and your code clean. To that end, you can import a style sheet from within another stylesheet. And better still, you can import any number of styles this way. So your document’s head could look like this:

1
<link rel="stylesheet" type="text/css" href="/css/styles.css" />

Nice and clean. But then your “styles.css” document can contain calls to any number of additional style sheets:

1
2
3
4
5
6
@import url('/css/typography.css');
@import url('/css/layout.css');
@import url('/css/color.css');
 
/* All three CSS files above will be loaded from
   this single document. */

This lets you break up your gargantuan stylesheet into two or more logical portions — I chose typography, layout and color for this example, but you might prefer dividing your CSS according to the site sections they style (content versus sidebar, etc) or something similar. Either way, the benefit is immense — you can have the same number of CSS rules overall, but in smaller, easier to manage units.

You can even load both your screen and print (or handheld, etc) stylesheets all at the same time using this trick. If you’d like to specify a media, just write your rules like this:

1
2
3
4
@import url('/css/header.css') screen;
@import url('/css/content.css') screen;
@import url('/css/sidebar.css') screen;
@import url('/css/print.css') print;

Like most cool things in CSS, this one comes with a couple of caveats:

  • The @import rule isn’t recognized by the really old browsers out there… Netscape Navigator 4 skips over @imports entirely, and Internet Explorer 4 ignores them if you don’t use the (entirely optional, but generally used) parentheses. Of course, not too many people these days use either of these archaic browsers. And this problem can actually be useful if you’d like to hide some or all of your CSS from the browsers that can’t really support it.
  • Your @imports must come before all other content in your CSS. And I mean all of your content. Even putting comments before the @import tag will cause your imports to fail. So be sure to do your imports before you do anything else.
  • Internet Explorer (you knew it’d come up eventually) doesn’t deal well with specifying media types – it chokes. Basically, IE (versions 4-7) try to read the media type like it were part of the file name, causing the whole thing to come crashing down. As such, if you don’t want your CSS to have a default media type of “all,” you’re probably better off using a combination of the <link> tag and imports – specifying a media type in your link, and then importing the appropriate CSS within the file you’re linking to. I haven’t yet heard if IE8 suffers from this same problem (if you happen to know, please enlighten me in the comments!).

But even with those caveats in mind, this can be a really useful technique. No matter how big your website ends up getting, you’ll be able to keep your style sheets under control.

13 Comments

  1. On May 05, 2008
    4:19PM

    Jake Rutter said:

    Good Writeup! I love this way of organizing css, its a pity that the media tag isnt supported by IE.

  2. Sandeep Saroha said:

    Exliant Writeup!

    with this technic you can improve your website performance also.
    because you reducing the HTTP request with this technic.

  3. Chris said:

    loved it. explained perfectly.

  4. On April 06, 2009
    9:16AM

    Thomas Thomassen said:

    @Sandeep Saroha: How is this reducing the number of HTTP requests? If anything it makes more as it has to initiate a new request per imported stylesheet.

  5. On April 22, 2009
    6:30PM

    Kurt said:

    The “media” import commands appear to work fine in IE8.

  6. On July 15, 2009
    1:01PM

    Yash said:

    That’s make things clear to me. Thank you.

  7. On July 15, 2009
    1:02PM

    Bill said:

    great work Rob…

    Thanks

  8. On August 17, 2009
    10:53AM

    Vaughan said:

    Yes, agree with everyone, excellent article! :)

  9. h.iskender said:

    Css import İşlemlerine hakim olmayan kişiler için iyi bir yazı olmuş.

  10. Greg said:

    Thanks. I am a CSS newbie and just learned about import and used it on another website. So this helps as I wanted to split menu css from the content css.

  11. imparator01 said:

    @import is very useful but compablity with old browsers is a big problem i think

  12. On March 26, 2010
    8:09AM

    Genera said:

    Great article!

    @import gives very elegant way of customizing the look and feel of existing web projects.

  13. On April 06, 2010
    7:31AM

    Rob said:

    I’m fascinated, I’ve seen the same syntax repeated almost everywhere and it doesn’t work for me from inside a .css file or a .html file

    @import ‘navigation.css’; works no brackets no ‘url’ just quotes.

    @import (‘navigation.css’); // with brackets Fails
    @import url(‘navigation.css)’; // with url brackets Fails
    @import url ‘navigation.css’; // with url quotes Fails

    with or without a full http:// path in the bracketed quotes

    I did find the following described as part of an import hack

    quote
    Different versions of the import rule have varying levels of support from older browsers.

    @import “style.css”; /* hidden from nearly all v4 browsers */
    @import url(’style.css’); /* IE4 can understand, but not NN4 */
    unquote

    I get the same results from IE8 and FF3 the simple syntax – quotes – is the only one that works.

3 Responses Elsewhere

  1. Matt the web designer » links for 2008-12-20 said:

    [...] Using the CSS @import Rule (tags: css webdesign @import) [...]

  2. Lehetőségek a css kódunk formázására | code&Art said:

    [...] CSSNewbie – Using the CSS @import Rule [...]

  3. @import css file - Website Babble Webmaster Forums said:

    [...] url('/css/typography.css'); @import url('/css/layout.css'); @import url('/css/color.css'); Good writeup here. The stylesheet you want to edit is here [...]

Leave a Comment