箱子布局攻略 (HBox/VBox Layout)

一、了解箱子布局

箱子布局是一种新颖的布局方式,其布局模型可以更好地优化UI设计的工作。它率先在 XUL 界面语言中被提出,广泛应用于 Mozilla 的应用程序,如 FireFox 等等。在 CSS 布局系统中(for CSS v3),作为新增的补充形式,箱子布局可以指定子元素在水平或垂直的任意一种方向进行排列,剩下有多的空间由已声明了的子元素来填空(声明 flex 项)。

我们知道,在 Ext JS 中,容器里面是用来放置组件的,至于容器内的子组件怎么排列就由布局风格来指定。3.0 提供了新的基于箱子模型的布局方式,分别是 Hbox 和 Vbox,对应的命名空间是 Ext.layout.HBoxLayout 和 Ext.layout.VBoxLayout。HBox 全称 Horizontal Box,其中所有子项都是自动按顺序横排。VBox 则相反,全称 Vertical Box,里面为竖排方式。所谓箱子模型的意思,就是将显示部分分割成一系列的 box,按照水平的或垂直的两种方位排列组织。水平 box 可以将其子组件排成一条线,而垂直 box  可以将其子组件定位成垂直方向。如果既然要水平方向和垂直方向两个方向填充内容,我们可以相互内嵌布局,即水平布局内嵌垂直布局,或垂直布局内嵌水平布局。

透过下图的一个例子可以看到两种方向的不同。

箱子模型的理论其实很人性化,既可以支持固定值尺寸的子项内容,也可以支持自适应的子项。箱子布局中的元素可以分配一个固定的值,也有可能加大尺码,这是容器空间有余的情况;另一种情况,则是容器空间不够容纳元素,就缩小某个元素的尺寸以适应。作用在那个元素身上?有 flex 配置项的子项元素,也就是说,HBox/VBox 布局会把有设定 flex 配置的子项划分垂直或水平的空间。另外,容器中元素的位置和顺序也会某程度地改变。

二、API攻略

a.flex 配置项

flex 配置项不是设置在布局上,而是设置在子项的配置项。每个子项相对的 flex 值都会与全体子项 flex 累加的值相比较,根据此结果,处理每个子项的 flex 最后是多少。若不设置子项的 flex,表示不对子项作自适应尺寸的处理,相当于 flex = 0 的子项或 flex = undefined 的时候,表示子项不会自伸缩处理,而采用最初的尺寸。

如下例:

{
layoutConfig: {
padding:'5',
align:'top'
},
defaults:{margins:'0 5 0 0'},
items:[{
xtype:'button',
text: 'Button 1',
flex:1
},{
xtype:'button',
text: 'Button 2',
flex:1
},{
xtype:'button',
text: 'Button 3',
flex:1
},{
xtype:'button',
text: 'Button 4',
flex:3,
margins:'0'
}]
}

该配置项效果如下图:

如果子项都设置相同 flex 值,那就意味着全体子项作相同的处理。

技巧:我们可以只让一个 panel 设定 flex,便可以作为填充空白的 spacer:

{
layoutConfig: {
padding:'5',
align:'top'
},
defaults:{margins:'0 5 0 0'},
items:[{
xtype:'button',
text: 'Button 1'
},{
xtype:'spacer',
flex:1
},{
xtype:'button',
text: 'Button 2'
},{
xtype:'button',
text: 'Button 3'
},{
xtype:'button',
text: 'Button 4',
margins:'0'
}]
} 效果如下:

flex 的文档也不是说得太清楚,不过我们可以多参考官方例子是怎么使用 flex 的。一旦你明白了flex 这个概念之后,它会非常灵活地进行布局。

b.如何对齐 align & pack

当然我们可以 Vbox 布局中内嵌 hbox 布局,或者 hbox 中内嵌 vbox,HBox 和 VBox 之间是可以允许嵌套布局的,但实际不必如此手动去做, Ext JS 为我们提供了“对齐 align/pack”的这一对方向各异的调整配置,代替了上述“内嵌”的这一种稍微让人感觉别扭。容器中每一个子项都遵循用户指定的 align/pack 对齐方式。一般设置的地方是在容器的 layoutConfig 配置项对象中,如下面某一个容器的代码片断:

layout:'hbox',
layoutConfig: {
align : 'stretch',
pack : 'start',
},
items: [
{html:'panel 1', flex:1},
{html:'panel 2', width:150},
{html:'panel 3', flex:2}
]

对于垂直布局的 VBox 而言,属性 align 就是水平对齐的设置了,align 有以下可选项:

键值 作用
left 居左,从容器的 left 开始水平对齐。这是系统默认的选项。
center 居中,从容器的 mid-width 开始垂直对齐。
stretcn 拉伸子项以填充容器的水平宽度。
stretcnmax 拿最宽的那个子项拉伸,适应容器的水平宽度。

