Defining A CSS Selector That Requires A Multi-Class Union

Posted May 4, 2007 at 2:36 PM

Tags: HTML / CSS

Glen Lipka, user interface expert, just taught me the coolest little CSS trick (well not really a trick - more like a CSS fact that I didn't know). I had recently learned that an element could inherit the CSS rules from two different classes:

 Launch code in new window » Download code as text file »

  • <div class="one two">
  • I get the CSS styles from both
  • div.one and div.two classes.
  • </div>

That in and of itself was very cool and useful. But, what Glen taught me takes that to the next level; apparently, you can define a CSS selector that only applies to a node that has multi-class CSS inheritance. In the following demo (which was really just a test for me to see this bad boy in action), I am creating three paragraphs. The first two get their own class. The third inherits properties of the previous two classes AS WELL AS properties that ONLY apply to it:

 Launch code in new window » Download code as text file »

  • <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  • <html>
  • <head>
  • <title>CSS Test</title>
  •  
  • <style type="text/css">
  •  
  • p {
  • padding: 5px 5px 5px 5px ;
  • }
  •  
  • p.one {
  • border: 1px solid black ;
  • }
  •  
  • p.two {
  • background-color: gold ;
  • }
  •  
  • /* ---- Here's where is gets crazy ---- */
  • p.one.two {
  • color: white ;
  • }
  •  
  • </style>
  • </head>
  • <body>
  •  
  • <p class="one">
  • Only One
  • </p>
  •  
  • <p class="two">
  • Only two
  • </p>
  •  
  • <p class="one two">
  • Both One And Two
  • </p>
  •  
  • </body>
  • </html>

Viewing the above in a browser gives you the following:


 
 
 

 
Multi-Class CSS Selector  
 
 
 

Notice that the third paragraph gets the border from p.one, the background color from p.two, and then gets its own font color from the CSS selector:

 Launch code in new window » Download code as text file »

  • p.one.two {}

How cool is that? I am sure a lot of people know this, but this is waaay cool. Man, I love CSS; it just makes the development process so much easier.

Download Code Snippet ZIP File

Post Comment  |  Ask Ben  |  Permalink  |  Other Searches  |  Print Page



Learning ColdFusion 9 - ColdFusion 9 tutorials, samples, examples, demos

Reader Comments

May 4, 2007 at 2:46 PM // reply »
40 Comments

Credit where credit is due. I just found out an hour ago.

Originally from Scott Sauyet.
http://scott.sauyet.com/


May 4, 2007 at 3:16 PM // reply »
56 Comments

Ben,

Have you taken your code and viewed it in IE 6.0 yet? I'll bet you'll be surprised that the "Only two" text color will be white.


May 4, 2007 at 3:28 PM // reply »
6,516 Comments

oooh crap! You are right. It's funny, cause I tested that in IE6 too :) I think I was just so excited that I didn't notice the font color change. It does this on IE5 on Mac as well (ha ha ha ha ha... IE 5 on mac).

Hmmm, that is lame. I don't have IE7 yet, so can't test that.

Thanks for pointing that out.


May 4, 2007 at 4:17 PM // reply »
56 Comments

http://meyerweb.com/eric/css/tests/multiclass.html

:)


May 4, 2007 at 4:30 PM // reply »
6,516 Comments

Awesome test setup. Stupid IE :)


May 5, 2007 at 5:11 PM // reply »
164 Comments

It's not that this doesn't work in IE6 at all, it's just very buggy, so I avoid it entirely. It works fine in IE7. As do more advanced CSS 2 selectors.


May 5, 2007 at 6:12 PM // reply »
6,516 Comments

Good to know it works nicely in IE7. I haven't taken the jump to upgrade yet (as some of us in the office need to have IE6 for testing purposes).


May 6, 2007 at 2:15 AM // reply »
164 Comments

FYI, in case you haven't already seen it, here's the "official" Microsoft solution for running IE6 and 7 side by side:

