首页 > 代码库 > 深入浅出ExtJS 第六章 布局
深入浅出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 子区域的展开和折叠--collapsible108 //属性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 实现操作向导的布局--CardLayout143 //为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:false156 },157 bbar:[{158 id:‘move-prev‘,159 text:‘上一步‘,160 handler:function(){161 navHandler(-1);162 },163 disabled:true164 },‘->‘,{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:true185 }]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和AbsolluteLayout215 //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 });
深入浅出ExtJS 第六章 布局
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。