W3C home > Mailing lists > Public > www-style@w3.org > June 2010

Re: [css3-text-layout] New editor's draft - margin-before/after/start/end etc.

From: Håkon Wium Lie <howcome@opera.com>
Date: Thu, 3 Jun 2010 19:21:40 +0200
Message-ID: <19463.58532.655502.874206@gargle.gargle.HOWL>
To: Boris Zbarsky <bzbarsky@mit.edu>
Cc: www-style list <www-style@w3.org>
Also sprach Boris Zbarsky:

 > > It seems fair that one cannot expect APIs meant for specified property
 > > values to work for aliases -- 'margin-start' is an alias, not a
 > > property.
 > 
 > Hold on.  So I can write "* { margin-start: 20px }" in my CSS, but I 
 > can't do this in JS?
 > 
 >    var sheet = document.styleSheets[0];
 >    sheet.insertRule("* {}", 0);
 >    sheet.cssRules[0].style.setProperty("margin-start", "20px", "");
 > 
 > Why shouldn't I be able to do that?  Why shouldn't I be able to do 
 > thisElement.style.setProperty("margin-start", "3px", "")?
 >
 > That is, it seems like you have defined this thing to be an "alias" 
 > (whatever that is, _that_'s not defined) for some reason and are now 
 > arguing circularly that this means specified values for it "shouldn't 
 > work".  But why shouldn't they?  Specified values for *-start/end are 
 > dead simple; it's the computed and used values that are complicated!

Let's take one step back. What I'm trying to do is to see if it's
possible to construct a model where (a) it's possible to use
direction-dependent property names in CSS, while (b) keeping costs to
a minimum for implementors. 

(I'm not conviced that (a) should be a requirement; there may be better
ways to solve the problem, e.g., Andrew Fedoniouk's proposal to add
pseudo-classses (such as :rtl, :ltr and :ttb). However, I'm willing to
try work it out.)

I'm scared by the complexity of David Baron's proposal, which adds 130
new properties [1]. I'm also happy to see him being very honest about
the complexity [2].

[1] http://lists.w3.org/Archives/Public/www-style/2010Jun/0003.html
[2] http://lists.w3.org/Archives/Public/www-style/2010Jun/0014.html

So, I'm trying to see if it's possible to support "margin-start: 10px"
without adding *-source properties. Also, I'd like for implementations
to forget about direction-dependent properties/aliases as soon as
possible. Ideally, this should be done at parse-time, but at that
point we don't know what the value of 'writing-mode' will end up
being. So, I think we need to hold only them until the computed value
of 'writing-mode' is known.

At that point, we should be able to map settings from
direction-dependent settings to physical seetings. So, e.g., we can
map:

  margin-start: 10px

to one of these:

  margin-left: 10px
  margin-top: 10px
  margin-right: 10px

and forget about "margin-start: 10px". 

As you have pointed out in the past [3], specified values need a lot less
memory than computed values. So, it may be that we can keep them
around so that scripts can get to them. But, this, may have limited
value. For example:

  margin-start: 20px;
  margin-left: 10px;

In the example above, knowing the 'margin-start' declaration has
limited value as it is overridden by the subsequent 'margin-left'
declaration (assuming ltr).

Therefore, the computed value is more interesting. In David Baron's
model, 'margin-start' has its own computed value [4]. I think it's
possible to avoid that by mapping the direction-dependent
properties/aliases to physical properties. So, only the physical
properties would have computed values -- the direction-dependendt
properties/aliases could be computed in a lazy fashion based on the
values of the physical properties and 'writing-mode'.

Now, to come back to your question:

 > Hold on.  So I can write "* { margin-start: 20px }" in my CSS, but I 
 > can't do this in JS?
 > 
 >    var sheet = document.styleSheets[0];
 >    sheet.insertRule("* {}", 0);
 >    sheet.cssRules[0].style.setProperty("margin-start", "20px", "");
 > 
 > Why shouldn't I be able to do that?  Why shouldn't I be able to do 
 > thisElement.style.setProperty("margin-start", "3px", "")?

I think it should be possible to support this code. However, a mapping
will have to take place internally so that 'margin-start' is mapped to
the right physical property, by way of 'writing-mode'. It may be that
an external library can do the job just as well, but I'm not opposed
to adding such declarations through the DOM.

Does this make sense?

[3] http://lists.w3.org/Archives/Public/www-style/2010Jun/0013.html
[4] http://lists.w3.org/Archives/Public/www-style/2010Jun/0014.html

-h&kon
              Håkon Wium Lie                          CTO °þe®ª
howcome@opera.com                  http://people.opera.com/howcome
Received on Thursday, 3 June 2010 17:22:19 GMT

This archive was generated by hypermail 2.3.1 : Tuesday, 26 March 2013 17:20:28 GMT