I know that this has been answered last year but I wanted to point out a method that doesn't seem to be used although the functionality has been written into the CSS2.1 specification. (See CSS Conditional Rules Module Level 3 for more specific details).
--
The IE method was to do something like the following;
<!--[if IE]>
<link rel="stylesheet" href="styles/ie.css" type="text/css" media="screen" />
<![endif]-->
As described in the Conditional comments section of the wiki.
--
Another method mentioned on here is to use Conditional-CSS which seems popular but I've never heard of it and couldn't give an example of how to use it so a link will have to do! (Sry ppl).
--
THE NEW METHOD SINCE DEC 2012:
By using Conditional Group Rules you can define conditions like;
@media print { #navigation { display: none; } }
(Example taken from the specification) This will hide the navigation bar when printed.
Another Conditional Group Rule you can define is @SUPPORTS, for example;
@supports (box-shadow: 2px 2px 2px red)
{
box-shadow: 2px 2px 2px red;
}
and include "and", "or" and "not" operators like;
@supports ((box-shadow: 2px 2px 2px red) and (border-radius: 25px))
{
box-shadow: 2px 2px 2px red;
border-radius: 25px;
}
This means rather than testing the clients browser, you test the features available to css and style accordingly. Unfortunately, you're unable to nest other at-rules (like @import which could be used to import a browser specific style sheet based on the availability of a css feature).
Try it out!