- From: Sylvain Galineau <sylvaing@microsoft.com>
- Date: Tue, 14 Sep 2010 02:20:01 +0000
- To: Tab Atkins Jr. <jackalmage@gmail.com>, www-style list <www-style@w3.org>
I'm so excited to read about new CSSOM directions I might have missed it
but a big fat one is: authors should not have to parse values such as
numbers or lengths. The browser has already parsed "100px"; having browsers
re-serialize it to a string so authors can break it apart with JS, do
something with it - likely assuming the unit is px - and then re-serialize
it is too inefficient and fragile.
So I'll be brutal and claim that if a new API could do everything you list but
still made me deal parse string values - or worse, shorthand string values - I'd
still consider it a fail.
Given that you mention Anne's Values API, I could assume you take this as granted.
But it's such a pain point I don't want to take it as granted :)
> -----Original Message-----
> From: www-style-request@w3.org [mailto:www-style-request@w3.org] On
> Behalf Of Tab Atkins Jr.
> Sent: Monday, September 13, 2010 6:36 PM
> To: www-style list
> Subject: [cssom] Directions for better OM expansions
>
> We've been discussing CSSOM stuff recently in Chrome team, and I
> wanted to push back some of the discussion to the CSSWG list. This
> email *does not* represent Chrome's position, just my own, though
> various team members' contributions have played a part in forming
> these opinions.
>
> We've been mostly discussing Anne's proposed Values API. I think it's
> a great start, but doesn't address the larger problem that the shape
> of the APIs surrounding CSS is somewhat crazy. They don't work
> together - you've got el.style pointing to the @style attribute on an
> element, el.ownerDocument.defaultView.getComputedStyle('someproperty')
> to get a resolved value (sometimes a 'computed', sometimes a 'used'
> value), and the stylesheet-based API. These all work *completely*
> differently, with vastly different access patterns, some being
> writable while other are readonly, etc. It's just a bad situation
> overall.
>
> So, I've boiled down the use-cases I think are useful to address (not
> included in this email for brevity, but can be provided upon request)
> and come up with the list of what I think are the necessities for a
> complete and sane CSS API. I'm working out right now what I think
> this would actually end up looking like - I'll send a separate email
> when I have some concrete suggestions.
>
> On the subject of what values to get/set:
>
> 1. Author should be able to get the set of all cascaded values that
> contribute to the element's style. These should have the context
> (selector if they're from a decl block, or otherwise indicating that
> they come from a @style attribute or inheritance) and a specificity
> (possibly the list is sorted by specificity?). These entries should
> be readable and writable (except for decl blocks from user
> stylesheets, of course). (Possibly, @style should always be in the
> list, even if it doesn't actually specify any values. The inheritance
> block should always be in the list, because it always passes
> *something*, even if just the initial values to the root element.)
>
> 2. Author should be able to easily read and write styles in
> stylesheets and @style attributes. CSSOM has interfaces for the
> former, though they're clumsy. The latter is already exposed in a
> convenient way through the .style attribute of elements.
>
> 3. Author should be able to read the actual used style for all
> properties. This is the result of resolving all the cascaded values
> for each property to a single value. (This more-or-less refers to the
> "used value" in the CSS Values & Units draft.) In particular, this
> should do what authors naively *expect* el.style to do - it should
> give you the value of, say, font-style no matter whether it came from
> @style, cascaded in from a style sheet, or inherited in from the
> parent.
>
> 4. Author should be able to read the "animated style" of an element -
> the current value of the property as affected by
> transitions/animations/other stuff that changes the value without
> actually touching the "specified value".
>
> 5. Author should be able to write to an "override style" that doesn't
> affect any specific decl block or @style attribute. This can be
> thought of as a special js-only style attribute on the element, with
> appropriate specificity (probably, stronger than everything except
> user !important rules). That is, it automatically overrides any value
> that comes from stylesheets or the @style attribute. (It can, of
> course, subsequently be unset, allowing normal cascading to happen.)
>
> 6. Author should be able to ask a given element to convert an
> arbitrary value from one unit to another. This is useful for various
> scripting purposes, when you're trying to set various lengths and
> being able to refer to the environment of a particular element (for
> its definition of em or %, for example) is useful.
>
> Possibly #3 and #5 can be merged to be the read/write behavior of a
> single interface. Except for user !important rules, setting #5
> immediately changes the value of the property no matter what, and
> reading #3 gives you the final value, which, if #5 was used, is the
> value from #5. Not completely certain this gives us the most sane
> behavior, but it should be definitely be looked into, to make author's
> lives easy.
>
> I could also see #5 instead participating in some slightly magical way
> in the list returned by #1, though I'm still working out how I'd like
> it to look.
>
> Notice that *not* listed above is a specific segregation between
> specified/computed/used values. This distinction between specified,
> computed, and used is completely useless to authors in general. When
> they're getting at decl blocks or @style (from #1 or #2), sure, stick
> with the specified value in the form that was provided. But when
> you're accessing the "real style" (#3 above), they shouldn't have to
> care - they should be able to ask for the value in px, em, or percent
> (or keyword, rgb, or hsl, for that matter) no matter what the original
> value was specified in. Using Anne's Values API for this seems great.
> Possibly use it for #1 too, with some caveats that it can only
> convert between certain units (specifically, those that don't depend
> on layout to figure out, so px->em is cool, but not %->px).
>
> This does bring up a few interesting conflicts. For example, how can
> you distinguish between wanting the specified value regardless of
> source (say, "50%"), and the used/actual value based on layout (if the
> element is display:none, "0px" or maybe some defined "this value
> doesn't exist" value, since there's no box to measure - especially
> important for prop)?
>
> I think that can be punted by the fact that authors would have easy
> access to both the cascaded values (#1) and the "real value" (#3). #1
> is easy to ask for the specified value - if nothing else, you can just
> walk the returned array (assuming it's sorted by specificity),
> grabbing the value from the first block that specifies it. We could
> easily convenience this away, too, giving the author an easy ability
> to ask "what decl block contributed the winning value for this
> property?". #3 is then free to be as magical/useful as we can make
> it, properly paying attention to layout and such. Once you've dropped
> down to used value level, converting between units should be easy to
> do, too - all the information you need is already there.
>
> I think the "animation style" (#4) would be similar, in terms of
> allowing easy conversion between units?
>
> I think this hits all the major use-cases for things we want to do
> with CSS, in a relatively sane way. You can access all the various
> stylesheet levels for reading/writing, get access to the declaration
> blocks that contribute values for specific properties, set style
> regardless of what comes in from the document, and query for the used
> value of a property in any unit.
>
> Thoughts? Am I missing something? Am I off-track in something?
>
> ~TJ
>
Received on Tuesday, 14 September 2010 02:20:38 UTC