- From: Tab Atkins Jr. <jackalmage@gmail.com>
- Date: Thu, 9 Oct 2008 12:25:07 -0500
- To: "Brad Kemper" <brkemper.comcast@gmail.com>, "François REMY" <fremycompany_pub@yahoo.fr>
- Cc: "W3C Style List" <www-style@w3.org>
- Message-ID: <dd0fbad0810091025q710715d4w49984acb8413c453@mail.gmail.com>
On Thu, Oct 9, 2008 at 12:04 PM, François REMY <fremycompany_pub@yahoo.fr>wrote: > Another possibility I think great for both your queries is : > > #top-courses, #additionnal-courses { > > @rule ul { > display: inline-block; > }; > > @rule h3 { > color: darkblue; > }; > > border: none; > } > I'd have to look, but I think that would mess with the parsing rules as currently written. I'd rather have an equivalent syntax that meshes more naturally with existing content, like what you have below: > An equivalent, with your proposals will be : > > @scoped ( :any(#top-courses, #additionnal-courses) ) { > > :root { > border: none; > } > > ul { > display: inline-block; > } > > h3 { > color: darblue; > } > } > Looks like I didn't mention it, but my intention is for @scoped to accept arbitrary selectors, not just simple selectors. So (assuming :any() was implemented) there would be nothing wrong with the above. After all, being able to avoid typing a single simple selector is a fairly minor benefit (though I have a use-case in my current work that this would aid me with quite a bit, as I explained in the original email), but sometimes one runs into a situation where a fairly complex selector would be repeated over and over again. On Thu, Oct 9, 2008 at 12:10 PM, Brad Kemper <brkemper.comcast@gmail.com>wrote: > > On Oct 9, 2008, at 8:53 AM, Tab Atkins Jr. wrote: > > I want to talk about two issues of syntactic sugar that I believe would be >> very useful to us authors. Neither actually change anything in the way CSS >> works or produce new burden on implementors - both are merely sugary >> conventions that would allow us authors to shorten some thing we currently >> write out manually. I know I've seen both of these suggested before in >> various syntaxes; I just want to bring them together in what I think is an >> appropriate syntax for each, so as to provoke new discussion in a thread >> specially dedicated to them. >> >> (1) Scoped selectors within a stylesheet. >> >> Good, semantic authoring often entails a relative paucity of named hooks >> into the document (in the form of ids and classes), with most of the actual >> CSS targetting being done through relatively complex selectors descending >> from some named hook. Frex, a navigation menu may *only* id its enclosing >> div, and target all of its styling purely by structurally descending from >> that #id. The issue with this is that you have large swathes of selectors >> that share a common prefix, which must be repeated on every single rule. >> This can be simplified by creating a block in which every rule is assumed >> to be scoped to an area. My first thought is an @ rule, something like the >> following: >> >> @scoped( #nav-menu ) { >> h1 { >> //This is equivalent to the selector "#nav-menu h1", >> //and so won't target <h1>s across the rest of the page. >> ... >> } >> ul { >> ... >> } >> more rules... >> } //end of scope >> >> I would find benefit from this immediately, as all of the sites I operate >> on utilize the same basic mechanisms. They consist of a template which is >> styled by a dedicated sheet, and then has content piped in from a database >> which also pulls in the page-specific styling. The page-specific styling >> should *never* affect the outside template, and current I accomplish that by >> iding the content container and just prefixing *every* rule in *every* page >> with that id. I've purposely made the id extremely short (it's just "bc" >> for "body content") so it's not overly burdensome to type, but that's still >> a lot of meaningless typing that could easily be taken out with the addition >> of a single scoping line. >> >> Even past the convenience factor, there's a safety factor. I hand-craft >> the styles across my company's site, because nobody else in the company >> really has appropriate skill to do so, but even I sometimes forget to use >> the #bc prefix on a rule. The damage is usually immediatley obvious, as I >> suddenly give every header some enormous background or something, but it's >> also unnecessary. Forcing other people who are relative newbs at styling to >> remember to arbitrarily prefix all their rules with #bc as well is just >> frustration waiting to happen. I could, of course, build a CSS parser that >> alters the rules myself, but why reinvent the wheel every time when it can >> be simply fixed in the language itself? >> >> Ignoring any possible optimizations, this is a simple matter of the parser >> doing a simple textual concatenation before handing the selectors to the >> matcher. This construct should also be nestable, for obvious reasons. >> >> >> (2) Multi-matching selector >> >> This was suggested just recently and also came up in the jQuery thread a >> few moments ago, and I would also benefit greatly from this. The idea is >> that, rather commonly, you have to apply the same style across several >> elements with different classes or whatnot. This isn't burdensome when >> you're writing a single group of selectors, but when you have a large chunk >> of selectors that all have to be generalized you quickly run into a >> nightmare of typing. For example, in something I'm typing *right now*, I >> have a lot of selectors which look like this: >> #top-courses div.chapters h3, #additional-courses div.chapters h3 { ... } >> >> #top-courses and #additional-courses are two (of several) sections which >> all share a similar structure, but they have some special styling needs that >> set them apart from the others. Right now I need to duplicate every >> selector I make, which adds up to quite a few in this particular example. >> With a multi-matching combinator I could avoid the duplication. It would >> look something like this: >> :any( #top-courses, #additional-courses ) div.chapters h3 { ... } >> >> ...with the :any pseudoclass being simple sugar that stands for any of the >> selectors contained within it. :any should accept arbitrary selectors, >> separated by commas, since it's basically just performing a simple textual >> substitution in the selector. Though there are surely optimizations that >> can be performed, in the simple case all that's needed is for the parser to >> transform away the :any and produce two separate selectors to be handed to >> the matcher. >> >> It is certainly possible for authors to get the same functionality by >> going into the code and adding additional classes. That's why this is >> syntax sugar, not new functionality. ^_^ Doing such means altering the >> document when you just want to save some typing in the stylesheet, and >> possibly leaks presentational classes into the document (some times you can >> certainly come up with a semantic reason for the class, of course). As >> well, style authors don't always have access to the document source, >> particularly in cases like writing up Stylish-like user-stylesheets. >> >> >> Thoughts on these proposals? Any ideas for other simple bits of sugar >> that would help us authors out? I'm looking specifically for ones that >> don't add new functionality, but rather only shorten the amount of typing we >> have to do when writing styles. >> >> ~TJ >> > > I agree that those would be valuable. There was some discussion back in > February about "selector variables" (from Jens Meiert) and "selector > constants" (from me), that were also syntactic sugar for selectors. They > solved some of the same problems, but your ideas above do even better for > certain cases. Your #1 above is actually pretty similar to how Alan Gresley > misunderstood my proposal, which has value in its own right: > > http://lists.w3.org/Archives/Public/www-style/2008Feb/0145.html Cool. I wasn't following the list back then, so thank you for pointing it out. Selector constants solve a similar problem to the @scoped rule, but there they let you dump a complex selector anywhere within a selector. @scoped misses out on this, but results in even *less* typing (using a selector constant for a common prefix still means typing a prefix over and over, even though it's shorter). You're right that they both have interesting value, and I can see a definite purpose for constants that would make writing chunks of selectors more maintainable and easier to understand. > > > I wonder if it might even be possible to leave out the @scoped, and just > have it like this to do the same thing: > > #nav-menu { > h1 { > //This is equivalent to the selector "#nav-menu h1", > //and so won't target <h1>s across the rest of the page. > ... > } > ul { > ... > } > more rules... > } //end of scope > > That would mean that the parser would have to not only look for property > names inside the curly braces, but also for other selectors. And that way, > not only is there less to write, but you could include styling for the base > selector, like this: > > #nav-menu { > border: 2px solid red; > background-color: blue; > > > h1 { > //This is equivalent to the selector "#nav-menu h1", > //and so won't target <h1>s across the rest of the page. > ... > } > ul { > ... > } > more rules... > } //end of scope > It would be slightly less writing, but now we're talking about the difference of a couple characters, compared to the linear savings of the proposal itself. I don't see any particular reason to need this simplification, but I don't think I'd be against it either. I just suspect it would be more work for implementors than adding in a new at-rule. Styling the base selector could also be accomplished in one of two ways. Either :root can have its meaning changed within the context of a @scoped rule to refer to the scoping element (Francois implicitly used this approach), or we can just go the brain-dead simple route of stating the base selector by itself. Frex: #nav-menu { ... //for the nav-menu itself } @scoped ( #nav-menu ) { ... //for the children of nav-menu } I don't have a preference either way, but I have absolutely nothing against the simple method here. ~TJ
Received on Thursday, 9 October 2008 17:25:49 UTC