- From: Glen Huang <curvedmark@gmail.com>
- Date: Thu, 9 Apr 2015 11:34:20 +0800
- To: Andrea Rendine <master.skywalker.88@gmail.com>
- Cc: "Tab Atkins Jr." <jackalmage@gmail.com>, www-style list <www-style@w3.org>
- Message-Id: <B9CFA8A5-CFEB-4B45-A0AD-7F5BBC6DAD6E@gmail.com>
The crux of my proposal is this: declarations specified in @inital apply to an imaginative parent of :root @initial { color: #000; /* regular property */ --color2: #111; /* custom property */ } :root { // inherits color, --color2 from @intial } The @initial at-rule is special that variables used in media queries are resolved to the values of custom properties specified in @initial. it’s a syntax error to specify @initial in @media. This way, we avoid the recursion problem. You can specify custom properties in :root, they override @intial, but variables used media queries won't be resolved to them, only regular rules. I guess we can make other at-rules use custom properties specified @intial. @page, @viewport, just to list a few. Not sure if it creates new problems in the process. We can also constrain the power of @intial by only allowing custom properties in it, if it creates less problems. @initial { color: #000; /* ignored */ --color2: #111; /* ok */ } > On Apr 8, 2015, at 7:42 PM, Andrea Rendine <master.skywalker.88@gmail.com> wrote: > > Glen, > in your first message I didn't understand what would happen when @initial were not used, if existing. That is, if @initial were implemented, then variables shouldn't be specified in :root but in @initial, should they? > My idea is to propose something like a CSS scope (in the sense of Javascript scope, of course) so that variable values (both var() and, e.g., @viewport) cannot escape their @media reference block and therefore do not participate in condition definition for their scope itself (I also sent a proposal in that sense). > I hope someone solves this, because I guess there's another proposal _en route_ about variables and "classes" which would probably benefit from a stricter definition of separate "instruction blocks". > Andrea > > 2015-04-08 12:30 GMT+02:00 Glen Huang <curvedmark@gmail.com <mailto:curvedmark@gmail.com>>: > @custom-media mitigates the duplication issue, but still not perfect in case like this: > > :root { > --horizontal-nav-width: 600px; > } > > @custom-media --horizontal-nav-fits (width >= var(--horizontal-nav-width)) > @media (--horizontal-nav-fits) { > .nav { > width: var(--horizontal-nav-width); > margin: 0 auto; > } > } > > In this case, I design the media query specifically for the navigation. So it would be great if I can reuse the dimension in media query. Otherwise I have at least two places to edit when, for example, the number of navigation links change, and the allowed width is changed. > > The recursion problem can be solved either as mentioned by Andrea (variables used in media query aren't live, they only resolve to the custom properties of the top level :root rule), or as mentioned by me (variables used in media query resolve to the custom properties of an at-rule that can’t be specified in a media at-rule). > > Not sure if these two approaches are feasible. > > > On Apr 8, 2015, at 8:30 AM, Tab Atkins Jr. <jackalmage@gmail.com <mailto:jackalmage@gmail.com>> wrote: > > > > On Sat, Apr 4, 2015 at 12:59 AM, Glen Huang <curvedmark@gmail.com <mailto:curvedmark@gmail.com>> wrote: > >> Does this do what I think it does? > >> > >> ```css > >> :root { > >> --page-width: 768px; > >> } > >> @media (min-width: var(--page-width)) {} > >> ``` > >> > >> If not, is it because media queries don’t inherit properties from the :root element? If that’s the case, can we add a selector to select a special element that the :root element and media queries will all inherit from? > >> > >> When you design the media query break points according to certain element dimensions, being able to use variables in media queries can be very helpful. > > > > The var() function, when used on an element, just replaces itself with > > the value of the given custom property on the same element. @media > > rules aren't referring to any element, so they don't have any > > properties at all, let alone custom properties. > > > > You could let it refer to the value of the custom properties on the > > root, as you suggest, but as Cameron says, it makes it way too easy to > > get into bad loop situations. > > > > What you want are just Custom Media Queries > > <http://dev.w3.org/csswg/mediaqueries/#custom-mq <http://dev.w3.org/csswg/mediaqueries/#custom-mq>>. That way you could > > define something like: > > > > @custom-media --large-page (width >= 768px); > > @custom-media --small-page (width < 768px); > > @media (--large-page) { ... } > > > > ~TJ > > >
Received on Thursday, 9 April 2015 03:34:53 UTC