Hi,

FlexJS is having a little bit of an identity crisis when it comes to layout and 
dimensions; specially, when it comes to determining the size of a component. 
Flex makes it pretty clear what the .width property returns, for example. We 
have been going back and forth on this with FlexJS since the Flex way is a 
little different than the browser/CSS way.

In Flex, when you set the width of a component, you are setting the bounding 
box which includes: the width of the content the component holds any padding 
(left and right), and the border thickness (I might be wrong about the border 
thickness being taking into account, but for the sake of this discussion, let's 
assume so). If you change a component's padding, the interior space of the 
component shrinks.

Because FlexJS also lives in HTML/CSS land, we need to take into account how 
components are sized in both the ActionScript/Flash world and the 
JavaScript/HTML world. On the JavaScript/HTML side, FlexJS sets up the CSS Box 
Model[1]. According to the WWW CSS docs, setting the width of an element just 
sets the interior or content space. If you want to know the overall width, you 
must get the element's padding, border, and margin and calculate that.  In 
other words, if you set a <div> to have a width of 100 pixels and a padding of 
10 pixels and a border of 2 pixels, the overall width is going to be 
100+2*10+2*2 = 124 pixels.

Many components in FlexJS have their base element a <div> on the JavaScript 
side. If you set a component to be 100 pixels, the ActionScript version will be 
100 pixels but the JavaScript version may not, depending on the padding, etc.

We need a consistent and unified way of knowing (and setting) the size of 
component.

The CSS Box Model seems fine to work with when you are developing HTML pages 
and web sites, but I'm not so certain it makes it easy for application 
developers making apps. I think when you set a component's width to 100 your 
expectation is that is how much space it occupies (padding and border already 
being taken into account). I believe it would be easier to make 
FlexJS/ActionScript conform to the CSS Box Model than it would the other way 
around, but I'm not sure that makes it easier - in the end - for developers and 
users of FlexJS.

I'm looking for your thoughts and preferences in this matter and I'm including 
a proposal:

The .width and .height property SETTER functions would set a component's 
.explicitWidth/.explicitHeight value. Depending on the component, the amount of 
horizontal interior space for children would be what is left over after 
subtracting left and right padding and left and right border thickness.

The .width and .height property GETTER functions would return values based on 
how the component is being sized in their respective dimensions. For example, 
if .width is set to 100, then the .width getter would return 100 since that is 
its explicit size. But if the component did not have a height set, .height 
getter would return the vertical space occupied by the component's children, 
plus top and bottom padding, plus top and and bottom border thickness.

Margin values would only be used by layout algorithms to determine spacing 
between components in the layout.

The .explicitWidth and .explicitHeight properties would be read-only and if 
set, indicate a constant size for the component in that dimension.

The .percentWidth and .percentHeight properties would be read/write and if set, 
indicate how much of the parent space to use. The percentage value would act 
like an explicit value because the component is not being sized by its content, 
rather as a percentage of its parent component. If the .width or .height SETTER 
is used, it would unset the corresponding .percent property.

The affect of border and padding on a component is then determined by how the 
component is being sized. For components being explicitly sized,  border and 
padding cause the interior space of the component to change. Thus a component 
that is .width=100 and a padding of 0 (zero) and no border would have a content 
area of 100. But if the component were to have a padding of 10 set, then the 
content area would become 80 (100 - 10 left - 10 right); the component's layout 
algorithm would have to deal with this situation.

If a component is being sized by its content, then padding and border change 
the overall size. For example, if a component has a child that is 100 pixels 
wide, the component's .width GETTER would return 100. If the component then had 
a padding of 10 added to it, the .width GETTER would return 120. In this case, 
the child has determined the component's minimum size and padding and border 
just add to that.

For application developers, I think one function should return a component's 
width or height so calculations can be easily made. This enables a layout to 
work based solely on the values returned by the .width and .height GETTER 
functions while allowing styling, such as padding and border, to be set apart 
from the code. If a component is set to a specific size, changing padding won't 
cause a ripple effect on the screen, but components loosely placed (i.e., 
relying on layout algorithms to place them) would be easily styled with padding 
and borders.

For example, a horizontal container with no explicit width might have 4 buttons 
in it, also with no width set on them. The container's width is then determined 
by the sum of the widths of the button children. By setting a padding of 5 on 
the horizontal container, the container would widen by 10 pixels. Setting 
padding on each button to 5 would make the container 40 pixels wider still.

If the developer decided to fix the horizontal container to 400 pixels, adding 
the padding of 5 pixels would change the interior layout space from 400 to 390 
but the container would not increase in size as it would if it were being sized 
by its content.

Thanks for your time,
Peter Ent
Adobe Systems

[1] http://www.w3schools.com/css/css_boxmodel.asp

Reply via email to