W3C home > Mailing lists > Public > www-style@w3.org > August 2008

Re: [CSS Variables] WebKit now supports variable declaration blocks

From: François REMY <fremycompany_pub@yahoo.fr>
Date: Fri, 22 Aug 2008 19:16:35 +0200
Message-ID: <21C95EF876EB4FC9A19DD3E1C80BCC30@fremycompany>
To: "L. David Baron" <dbaron@dbaron.org>, "David Hyatt" <hyatt@apple.com>
Cc: <www-style@w3.org>

> From: "L. David Baron" <dbaron@dbaron.org>
>
> On Monday 2008-07-28 17:56 -0500, David Hyatt wrote:
>>
>> In the next WebKit nightly you will be able to try out CSS variables
>> whose values are declarations.  Here is what the syntax looks like:
>>
>> @-webkit-variables {
>>    simpleVariable: 5px;
>>    complexVariable {
>>        width: 5em;
>>        height: 5em;
>>    }
>> }
>>
>> div {
>>     background-color: green;
>>     -webkit-var(complexVariable);
>>     color: white;
>> }
>
> So are these variables intended to be mutable later via script, or
> intended to be constants?  (If the latter, should they really be
> called variables?)

Yes, they are. Because if they are constant, how to support the disabling of 
a stylesheet that define a variable ?
And what about two variable declaration on the same name ? This problem was 
debated and it was shown that a constant is more difficult to implements 
than a normal variable.

But for complex variables, I suggest the use of a "extends" property.

@define {
    bigText {
        font-size: 150%
        font-weight: bolder;
        color: black !important;
    };
}

h1.bigText {
    font-size: 15pt;
    extends: $bigText;
    color: blue;
}

Computed values of a "h1.bigText" with no style : {
    font-size: 15pt; /* the h1.bigText rule have more importance than the 
extended one */
    font-weight: bolder; /* this is the only one rule */
    color: black; /* the rule that have !important have more important than 
the others */
}

I've only one question :
Will that be allowed or not :

@define {
    var1 {
        color: blue;
    };
    var2 {
        extends: $var1;
        color: red;
    };
}

h1 {
    extends: $var2;
}

If it's allowed, what should be the result for H1 ?
I propose 'red' because blue became redefined in var2 as they was if it was 
another style rule.

>
> If they're supposed to be variables, it seems like it's impossible
> to get the following combination to work correctly:
> * cascading order
> * CSS object model, which only allows storing one value per
>   property per declaration block
> * dynamic changes to complex variables.
>
> In particular, if the complex variable can be changed later, I'm not
> sure how to reflect in the CSS object model that there's a
> declaration block a declaration like:
>
> @define {
>  complexVariable {
>    color: blue;
>  }
> }
>
> p { var(complexVariable); color: green; }
> q { color: purple; var(complexVariable); }
>
> such that p elements are green, q elements are blue, but if we
> dynamically change complexVariable to no longer declare the color
> property, q elements would change to purple.  (And consider
> especially dynamic mutation of sheet.cssRules[i].style.color on the
> p and q rules, which is already permitted.)
>
> Are these complex variables intended to be mutable, or are they
> really constants?

I suppose there are varibles. But if we follow the model I proposed before, 
it should works, no ?

>
>> As I stated in a previous post, WebKit also currently supports the
>> double equals syntax and the dollar sign syntax for referencing
>> variables, so =complexVariable= and $complexVariable also work.
>
> This seems a bit dangerous in case this syntax is not chosen for
> variables, but is then used in CSS for something else later on.

I agree with you. But it's for test-only and it's only available in alpha 
builds of WebKit.

>
> -David
>
> -- 
> L. David Baron                                 http://dbaron.org/
> Mozilla Corporation                       http://www.mozilla.com/
> 
Received on Friday, 22 August 2008 17:17:19 GMT

This archive was generated by hypermail 2.2.0+W3C-0.50 : Monday, 27 April 2009 13:55:11 GMT