属性 pack 是控制容器里面的子项是如何停靠的,这是垂直方向本身的对齐。有如以下设置:

键值 作用
start 居顶,从容器的 top 停靠子项。这是系统默认的选项。
center 居中,也就是子项都从容器的 mid-height 上开始停靠。
end 居底,从容器的底部边边开始往上摆子组件。

对于水平布局的 HBox 而言,align 就是决定如何垂直对齐,align 的可选项有如下:

键值 作用
top 顶部对齐,从容器的 top 开始垂直对齐。
middle 居中对齐,从容器的 middle 开始垂直对齐。
stretch 拉伸子项以填充容器的垂直高度。
stretchmax 拿最高的那个子项拉伸,适应容器的垂直高度。

pack的可选项有以下几种:

键值 作用
start 居左,从左边开始排列内容。
center 居中,也就是从容器的 mid-width 开始停靠内容。
end 居右,从容器的右边开始停靠内容。

对于 top、middle/center 我们能够一眼地看出是什么意思,而 stretch/stretchmax 又是什么用法呢?一图胜千言,我们看看下面这张图(点击图片运行例子以了解更多的适用情形):

c.设置内外边距

BoxLayout 可设置外边距(margins)。关于 defaultMargins,就是如果不制定每个子项的 margins 属性,那么就会使用默认的 margins。规定 defaultMargins 的格式如下:

{
top: (top margin),
right: (right margin),
bottom: (bottom margin),
left: (left margin)
}

默认为 {top:0, right:0, bottom:0, left:0} 。margin 属性接纳的格式也可以是字符串的,规定为空格隔开,数字类型的 margin 值。各个方向的排列顺序为 CSS 的顺序:

  • 如果只是一个值,就是各个方向都是这个值。
  • 如果有两个值,那么第一个值代表是上下方向的值,第二值则是左右方向的值。
  • 如果有三个值,第一个值是顶部的值,第二个值是左右两边的值,第三个值是底部的值。
  • 如果有四个值,分别代表就是顶部、右边、底部和左边的值(为方便记忆,可理解为顺时针方向)。

BoxLayout 可设置内边距(padding)。跟 defaultMargins 差不多,padding 属性接纳的格式也可以是字符串的,其格式规定为空格隔开,数字类型的 margin 值。各个方向的排列顺序为 CSS 的顺序。

三、小结

