views:

734

answers:

9

Is there any advantage to having a single monster .css file that contains style elements that will be used on almost every page?

I'm thinking that for ease of management, I'd like to pull out different types of CSS into a few files, and include every file in my main <link /> is that bad?

I'm thinking this is better

  1. positions.css
  2. buttons.css
  3. tables.css
  4. copy.css

vs.

  1. site.css

Have you seen any gotchas with doing it one way vs. the other?

+1  A: 

I prefer multiple CSS files. That way it is easier to swap "skins" in and out as you desire. The problem with one monolithic file is that it can get out of control and hard to manage. What if you want blue backgrounds but don't want the buttons to change? Just alter your backgrounds file. Etc.

Robusto
the problem is that this is quite selfish on a developers standpoint. Once you're done, you rarely have to go back in, but your visitors all have to wait for pages to load unnecessary css files. (Same goes for Javascript in my opinion)
rockinthesixstring
@rockin: In checking one of my 5-CSS-file sites after clearing my cache, I discovered that the total time it took to load all CSS was less than a 10th of a second. If people can't wait that long, I think they need more Ritalin or something. What is a much bigger problem is callbacks to ad sites like doubleclick, etc., which can result in HUGE delays, as witnessed on this very site within the past week.
Robusto
A great tool to use to test site speeds is Firebug in conjunction with YSlow. This should give you an accurate representation of your site's speeds.
rockinthesixstring
+14  A: 

This is a hard one to answer. Both options have their pros and cons in my opinion.

I personally don't love reading through a single HUGE CSS file, and maintaining it is very difficult. On the other hand, splitting it out causes extra http requests which could potentially slow things down.

My opinion would be one of two things.

1) If you know that your CSS will NEVER change once you've built it, I'd build multiple CSS files in the development stage (for readability), and then manually combine them before going live (to reduce http requests)

2) If you know that you're going to change your CSS once in a while, and need to keep it readable, I would build separate files and use code (providing you're using some sort of programming language) to combine them at runtime.

With either option I would highly recommend caching on the client side in order to further reduce http requests.

EDIT:
I found this blog that shows how to combine CSS at runtime using nothing but code. Worth taking a look at (though I haven't tested it myself yet)

rockinthesixstring
+1 for 1). From a performance perspective, a monolithic style sheet is best, but it's hard to maintain.
Pekka
Besides fewer HTTP requests, is there any advantage to the single monolithic file? My css may change over time, but the number of users will be quite small, most accessing via high speed connections. So I think that the advantage of multiple files will be far greater than fewer http requests...
Nate Bross
fewer HTTP requests IS the reason. retaining visitors is priority #1, so if your page loads slow, they are less likely to stay. If you have the ability to combine (I see you're using asp.net) then I would highly recommend doing it. It's the best of both worlds.
rockinthesixstring
"So I think that the advantage of multiple files will be far greater than fewer http requests..."No, no, no... exactly the opposite. With a high speed connection, the time taken handling HTTP requests is the bottleneck. Most browsers by default only download two files at a time, so the browsers would do 2 requests, wait, download the css files quickly, send 2 more requests, wait, download the files quickly. As opposed to one HTTP request for one css file it downloads quickly. The communication with the server would be the slow part.
Isley Aardvark
You can build and test features with separate style sheets and combine them into a one mongo one a build time. That way you're not maintaining one mongo file but many smaller files. We do this as well as compress out all of the whitespace and comments that make it easy on humans to read but are meaningless to your web pages.
No Refunds No Returns
+3  A: 

Having only one CSS file is better for the loading-time of your pages, as it means less HTTP requests.

Having several little CSS files means development is easier (at least, I think so : having one CSS file per module of your application makes things easier).

So, there are good reasons in both cases...


A solution that would allow you to get the best of both ideas would be :

  • To develop using several small CSS files
    • i.e. easier to develop
  • To have a build process for your application, that "combines" those files into one
    • That build process could also minify that big file, btw
    • It obviously means that your application must have some configuration stuff that allows it to swith from "multi-files mode" to "mono-file mode".
  • And to use, in production, only the big file
    • i.e. faster loading pages

There are also some software that do that combining of CSS files at run-time, and not at build-time ; but doing it at run-time means eating a bit more CPU (and obvisouly requires some caching mecanism, to not re-generate the big file too often)

Pascal MARTIN
+7  A: 

