I think the default of the css box model is broken by design.

I'd think the solution is simply to stick to using border-box.
http://css-tricks.com/box-sizing/

On Apr 4, 2014, at 9:54 PM, Peter Ent wrote:

> Hi,
> 
> I've been working on a mobile app example for FlexJS as a way to try out the 
> Flex JS in a practical manner with the intent of running the app using 
> PhoneGap. In the course of doing this I've been running into things that need 
> adjustment.
> 
> One of them is the box model. Right now FlexJS is sort of a hybrid between 
> ActionScript and JavaScript. I'll use the .width property as an example.
> 
> In Flex, when you give a component a width of 50 pixels that component is 50 
> pixels wide. Some components, such as a container, would embed a scrollbar if 
> its content were greater than 50 pixels. But you can be sure that your 
> component is 50 pixels wide and you can position other components knowing 
> that.
> 
> If you add padding to the component, that will offset the interior by that 
> amount. If you make a Container 200 pixels wide and give it a padding of 10 
> pixels, positioning a child of that container at (0,0) will render the child 
> 10 pixels in from the left and 10 pixels down from the top. The child thinks 
> it is at (0,0) and the Container will remain 200 pixels wide.
> 
> In the CSS Box model, things work differently. If you make an HTML element 50 
> pixels wide and give it a padding of 10 pixels, the overall width of the HTML 
> element will be 70 pixels: the 50 pixels are the width of the content area 
> and 2*10 pixels (left and right) are the padding added to that.
> 
> HTML goes further and adds on border thickness and margin; Flex doesn't have 
> margins.
> 
> I was having trouble getting things to align because I would make a ButtonBar 
> 480 pixels wide and it was turning out to be wider than that. When I looked 
> into the code, I saw that making a component 480 pixels was just the start: I 
> was getting that plus a padding on each of the buttons that make up the 
> button bar plus the width of the border around each button.
> 
> This makes alignment very difficult because you must ask for more than just 
> width (or height).
> 
> I suggest FlexJS completely adopt the CSS Box Model. This means setting a 
> component's width isn't going to take into account its padding, border 
> thickness, and margin - it is just going to set the component's content area 
> width. For example, if I make a Button's width be 50 pixels, the text will be 
> placed within that 50 pixel content area, but there may be padding, a border, 
> and a margin surrounding the Button. If I want all of my Buttons to align 
> horizontally with no gaps, I should make sure the Buttons do not have any 
> margin.
> 
> What this means is that .width won't set the overall width of the component. 
> This may affect layout calculations which will have to examine the 
> component's margin, border thickness, and padding values. So I suggest making 
> it simple (height dimension would have similar properties of course):
> 
> .width is the content area.
> .padding is the padding around the content area, inside the border.
> .borderThickness is the thickness of border that surrounds the padding and 
> content area.
> .margin is space around the component.
> .x will position a component's upper-left margin.
> 
> .overallWidth will be .width + 2*.margin + 2*.padding + 2*.borderThickness
> 
> You can use .overallWidth to position elements in layouts as it will account 
> for all of the extra space in a component's box.
> 
> Further, for Flex JS 1.0, I suggest we keep it simple to padding, margin, and 
> borderThickness and leave edge specifics (e.g., padding-top, margin-bottom) 
> to another release or a developer can create their component or override 
> functions to account for that.
> 
> Finally, it should be easier to build applications because you can let CSS 
> have a greater say in the size and positioning of components. For example, if 
> I want to make a row of buttons that are all touching, I just create a 
> Container with a horizontal layout and put the Buttons into it. Then in CSS, 
> I specify that the Buttons have zero margin and if I want them inset within 
> the Container, I give the Container, via CSS, some padding.
> 
> Thanks for your time,
> 
> Peter Ent
> Adobe Systems
> 

Reply via email to