http://blogs.msdn.com/ie/archive/2007/04/17/ie7-virtual-pc-image-and-ie6-virtual-pc-image-refresh.aspx


May 8, 2007 at 4:48 AM // reply »
1 Comments

Try using this more simply for the technique to work in IE6. If you do like this:

p.red {color: red;}
p.yellow {color: yellow;}

<p class="red yellow">think this works in IE6</p>

I'd appreciate help with testing as I have installed IE7 now. IE5 for mac shouldn't be a concern anymore, it's daft!


May 8, 2007 at 12:30 PM // reply »
40 Comments

Unfortunately, This doesn't achive the goal. We want a CSS statement that acts as an AND operation. In other words, we want certain classes to be applied only if the element has BOTH classes.

so for your example <p class="red yellow">.
Imagine if you had:
p.red {color: red;}
p.yellow {color: yellow;}
p.red.yellow {color:orange} /* works in everything but IE6 */

Its the AND statement that would be so powerful.

Glen


May 8, 2007 at 2:59 PM // reply »
164 Comments

Obviously this wouldn't be the best solution in most cases, but if you really wanted you could use JavaScript to apply a third class to elements with the 2 classes in question. E.g., JavaScript turns class="one two" into class="one two one-two", and your CSS selector changes from ".one.two" to ".one-two" or even ".one.two, .one-two". That would work everywhere including IE6.


May 11, 2007 at 3:45 AM // reply »
2 Comments

Good point on JavaScript, no need to bloat your code with IE specific stuff. Personally I never needed to select both classes together tough.


May 11, 2007 at 8:38 AM // reply »
6,516 Comments

@Zoffix,

While I have never done that before (and didn't know that I could), it is one of those things where when I see it, I know that I could have used it somewhere :)


Apr 13, 2009 at 7:40 AM // reply »
1 Comments

Wow, that is a VERY NICE feature I didn't know of.
Too bad it doesn't work in IE6, but at least it makes my CSS for the other browsers a LOT MORE POWERFUL.

Thanks a lot,
Martien


Post Comment  |  Ask Ben

Recent Blog Comments
Nov 21, 2009 at 6:47 PM
Hal Helms - Real World Object Oriented Development, Sarasota - Day Five
@charlie griefer, Thank you.. ... read »
Nov 21, 2009 at 5:15 PM
Using ColdFusion Structures To Remove Duplicate List Values
@Jose Galdamez, Oh heh yeah I didn't paste the whole code. I should have defined the vars -- my bad. It's fixed thou. Thanks. ... read »
Nov 21, 2009 at 4:49 PM
Styling The ColdFusion 8 WriteToBrowser CFImage Output
Great work yet again Ben! Whilst I didn't use this whole code, I copied some of your regex code for a similar problem with the lack of an alt attribute and unescaped ampersands in CFIMAGE for Railo 3 ... read »
Nov 21, 2009 at 1:13 PM
My First ColdFusion Builder Extension - Encrypting And Decrypting CFM / CFC Files
@Ben, Because I am pedantic, I just want to make sure that everyone knows there is absolutely no encryption going on. There is only encoding and obfuscation. The cfencode tool only obfuscates your C ... read »
Nov 21, 2009 at 12:28 PM
Using ColdFusion Structures To Remove Duplicate List Values
@Jody I can't seem to get your code sample to work. If you are still having problems, try this code out and see if it gets you what you wanted. <!--- Comma delimited list with various duplicates ... read »
Nov 21, 2009 at 11:03 AM
Groovy Operator Overloading Does Not Work In The ColdFusion Context
Hi Ben, Thanks for this informative post. Now I am reading ur old posts too ... read »
Nov 21, 2009 at 10:56 AM
HostMySite.com Has The Best ColdFusion Hosting
@Mehul, Yes very nice people, however several downtimes per day which was not acceptable. Hence we had to move out. I am glad you are having good luck with them so far. ... read »