I prefer multiple CSS files during development. Management and debugging is much easier that way. However, I suggest that come deployment time you instead use a CSS minify tool like YUI Compressor which will merge your CSS files into one monolithic file.

Randy Simon
@Randy Simon - but what if we edit css directly on ftp always.
metal-gear-solid
I don't know your setup, but that doesn't seem like a good idea to me. You should be testing changes before pushing them out.
Randy Simon
A: 

The advantage to a single CSS file is transfer efficiency. Each HTTP request means a HTTP header response for each file requested, and that takes bandwidth.

I serve my CSS as a PHP file with the "text/css" mime type in the HTTP header. This way I can have multiple CSS files on the server side and use PHP includes to push them into a single file when requested by the user. Every modern browser receives the .php file with the CSS code and processes it as a .css file.

So if I'm using ASP.NET an .ASHX generic handler would be the ideal route to go, that combines them into a single file to get the best of both worlds?
Nate Bross
Yes, I would use an IHttpHandler to combine your CSS at runtime (see #2 in my answer above)
rockinthesixstring
@Nate: When I was working in ASP.Net we used template files to accomplish the same thing.
Robusto
@Robusto, could you explain what a template file is? I don't think I've ever heard of it. I have used App_Themes, but that still doesn't combine CSS.
rockinthesixstring
We used XSLT templates. Have you never used those? Look at http://www.w3schools.com/xsl/xsl_templates.asp.
Robusto
No I have never used those, I use strictly code based solutions. You had mentioned that you did it while working with ASP.NET, so I suppose I was trying to put the idea of "template files" into the context of "ASP.NET".
rockinthesixstring
A: 

You can just use one css file for performance and then comment out sections like this:

/******** Header ************/
//some css here

/******* End Header *********/


/******** Footer ************/
//some css here

/******* End Footer *********/

etc

Catfish
That doesn't make it easier to maintain, as I still need to scroll through miles of unrelated css to get to what I'm after...
Nate Bross
@Nate: Have you considered switching to a text editor with decent search functionality? My personal preference is a single css file and I never scroll through it. I just type "/classname" (I use a vi derivative) and *bam* - I'm at that class.
Dave Sherohman
It's also harder to maintain in a multiple-developer environment. What is a "header" in your above example? What if someone else is not thinking geographically, but in terms of basic design elements, like buttons or menus, while others are thinking differently? Where does a menu go if it's in a header? How about if it's not? I think it's easier to enforce that kind of discipline in separate files. Why don't application developers just create one huge application class with all the trimmings instead of a framework with class hierarchy? Seems similar to me.
Robusto
What if you don't remember the name of the class you are looking for? Or how do you decide where to add a new class?
Nate Bross
If it's just a couple page website it's really not that big of a deal. Just suggesting another way to do things.
Catfish
+1  A: 

You want both worlds.

You want multiple CSS files because your sanity is a terrible thing to waste.

At the same time, it's better to have a single, large file.

The solution is to have some mechanism that combines the multiple files in to a single file.

One example is something like

<link rel="stylesheet" type="text/css" href="allcss.php?files=positions.css,buttons.css,copy.css" />

Then, the allcss.css script handle concatenating the files and delivering them.

Ideally, the script would check the mod dates on all the files, create a new composite if any of them change, then returns that composite, and then checks against the If-Modified HTTP headers so as to not send redundant CSS.

This gives you the best of both worlds. Works great for JS as well.

Will Hartung
A: 

Monolithic stylesheets do offer a lot of benefits (which are described in the other answers), however depending on the overall size of the stylesheet document you could run into problems in IE. IE has a limitation with how many selectors it will read from a single file. The limit is 4096 selectors. If you're monolithic stylesheet will have more than this you will want to split it. This limitation only rears it's ugly head in IE.

This is for all versions of IE.

See Ross Bruniges Blog and MSDN AddRule page.

TheClair
A: 

I typically have a handful of CSS files:

  • a "global" css file for resets and global styles
  • "module" specific css files for pages that are logically grouped (maybe every page in a checkout wizard or something)
  • "page" specific css files for overrides on the page (or, put this in a block on the individual page)

I am not really too concerned with multiple page requests for CSS files. Most people have decent bandwidth and I'm sure there are other optimizations that would have a far greater impact than combining all styles into one monolitic CSS file. The trade-off is between speed and maintainability, and I always lean towards maintainability. The YUI comperssor sounds pretty cool though, I might have to check that out.

Nicholas Cloud