页面上显示的各个元素往往是嵌套的,这些元素在页面上的摆放需要某些元素能够盛放其他一些元素,因此就有了Container(“容器”,一种特殊组件)和Component(一般组件),Container能够盛放其他Container和一般的Component。
这种元素间的关系使得组件呈现层级关系。下图 展示了 ExtJS4.x 中组件间层级关系一种实例。既然组件间呈现层级关系,Container中能盛放其他Container和Component,那么怎么呈现呢?呈现的样子是什么?是从左到右一个一个摆放还是从上到下一个一个摆放?是按照东西南北中来摆放还是随意摆放?… 这些就是layout(布局)的责任范畴了,layout能够设置一个容器中的各个元素怎么放置。当然,layout不仅仅在ExtJS中出现,一切图形界面编程中都涉及它!
二、ExtJS4.x中的布局简介(An brief introduction to layout in ExtJS4.x)
ExtJS4.x为页面布局提供了多种方案,有按照“东西南北中”方位位置来摆放元素的border布局,也有元素自适应摆放的fit布局,还有从左到右按列摆放元素的hbox布局和从上到下按行摆列元素的vbox布局……ExtJS4.x为页面布局提供了多种解决方案,如下表所示。
名称 |
对应的类 |
absolute |
Ext.layout.container.Absolute |
accordion |
Ext.layout.container.Accordion |
anchor |
Ext.layout.container.Anchor |
auto或autocontainer |
Ext.layout.container.Auto |
autocomponent |
Ext.layout.component.Auto |
border |
Ext.layout.container.Border |
box |
Ext.layout.container.Box |
card |
Ext.layout.container.Card |
checkboxgroup |
Ext.layout.container.CheckboxGroup |
column |
Ext.layout.container.Column |
container |
Ext.layout.container.Container |
fit |
Ext.layout.container.Fit |
form |
Ext.layout.container.Form |
hbox |
Ext.layout.container.HBox |
table |
Ext.layout.container.Table |
ux.center |
Ext.ux.layout.Center |
vbox |
Ext.layout.container.VBox |
这17中布局方案是在长期界面编程中形成的经典方法,我们应该先学习了解各种布局的功能、特点、使用场合,然后根据自己的需求选择使用。例如,border布局适合于将页面分成“东西南北中”五部分来摆放元素的场合(当然,不必每部分都用到,例如可以只使用其中的center和south部分),它和java Swing中的border布局几乎一致。
下面以fit、border、hbox、vbox、column这五种布局来简单介绍,并配以实例。
1、fit布局
fit布局是最简单的布局,只适合于包含单一元素的容器,例如一个panel(面板)只包含另一个panel。使用fit布局时,被包含的元素会充满其父容器。要使用fit布局,只要在容器中的layout配置中指定‘fit’即可。
实例代码:
Ext.create('Ext.panel.Panel', { title: 'Fit Layout', width: 300, height: 150, layout:'fit', items: { xtype: panel, //可有可无,在Ext.panel.Panel中默认的元素也是panel title: 'Inner Panel', //元素的标题 html: 'This is the inner panel content', //内容 bodyPadding: 20, //定义padding样式 border: false //panel元素无边界 }, renderTo: Ext.getBody() });
实例展示图:
2、border
border布局非常丰富,同时也比较复杂。它提供“东西南北中”五部分供盛放元素,使得容器可以盛放嵌套panel,同时也使得部分与部分之间可以有工具栏,也可以使各部分之间能够关闭(缩至最小)。要使用border布局,只要在容器中的layout配置中指定‘border’即可。
实例代码:
Ext.create('Ext.panel.Panel', { width: 500, height: 400, title: 'Border Layout', layout: 'border', items: [{ title: 'South Region is resizable', region: 'south', // 配置放置区域为south xtype: 'panel', height: 100, split: true, margins: '0 5 5 5' //margins中个数字对应的方位一次是北东南西 },{ // xtype: 'panel' implied by default title: 'North Region is collapsible', region:'north', xtype: 'panel', margins: '5 5 0 5', height: 100, collapsible: true, // 允许收缩 id: 'north-region-container', layout: 'fit' },{ // Ext.panel.Panel中默认元素类型为xtype:panel title: 'West Region is collapsible', region:'west', xtype: 'panel', margins: '5 0 0 5', width: 100, collapsible: true, id: 'west-region-container', layout: 'fit' },{ // xtype: 'panel' implied by default title: 'East Region is collapsible', region:'east', xtype: 'panel', margins: '5 5 0 0', width: 100, collapsible: true, id: 'east-region-container', layout: 'fit' },{ title: 'Center Region', region: 'center',//中部区域是必须的,它没有宽高配置,也不需要 xtype: 'panel', layout: 'fit', margins: '5 5 5 5' }], renderTo: Ext.getBody() });实例展示图:
3、hbox
hbox布局使得容器中各个元素水平排列,一个挨一个。如果在items中配置元素时指定各个元素的宽度(可以使用绝对数字如200,也可以使用百分比),则显示时将按照指定的宽度显示;如果使用了flex配置,则按照flex比例来显示宽度;如果没有指定,则自动使用builtin(内置)规则安排各个元素的宽度。但是在高度上,则只能使用绝对数字而不能使用百分比。在使用hbox时,可以指定元素align(对齐)规则,top(顶部对齐)、middle(中部对齐)、bottom(底部对齐)、stretch(垂直方向上充满整个容器)、stretch(垂直方向上按照高度最高的对齐)。
实例代码:
Ext.create('Ext.Panel', { width: 500, height: 300, title: "HBoxLayout Panel", layout: { type: 'hbox', //指定为hbox布局 align: 'stretch' //指定元素的高将充满容器的垂直空间 }, renderTo: document.body, items: [{ xtype: 'panel', title: 'Inner Panel One', flex: 2 },{ xtype: 'panel', title: 'Inner Panel Two', flex: 1 },{ xtype: 'panel', title: 'Inner Panel Three', flex: 1 }] });
实例展示图:
4、vbox
与hbox相对,vbox按照垂直方向来摆放元素,其他属性与hbox差不多。
实例代码:
Ext.create('Ext.Panel', { width: 400, height: 300, title: "VBoxLayout Panel", layout: { type: 'vbox', //指定为vbox布局 align: 'center' //指定各元素将中间对齐 }, renderTo: document.body, items: [{ xtype: 'panel', title: 'Inner Panel One', width: 250, flex: 2 }, { xtype: 'panel', title: 'Inner Panel Two', width: 250, flex: 4 }, { xtype: 'panel', title: 'Inner Panel Three', width: '50%', flex: 4 }] });
实例展示图:
参考:ExtJS 官方文档http://docs.sencha.com/extjs/4.2.2/中布局、组件等文档