深入浅出ExtJS 第六章 布局

  1 6.1 布局的用途
  2   //决定把什么东西放到什么位置;
  3   var vieport = new Ext.Viewport({
  4     layout:‘border‘,      //使用BorderLayout的布局方式(边界布局);可以自动检测浏览器的大小变化和自动调整布局中每个部分的大小;
  5     items:[{
  6       region:‘north‘,     //指定组件的具体位置;
  7       height:40,
  8       html:‘<h1>顶部</h1>‘
  9     },{
 10       region:‘west‘,
 11       width:100,
 12       html:‘<p>左侧区域</p>‘
 13     },{
 14       region:‘center‘,
 15       html:‘主要内容‘
 16     }]
 17   });
 18   //Ext的所有布局都是从Ext.Container开始的,Ext.Container的父类是Ext.BoxComponent;
 19   //Ext.BoxComponent是一个盒子组件,可以定义宽度/高度和位置等;
 20   
 21   //Ext.Container及其子类
 22   >.Ext.Container     //Ext.Container的子类都可以用layout对内部的items进行布局;
 23     >.Ext.Viewport    //页面整体布局;
 24     >.Ext.Panel       //嵌套布局;
 25       >.Ext.TabPanel
 26       >.Ext.Tip
 27       >.Ext.Window    //嵌套布局;
 28       >.Ext.form.FieldSet   //表单布局;
 29       >.Ext.form.FormPanel  //表单布局;
 30       >.Ext.tree.TreePanel
 31       >.Ext.grid.GridPanel
 32         >.Ext.grid.EditorGridPanel
 33         >.Ext.grid.PropertyGrid
 34 
 35   //所有布局类也有一个共同的超类Ext.layout.ContainerLayout
 36   //凡是该超类的子类都可以对Ext.Container及其子类进行布局定义;
 37   >.Ext.layout.ContainerLayout    //容器布局
 38     >.Ext.layout.AnchorLayout     //锚点布局
 39       >.Ext.layout.AbsoluteLayout //绝对定位布局
 40       >.Ext.layout.FormLayout     //表单布局
 41     >.Ext.layout.BorderLayout     //边框布局
 42     >.Ext.layout.ColumnLayout     //分列布局
 43     >.Ext.layout.FitLayout        //自适应布局
 44       >.Ext.layout.Accordion      //折叠布局
 45       >.Ext.layout.CardLayout     //卡片布局
 46     >.Ext.layout.TableLayout      //表格布局
 47 
 48 6.2 最简单的布局--FitLayout
 49   //自动适应页面大小
 50   Ext.onReady(function(){
 51     var store = new Ext.data.ArrayStore({
 52       fields:[‘id‘,‘name‘,‘desc‘],
 53       data:[[‘1‘,‘name1‘,‘desc1‘]]        //数据存储器;
 54     });
 55 
 56     var grid = new Ext.grid.GridPanel({   //创建带数据的表格;
 57       title:‘grid‘,
 58       viewConfig:{forceFit:true},
 59       store:store,
 60       columns:[
 61         {header:‘id‘,dataIndex:‘id‘},
 62         {header:‘名称‘,dataIndex:‘name‘},
 63         {header:‘描述‘,dataIndex:‘desc‘}
 64       ],
 65       tbar:new Ext.Toolbar([‘添加‘,‘修改‘,‘删除‘]),
 66       bbar:new Ext.PagingToolbar({
 67         pageSize:15,
 68         store:store
 69       })
 70     });
 71 
 72     var viewport = new Ext.Viewport({
 73       layout:‘fit‘,   //指向自适应布局;
 74       items:[grid]    //将表格引入布局;
 75     });
 76   });
 77 
 78 6.3 常用的边框布局--BorderLayout
 79   //FitLayout每次只能使用一个子组件;而现实中我们使用最多的是Ext.layout.BorderLayout布局;
 80   var viewport = new Ext.Viewport({
 81     layout:‘border‘,  //指向为BorderLayout布局;
 82     items:[
 83       {region:‘north‘,html:‘north‘,height:120}, //region:指定组件的位置;html:组件内容;
 84       {region:‘south‘,html:‘south‘,height:30},
 85       {region:‘west‘,html:‘west‘,width:40},
 86       {region:‘east‘,html:‘east‘,width:100},
 87       {region:‘center‘,html:‘center‘}       //center的大小是其他4个部分设置好之后计算出来的;不可以省略;
 88     ]
 89   });
 90 
 91 6.3.1 设置子区域的大小
 92   //可以直接设置north与south的高度和west与east的宽度;
 93 
 94 6.3.2 使用split并限制它的的范围
 95   //使用split参数,用户可以自行拖放来改变某一个区域的大小;
 96   //使用minSize和maxSize将限制用户拖放的范围;
 97   var viewport = new Ext.Viewport({
 98     layout:‘border‘,
 99     items:[
100       {region:‘north‘,html:‘north‘,split:true},         //顶部可以上下拖动改变大小;
101       {region:‘west‘,html:‘west‘,width:100,split:true,minSize:80,maxSize:120}, 
102       //左侧可以左右拖动改变大小; 但宽度的范围在80~120之间;
103       {region:‘center‘,html:‘center‘}
104     ]
105   });
106 
107 6.3.3 子区域的展开和折叠--collapsible
108   //属性collapsible:true;这个属性激活了区域折叠功能;
109   //title:‘west‘;折叠区域的标题;必须跟collapsible一起设置;
110   items:[
111     {region:‘north‘,html:‘north‘,heith:100,title:‘顶部‘,collapsible:true},
112     ...
113   ]
114 
115 6.4 制作伸缩菜单布局--Accordion(折叠布局)
116   //BorderLayout布局下嵌套的Accordion布局;
117   var viewport = new Ext.Viewport({
118     layout:‘border‘,        //第一层是BorderLayout布局;
119     items:[{
120       region:‘west‘,        //子组件左侧区域;
121       width:200,
122       layout:‘accordion‘,   //子组件是Accordion(折叠)布局;
123       split:true,
124       layoutConfig:{        //布局配置信息;
125         titleCollapse:true, //点击标题也可折叠;
126         animate:true,       //折叠动画;
127         activeOnTop:false   //打开的组件是否置顶;
128       },
129       items:[{              //孙组件;折叠布局;
130         title:‘第一栏‘,
131         html:‘第一栏‘
132       },{
133         title:‘第二栏‘,
134         html:‘第二栏‘
135       }]
136     },{
137       region:‘center‘,      //子组件center区域;
138       html:‘center区域‘
139     }]
140   });
141 
142 6.5 实现操作向导的布局--CardLayout
143   //为CardLayout配置几个子面板,每次只显示其中一个;
144   var viewport = new Ext.Viewport({
145     layout:‘border‘,
146     items:[{
147       region:‘west‘,
148       id:‘wizard‘,
149       width:200,
150       title:‘xx向导‘,
151       layout:‘card‘,
152       activeItem:0,
153       bodyStyle:‘padding:15px‘,
154       defaults:{
155         border:false
156       },
157       bbar:[{
158         id:‘move-prev‘,
159         text:‘上一步‘,
160         handler:function(){
161             navHandler(-1);
162         },
163         disabled:true
164       },‘->‘,{
165         id:‘move-next‘,
166         text:‘下一步‘,
167         handler:function(){
168             navHandler(1);
169         },
170       }],
171       items:[{
172         id:‘card-0‘,
173         html:‘<h1>欢迎使用向导</h1><p>1/3</p>‘
174       },{
175         id:‘card-1‘,
176         html:‘<p>2/3</p>‘
177       },{
178         id:‘card-2‘,
179         html:‘<p>完成</p>‘
180       }]
181     },{
182         region:‘center‘,
183         split:true,
184         border:true
185     }]
186   });
187   //设置navHandler函数  (带注释!)
188   var navHandler = function(direction){
189     var wizard = Ext.getCmp(‘wizard‘).layout;
190     var prev = Ext.getCmp(‘move-prev‘);
191     var next = Ext.getCmp(‘move-next‘);
192     var activedId = wizard.activeItem.id;
193     if(activeId == ‘card-0‘){
194       if(direction == 1){
195         wizard.setActiveItem(1);
196         prev.setDisabled(false);
197       }
198     }else if(activeId == ‘card-1‘){
199       if(direction == -1){
200         wizard.setActiveItem(0);
201         prev.setDisabled(true);
202       }else{
203         wizard.setActiveItem(2);
204         next.setDisabled(true);
205       }
206     }else if(activeId == ‘card-2‘){
207       if(direction == -1){
208         wizard.setActiveItem(1);
209         next.setDisabled(false);
210       }
211     }
212   };
213 
214 6.6 控制位置和大小的布局--AnchorLayout和AbsolluteLayout
215   //AnchorLayout提供了灵活的布局方式,既可以为items中的每个组件指定与总体布局大小的差值;也可以设置一个比例使子组件可以根据整体自行计算本身的大小;
216   >1.使用百分比进行配置
217   //设置某一个子组件占整体长和宽的百分比;
218   var viewport = new Ext.Viewport({
219     layout:‘anchor‘,        //设置接下来的子组件都为AnchorLayout布局;
220     items:[{
221       title:‘panel1‘,
222       html:‘panel1‘,
223       anchor:‘50% 50%‘      //panel1组件占总体宽度的50%和高度的50%;
224     },{
225       title:‘panel2‘,
226       html:‘panel2‘,
227       anchor:‘80%‘          //panel2组件占总体宽度的80%,高度自适应;
228     }]
229   });
230   >2.设置与右侧和底部的边距;
231   var viewport = new Ext.Viewport({
232     layout:‘anchor‘,
233     items:[{
234       title:‘panel1‘,
235       html:‘panel1‘,
236       anchor:‘-50 -200‘     //组件与右侧和底部的相对(绝对)距离;
237     },{
238       title:‘panel2‘,
239       html:‘panel2‘,
240       anchor:‘-100‘         //组件与右侧的距离;
241     }]
242   });
243   >3.side布局;
244   //在设置父组件和布局内部子组件都设置好width/height和anchorSize属性的前提下;AnchorLayout会记录布局整体与子组件在大小上的差值,为以后调整布局提供依据;
245   var viewport = new Ext.Viewport({
246     layout:‘anchor‘,
247     anchorSize:{width:400,height:300},
248     //这是一个包含宽度和高度信息的JSON对象;以此作为以后计算差值的基准;
249     items:[{
250       title:‘panel1‘,
251       html:‘panel1‘,
252       width:200,
253       height:100,
254       anchor:‘r b‘
255     },{
256       title:‘panel2‘,
257       html:‘panel2‘,
258       width:100,
259       height:200,
260       anchor:‘r b‘
261     }]
262   });
263   //AnchorLayout首先获得父组件的宽度/高度,以及每个子组件的宽度/高度,然后将子组件与父组件的宽度/高度之差分别保存起来;根据改变后父组件的大小,计算出子组件当前的宽度和高度;
264   >4.同时使用百分比和边距
265   var viewport = new Ext.Viewport({
266     layout:‘anchor‘,
267     items:[{
268       title:‘panel1‘,
269       html:‘panel1‘,
270       anchor:‘-100 40%‘     //组件距右侧100px不变,高度是整体的40%;
271     },{
272       title:‘panel2‘,
273       html:‘panel2‘,
274       anchor:‘-200 60%‘     //同上;
275     }]
276   });
277   >5.利用AbsoluteLayout进行绝对定位
278   //AbsoluteLayout是AnchorLayout的一个子类;继承了AnchorLayout的所有特性;
279   //AnchorLayout布局下的子组件都是自上而下竖直排列的;而AbsoluteLayout正是可以解决这个问题;
280   var viewport = new Ext.Viewport({
281     layout:‘absolute‘,      
282     //以下组件进行绝对定位;并使用AnchorLayout确定每个组件的相对大小;
283     items:[{
284       title:‘panel1‘,
285       html:‘panel1‘,
286       x:50,                 //子组件左上角距父组件的距离;
287       y:0,
288       anchor:‘-200 40%‘     //子组件相对于父组件的大小;
289     }]
290   });

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。