CSS: Taking control of the cascade
37signals.com
37signals.com
These rules can get very confusing when someone tries to edit your HTML by adding classes to a new element they created, only to figure out that those classes don't add any styles in that particular context. Good stylesheets should have classes that have consistent behavior no matter where they are on the page.
That said, I think SCSS (and sass/less) is pretty nifty. The real heavy lifting they do, for me at least, comes from mixins and being able to programmatically create classes.
For an example, look at how the rainbow effect is created on this page: http://html5readiness.com (it's with a for loop in sass, technique is outlined in http://nimbupani.com/notes-from-html5-readiness-hacking.html)
We've found it to be just the opposite. Because nested selectors don't repeat the names of parent elements it's a piece of cake to grab a block and move it up or down in the tree or just plain move it somewhere else. We find that we refactor more because it's so much easier to hold the style model in your head and so clear where to move a block of styles in order to increase or decrease their scope. That just makes for better CSS.
I will agree that heavily-cascaded stylesheets are practically impossible to read. Writing styles in a way that reduces your need to create long inheritance chains feels like a more flexible option (not so tightly dom-coupled) that doesn't require a "style model", though.
How do you handle adding the same styles to page elements that aren't siblings/exist in vastly different areas of the dom structure?
Mixins could probably do it, but writing too many of those would open up new problems.
That's usually a case for refactoring. Either by pulling styles common to both elements out and up the tree so they apply more widely or creating a class that can modify both. In the latter case we'll usually use a technique like the last example in the article (more of an OOCSS approach) that works independent of the dom structure.
I could see whatever you pulled out being clobbered by the huge amount of specificity you have built up by mirroring the dom. Heavy use of the child selector would probably prevent that from happening as much, though.
> figure out that those classes don't add any styles
> in that particular context
That's one way to learn that you don't add classes for styling. Just style the markup you have.I think OOCSS is an approach to help here, but once you have such a mess it is pretty hard to refactor.
[CSS: Don’t take control of the Cascade, make love to it.](http://kuroir.com/post/10148994785/css-dont-take-control-of-...)
Hope you find it interesting.
The to-do list example they use is a good one. You'll occasionally see jQuery used like this, to instantiate blobs of page in known configurations.
I don't know enough about, say, SproutCore or JS GUI libraries like it to know if any of them use this approach, but it seems like an obvious thing for them to do.
Or I may be overrating the approach. Still, sounds useful.
Here is a quick cut-and-paste from a LESS stylesheet:
https://gist.github.com/1212027
There are a lot of random items and I find it easier not to cascade styles as much as some recommend. I try to consolidate styles into generic classes or mixins as I find opportunities to re-use them. I try not to use the child selector unnecessarily (the article uses it a totally unnecessary amount) because I often need to add unsemantic wrapper elements to achieve the right effect.
The examples in your gist would not benefit from additional use of child selectors, but I'll bet they'd appreciate it if the parent elements did :)
I think this article is a step in a good direction whether or not you agree with it - main reason being that front-end development NEEDS more discussion. It's heavily undefined, and unrefined right now.
A video of the presentation is the first response to the top comment.