.post {
border: 1px solid #000;
}
.post .title {
font-weight: bold;
}
And you want to put it into a sidebar .sidebar {
background-color: #ccc;
}
.sidebar .title {
text-decoration: underline;
}
That post's title is now going to be underlined. That's one of the reasons
for namespacing. If the classes were `.post--title` and `.sidebar--title`, this
would be avoided .sidebar.title {
text-decoration: underline;
} <section class='content'>
<div class='post'>
<h1 class='title'></h1>
</div>
</section>
<section class='sidebar'>
<div class='post'>
<h1 class='title'></h1>
</div>
</section>
If so, what you say would indeed happen.Also, I've never thought of .post--title as a form of namespacing. I always understood it to be more like .post .title, as in nesting with SCSS or Less. Not saying you're wrong, just never thought of it that way.
<div class='sidebar'>
<div class='sidebar__post'>
<h2 class='sidebar__post__title'>
Please kill me
</h2>
</div>
</div>
So… you have to chose between unmaintainable CSS or weird HTML.I think that, in the end, something like this is the only sane outcome: https://medium.com/seek-ui-engineering/the-end-of-global-css...
using something like BEM solves a lot of problems. Silly collisions and searchability are my big takeaways.
.post .title { font-weight: bold; text-decoration: none; }
Leaving text-decoration out of the rule is basically saying: "I defer to my ancestor rules for advice on styling this, and I accept their decision."
There's rarely a real use for the ".sidebar .title" construction.
E.g. is your list supposed to have bullets? If you just say ul { list-style: none; } you've effectively said all lists shouldn't. But you might later say the opposite and not notice until your stylesheets are all compiled together and it's a race to see which one wins on every page.
Or the other example posted (above, since this comment was downvoted for unknown reasons) where you move HTML around and your stylesheets aren't in sync.
Of course, prefixing isn't for everyone -- e.g. https://github.com/twbs/bootstrap/issues/1235 -- some argue you should know all the styles on your page and how they interact, even if using a "CSS framework" and so naming collisions is just one of the things you'll have to worry about -- if you namespace, what's to prevent a naming collision even with your namespaces? :)
This is also where it might be useful to point to https://speakerdeck.com/vjeux/react-css-in-js