需要说明的是,H & V 箱子模型只限特定的应用场合使用,不是在任何布局都可适应。例如,H & V BoxLayout 就不支持渲染表单的 fieldLabels。要解决此问题,可以为 fieldLables 增加一层 layout:'form' 的容器。尽管理论上可设计一个满足多样需求的布局,但性能会是一大障碍(可参阅 http: //www.extjs.com/forum/showthread.php?p=396565#post396565)。也可以使用其他的布局风格,如 TableLayout 代替,但 TableLayout 一个明显的不足是其子项的增、删、改都不太方便;再如浮动布局 FloatLayout,FloatLayout 很像水平布局的 HBoxLayout,支持 x/y 的绝对布局,不过就没有自适应大小的功能。如果没有大小尺寸不够放得下,就换行显示。FloatLayout 同样有拉伸子项的功能,也支持 top/bottom/middle 对齐,以及居中、居左、居右的功能。

可见,H & V BoxLayout 越来越备受推崇,必须把它弄懂才行。学习游泳最好的方法就是跳进水里大胆试试,把上面的例子和官方源码当作你的湖吧!

四、延伸阅读:

时间: 2024-10-11 20:01:22

箱子布局攻略 (HBox/VBox Layout)的相关文章

携程大力布局攻略社区业务

摘要: 现如今人们对出游的需求趋于个性化,在出游前往往会上网搜索目的地的各种信息,通过别人的经验和推荐决定自己的出游计划,线上的游记攻略平台也越来越多,穷游网.蚂蜂窝.在 现如今人们对出游的需求趋于个性化,在出游前往往会上网搜索目的地的各种信息,通过别人的经验和推荐决定自己的出游计划,线上的游记攻略平台也越来越多,穷游网.蚂蜂窝.在路上等纷纷投身其中.作为在线旅游网站巨头,携程同样正加紧布局自己的攻略业务,携程攻略社区CEO冯卫华近日接受商报记者采访时表示,携程在去年组建了独立的攻略社区事业部,

《Clash of Clans部落战争》新手入门布局攻略

很多新玩家或许都和小编一样,把<Clash of Clans部落战争>当成是简单的经营游戏,以为只是简单的建造些房子,兵营.资源.防御设备.其他在你布置这些建筑的时候也是需要技巧的.今天小编就作为一名新手,向新手的玩家们介绍下小编布局的心得.首先资源的建筑,比如金矿.圣水收集器.暗黑重油罐.因为游戏中你不可能只建造一种资源,所以在资源多的情况下,一定要分开放置.不要把所有资源都放在一起,万一坏人来了,就是被轻易的全部抢走.资源合理放置好之后,就是在资源旁边建造防御设备.比如:加农炮.箭塔.城墙

Android中FoldingLayout折叠布局的用法及实战全攻略_Android

一.概述无意中翻到的FoldingLayout的介绍的博客,以及github地址.感觉很nice呀,于是花了点时间研究以及编写,本篇博客将带大家从最基本的原理分析,一步一步的实现我们的FoldingLayout,当然了,如果你能力过硬,可以直接下载github上的代码进行学习. 博客基本分为以下几个部分: 1.Matrix的setPolyToPoly使用 2.在图片上使用渐变和阴影 3.初步的FoldingLayout的实现,完成图片的折叠显示(可控制折叠次数.包含阴影的绘制) 4.引入手势,手

《Android应用开发攻略》——1.15 程序:Android OS下的小费计算器Tipster

1.15 程序:Android OS下的小费计算器Tipster Sunit Katkar1.15.1 问题 当你和朋友前往饭店就餐并且希望计算各自的账单和小费时,可能陷入许多手动计算和分歧之中.你希望使用一个应用程序,简单地将小费比例加到总额上,并且按照就餐人数分配.Tipster就是Android中的一个实现,用它展示一个完整的应用程序.1.15.2 解决方案 这是一个简单的练习,使用Android中的基本GUI元素,然后用一些简单的计算和事件驱动UI代码将它们组合起来.将用到如下GUI组件

《Android应用开发攻略》——1.3 从命令行创建 “Hello, World”应用程序

1.3 从命令行创建 "Hello, World"应用程序 Ian Darwin1.3.1 问题 你想在不使用Eclipse ADT插件的情况下创建新的Android项目.1.3.2 解决方案 使用Android开发工具包(Android Development Kit,ADK)中的android工具,利用creat project参数和一些附加参数配置你的项目.1.3.3 讨论 除了平台名称之外,android还是一个用于创建.更新和管理项目的命令行工具的名称.可以进入android

《Android应用开发攻略》——1.4 在Eclipse中创建“Hello, World”应用程序

1.4 在Eclipse中创建"Hello, World"应用程序 Ian Darwin1.4.1 问题 你打算用Eclipse开发Android应用程序.1.4.2 解决方案 安装Eclipse.Android SDK和ADT plug-in.创建项目并开始编写应用程序.从Eclipse中构建项目并在模拟器下测试.1.4.3 讨论 安装如下软件之后,就可以开始开发了: Eclipse IDE Android SDK ADT plug-in 安装上述三个软件的详细讲解请参见攻略1.5.

安卓版版黄金矿工3怎么玩及攻略

游戏介绍 黄金矿工想必大家都知道,这款经典的游戏也是从pc平台移植到了安卓平台,如今,这款游戏的续作第三部也问世了.第三部中,游戏规则并没有太大的改变,依旧是控制矿工开采黄金,其它规则则与黄金矿工一样,你必须挖到一定的分数才能过关,大金子小金子价钱都不同,带问号的口袋可能会有好东西哦~之后的关卡还会有钻石出现,捞到钻石你就赚了,不仅捞的快还值钱,但如果捞到石头可是会很影响速度的,而且不值几个钱...... 完成关卡后你可以用你捞到的钱买东西,但也不能乱花,开始可以买炮在捞到石头的时候炸掉它,玩几

网页制作全攻略,网页制作学习

攻略|网页 构思篇 着手做主页之前一定要对自己将来的主页有个完整的构思,切忌随心所欲,想到什么做什么.那样的话,要么做到一半就难以为继,半途而废,要么作出的主页也是杂乱无章. 首先,应为自己的主页确定一个主题,如关于电脑.音乐等,以防做成一个大杂烩,不仅加大了寻找素材的难度,而且也为将来网站的维护带来困难.其次,应该给自己的主页确定几个栏目,并依据这 些栏目,设计出整个网站的主体框架,这个框架应保证访客浏览主页时,随时能到他想去的任何一个栏目.再次,要注意背景与正文颜色的对比度以提高页面的可读性

SEO老生常谈:提高网站收录和排名全攻略

现在网上有很多关于提高网站收录和排名方法的文章,大家都写得挺好的,而且关于这一问题更属于老生常谈.只不过对于很多网站SEO优化的新手来讲,一篇篇地看都太费时费力了,下面是郑州做网站公司_乐之人科技总结的一份简明版的提高网站收录和排名的方法全攻略,请大家参详,希望对大家有所帮助. 一.站内优化:做好内功,更需要注意保持站内权重的集中. 1.网站标题.无论是网站title还是内容标题,最好都适时体现出关键词,注意关键词分隔符号,例如百度一般用[_]或[丨].谷歌用[,]或[-]或空格.关键字与主标题