W3C home > Mailing lists > Public > www-style@w3.org > September 2012

Re: [css-variables] Referencing all properties (Issue 4, !important)

From: Tab Atkins Jr. <jackalmage@gmail.com>
Date: Thu, 13 Sep 2012 14:09:31 -0700
Message-ID: <CAAWBYDA+tmDAGJqQvnQ9aEaYsfzEGj6atR4S=OZ499+ht2yEHQ@mail.gmail.com>
To: Fran├žois REMY <fremycompany_pub@yahoo.fr>
Cc: CSS WG <www-style@w3.org>
On Fri, Sep 7, 2012 at 2:36 AM, Fran├žois REMY <fremycompany_pub@yahoo.fr> wrote:
> Tab, you are again debating that "because this can't solve all the problems,
> it should not exist at all".
>
> I don't see where the problem is to specify that we use the specified value
> to resolve property references (which, as you known, includes the
> inherited/initial value as neeeded). The differences between the computed
> value and the specified value are close to inexistant in most cases. The
> only major difference happens at 'used' time and you know as good as me that
> the computed value of any property can't depend on the used value of another
> one.
>
> I have a simple example demonstrating that referencing native properties can
> be useful.

I'm quite aware that they're useful.  They're also difficult to do
without being future-hostile to the development of CSS, or weak enough
that they don't accomplish much anyway.

> [1]
>
> If I want to have an element whose padding-left and padding right represent
> 10% of the element's width, and that I have 'specified' property reference,
> I can do:
>
>    li.padded {
>        width: 100%;
>        padding: 0px calc(0.05 * use(width));
>    }
>
>    li.twocol {
>        width: 50%;
>    }

Assuming that you *actually* want the specified percentage, and not
the resolved <length>, this might work.

> If I can't use the reference, I need to create a new custom property for the
> purpose, and this will mess up my code
>
>    * {
>        width: var(width);
>        var-width: auto; //oops, I inherit!
>    }
>
>    li.padded {
>        var-width: 100%;
>        padding: 0px calc(0.05 * var(width));
>    }
>
>    li.twocol {
>        var-width: 50%;
>    }
>
> Now, my code is completely inefficient, just because I had to work around
> the fact I can't make a reference to a native propery.

If you'd written the original rule with a better selector than '*',
you'd wipe out most of the inefficiency.

> [2]
>
> I regulary need to have something like this in my code:
>
>    a.tile {
>        background-color: blue;
>        outline-color: blue;
>        outline-width: 0px;
>        color: white;
>        ...
>        transition: all 0.3s;
>    }
>
>    a.tile:hover {
>        background-color: royalblue;
>        outline-color: royalblue;
>        outline-width: 5px;
>    }
>
> If I could simply use a reference, the code would be better and more easily
> maintainable :
>
>    a.tile {
>        background-color: blue;
>        outline-color: use(background-color);
>        ...
>    }
>
>    a.tile:hover {
>        background-color: royalblue;
>    }
>
> Again, writing the same code using a custom property would be cumbersome and
> would slow down the page.
>
> What Brian, Chris and myself would like is a simple specified-value replacor
> that works for all properties and not just for custom ones. We don't want a
> complex solution that requires new internal dependencies and you are
> rejecting this proposal because you don't want a simple solution but a very
> complex solution that's completely impossible to build.

I think that using literally just the specified value might work
without problems.  However, I suspect it would often end up being
confusing, because the difference between 'computed' and 'specified'
is normally irrelevant for authors (they can't directly observe the
specified value).

In any case, I see no problem with addressing this with a
differently-named function than what vars use, because of some of the
different details in desired behavior.

~TJ
Received on Thursday, 13 September 2012 21:10:18 GMT

This archive was generated by hypermail 2.3.1 : Tuesday, 26 March 2013 17:21:00 GMT