HBox 布局下的组件宽度模型

简介:

我们前阶段在extjs下遇到了一个非常棘手的问题。


问题描述:

我们项目的第一页是一个Grid,Grid上方有个fieldContainer,fieldContainer中有1个超链接,然后右边是一个Combobox,然后我们在chrome25/26上发现,不管这样整个fieldContainer始终收缩成1条直线。然后很快我们就猜想,这是因为fieldContainer的宽度被收缩到0所致,后来具体我们用了一整天的时间进行了调试,终于发现了根本原因和解决方法。也就是这篇博客提供的内容。当然了,这博客记载了我调试的全部过程,如果嫌特别长的话,读者可以直接看下方我高亮显示的结论。


话题1:在extjs BoxLayout下,如何使用width的配置项

事实上,我们有3种方式

width:'50%'

width:100

width:'100px'


我们现在需要深入研究,在这3种使用方式下,容器宽度是如何最终被计算出来的。

因为使用HBoxLayout,所以我们把断点打在如下位置:

102255413.png


方式1:使用百分比代表宽度

也就是以下方式:

102338780.png

用这种方式下,percentageWidth的值是true:

102409646.png

所以它执行了以下的代码:

102443732.png

然后我们到第46702行:

102517656.png

这里,从第46703行可以看出来,hasPixelWidth返回了false,这个和我们所设想的一致,因为我们只传递了一个百分比而不是一个像素的具体值,所以,它最后执行到了第46716行,也就是说,现在这个widthModel是被计算出来的。

102737437.png

最终我们观察现在的widthModel如下:

102800469.png

这个和我们所设想的一致,因为我们的值是一个百分比而不是一个固定的像素值,所以这个当前的widthModel的名字叫“calculated", 表示我们使用了一个用计算得出来的宽度模型。


方法2:使用固定的整数值代表宽度

也就是以下方式:

103041546.png

在这种方式下,percentageWidth的值为false,我们直接跳到第46702行:

103143778.png在这个代码段中我们可以看到,第46703行的hasPixelWidth返回的值为true,这刚好和我们的设想吻合,因为现在的宽度值是一个具体的定值,所以现在宽度模型看上去如下:

103300313.png

最终,这个也很好的匹配了我们的猜想,因为我们提供的是精确的数值”200“,所以布尔变量”calculated' 的取值为false,而且因为我们提供了实际值,所以现在这个widthModel为“configured",因为我们通过配置来给出了一个合理的宽度模型。


方法3:使用一个像素值加单位,但是用单引号包括它来使用宽度

也就是用以下方式:

103451690.png

在这种方式下,percentageWidth依然被设置为false,我们直接跳到46702行:

103542200.png

在这里,我们惊讶的发现,第46703行的hasPixelWidth居然返回false:

103619141.png


这个太出人意料了,不是吗?所以我们总结的结论是:只用用一个纯数值来表示的宽度,extjs框架才会把它当做一个像素值,然后我们把它包含了在单引号并且加了单位之后,extjs就不会把它当做一个像素值了,所以这就是width:100 和 width:'100px'的区别

所以,最后的宽度模型是:

103824826.png

它也最终和我们的猜想匹配,因为我们提供了精确的值"200px",所以布尔变量"calculated'的取值为false,但是虽然我们提供了实际的数据,但是它并不被框架当做具体的像素值,所以现在宽度模型被设置为了"shrinkWrap,也就是说最终当调用initComponent()的时候,整个容器会收缩。


所以最终结论罗列在这里:

结论1: 三种不同的宽度的设置方法对应了三种不同的宽度模型的名字

width:'50%'  -> 宽度模型:calculated

width:100    -> 宽度模型:configured

width:'100px'->宽度模型:shrinkWrap


结论2:width:100和width:'100px'的区别在于,如果使用的是整数,那么extjs会吧值当做一个pixelWidth,然后变量hasPixelWidth被设置为true,但是如果我们使用'100px',那么extjs不会吧这个值当做一个pixelWidth,然后hasPixelWidth被设置为false。


话题2:许多extjs的时间都采用了width:'100px"的风格,那么这种风格何时起作用呢?

事实上,如果我们仔细看代码的第46682行,我们就可以看出端倪来了:

104431439.png

这里我们可以看出来,虽然shrinkWrap被设置为true,width="45px",typeofWidth="string"被设置为true,但是topLevel被设置为false,所以在46682行被断开了,但是如果我们设置topLevel为true的话,就可以正常的走这些流程了。

所以我们的结论是:

如果我们使用width:'45px'这种风格的话,我们必须保证容器在组件树的顶层。





本文转自 charles_wang888 51CTO博客,原文链接:http://blog.51cto.com/supercharles888/1203652,如需转载请自行联系原作者
目录
相关文章
|
4月前
|
前端开发 容器
如何实现一个两栏布局,右侧自适应?三栏布局中间自适应?
要实现一个两栏布局,右侧自适应的效果,可以使用 CSS 的 Flexbox 或 Grid 布局来实现。以下是使用 Flexbox 实现的示例:
35 1
|
7月前
|
UED 容器
如何实现侧边两栏宽度固定,中间栏宽度自适应的布局?——双飞翼布局、圣杯(Holy Grails)布局
如何实现侧边两栏宽度固定,中间栏宽度自适应的布局?——双飞翼布局、圣杯(Holy Grails)布局
45 0
|
9月前
|
前端开发 容器
两栏布局的实现方式
两栏布局的实现方式
|
9月前
|
数据可视化
获取页面的可视化高度和宽度
获取页面的可视化高度和宽度
28 0
|
10月前
|
前端开发 容器
如何使用 CSS 来控制 img 标签在父元素中自适应宽度或高度,并按比例显示
如何使用 CSS 来控制 img 标签在父元素中自适应宽度或高度,并按比例显示
314 1
|
11月前
|
XML Android开发 数据格式
控件布局(View)叠加效果
控件布局(View)叠加效果
|
11月前
|
编解码 前端开发 Android开发
移动布局基础(流式布局)
移动布局基础(流式布局)
101 0
|
11月前
|
编译器
ElementUI之基础布局及混合布局
ElementUI之基础布局及混合布局
110 0
|
前端开发 容器
移动端布局——flex布局下的居中对齐方式
Flex是Flexible Box的缩写,意为”弹性布局”,用来为盒状模型提供最大的灵活性。任何一个容器都可以指定为Flex布局。
259 0
移动端布局——flex布局下的居中对齐方式