Re: CSSStyleDeclaration: Setting only a value or a priority

On Fri, 23 Aug 2013 01:39:26 +0200, L. David Baron <>  

>> Since that was me ...
>> David, I think you've let the guts of Gecko's implementation color
>> your thinking a little too much.  Specifically, the fact that Gecko
>> maintains separate "declaration blocks" for !important and normal
>> properties from the same style rule is an artifact of the
>> implementation that should *not* IMNSHO be visible to style authors.
>> Style authors should be presented a unified view in which any given
>> rule has only one value for any given property, which may or may not
>> have its !important bit set.
> I don't think the mental model is at all related to the storage;
> I've had that mental model since before we took that approach for
> storage.  And I also dislike that approach for storage and would
> prefer to have them stored together.
>> As such, setProperty(prop, value, "") should be thought of *not* as
>> "appending a new property-value pair to the style rule, which may then
>> override an earlier pair" but as "*replacing* the existing value for
>> 'prop', if any, otherwise setting it anew". I believe this is the most
>> natural mental model.
> It's pretty odd once you have margin-left interacting with
> margin-start, though, since then (in LTR),
> setProperty("margin-left", "...") will override a margin-before in
> the same declaration block *unless* there was a pre-existing
> margin-left declaration that was before the margin-before
> declaration.  That's pretty odd.

But that's the behavior the spec has and that browsers have as well (I  
can't test IE right now but IIRC it does this also).

Note that color is still first in the list.

Now, in the case of margin-left vs margin-start...

The order in CSSOM is unchanged in both Gecko and Blink. Gecko uses  
margin-left while Blink uses margin-start. So in this case Gecko ends up  
in a state where the order exposed by CSSStyleDeclaration doesn't match  
what Gecko actually uses.

It's unclear to me why margin-left vs margin-start depends on the order  
instead of e.g. always letting margin-start win.

>> (Relatedly, I think the behavior of
>>    p { color: green !important; color; red }
>> is surprising and inconsistent with the rest of CSS, and should
>> probably be changed so the textually-last property clobbers the
>> !important one.)

We can't change this I think.

> I think CSS1 and CSS2 are both pretty clear that:
>   p { color: green !important; color: red }
> is intended to simply be a shorthand for:
>   p { color: green !important }
>   p { color: red }
> While what you propose is perhaps a consistent model, it's
> inconsistent with the stated intent of declaration blocks in CSS.

I'm not convinced that setProperty necessarily needs to be consistent with  
how declarative CSS works.

Simon Pieters
Opera Software

Received on Friday, 23 August 2013 08:11:39 UTC