ExtJS之布局篇

最近刚刚开始学习ExtJS,其中很重要的一部分就是布局,ExtJS中提供了几种布局,在这里总结一下。

所谓布局就是指容器组件中子元素的分布、排列组合方式。Ext的所有容器组件都支持布局操作,每一个容器都会有一个对应的布局,布局负责管理容器组件中子元素的排列、组合及渲染方式等。

ExtJS的布局基类为Ext.layout.ContainerLayout,其它布局都是继承该类。ExtJS的容器组件包含一个layoutlayoutConfig配置属性,这两个属性用来指定容器使用的布局及布局的详细配置信息,如果没有指定容器组件的layout则默认会使用ContainerLayout作为布局,该布局只是简单的把元素放到容器中,有的布局需要layoutConfig配置,有的则不需要layoutConfig配置。

Ext中的一些容器组件都已经指定所使用的布局,比如TabPanel使用card布局、FormPanel使用form布局,GridPanel中的表格使用column布局等,我们在使用这些组件的时候,不能给这些容器组件再指定另外的布局。

1.Ext.layout.ContainerLayout容器布局

提供容器作为布局的基础逻辑,通常会被扩展而不通过new 关键字直接创建,一般作为默认布局存在

2. Ext.layout.FitLayout自适应布局

使用layout:'fit'将使面板子元素自动充满容器,如果容器组件中有多个子元素,则只会显示一个元素,例:

       Ext.onReady(function(){

           new Ext.Panel({

               renderTo:"hello",

               title:"容器组件",

               layout:"fit",

               width:500,

               height:100,

               items:[{title:"子元素1",html:"这是子元素1中的内容"},

               {title:"子元素2",html:"这是子元素2中的内容"}]

          });

   });

显示结果如下:

如果不使用fit布局,代码如下:

Ext.onReady(function(){

   new Ext.Panel({

       renderTo:"hello",

       title:"容器组件",

       width:500,

       height:120,

       items:[{title:"子元素1",html:"这是子元素1中的内容"},

       {title:"子元素2",html:"这是子元素2中的内容"}]

  });

});

显示结果如下:



3.Ext.layout.AccordionLayout折叠布局 (常用)

扩展自适应布局,layout:'accordion'它包含了多个子面板,任何时候都只有一个子面板处于打开状态,每个面板都有展开和收缩的功能。

Ext.layout.Accordion折叠布局配置表:

activeOnTop            Boolean            是否保持展开子面板处于父面板顶端

animate                Boolean            是否在展开收缩时使用滑动方式

fill                   Boolean            设置子面板是否自动调整高度充满父面板剩余空间

hideCollapseTool      Boolean          设置是否隐藏子面板的展开收缩按钮,如设置truetitleCollapse也为true

titleCollapse          Boolean            设置是否允许单击子面板标题展开收缩面板

代码例:

Ext.onReady(function(){

   new Ext.Panel({

       renderTo:"hello",

       title:"容器组件",

       width:500,

       height:200,

       layout:"accordion",

       layoutConfig: {

       animate:true

       },

       items:[{title:"子元素1",html:"这是子元素1中的内容"},

       {title:"子元素2",html:"这是子元素2中的内容"},

       {title:"子元素3",html:"这是子元素3中的内容"}]

   });

});

显示如下:



点击每一个子元素的头部名称或右边的按钮,则会展开该面板,并收缩其它已经展开的面板,如下图:



 

4.Ext.layout.CardLayout卡片式布局 (常用)

扩展自适应布局,layout:'card'它包含了多个子面板,只有一个面板处于显示状态,可以满足安装向导、Tab选项板等应用中面板显示的需求。它用来制作向导或标签页,使用setActiveItem来激活面板。

Ext.layout.CardLayout方法:

setActiveItem(String/Numberitem):void      根据子面板id或索引切换当前显示的子面板

代码例:

Ext.onReady(function(){

   var panel=new Ext.Panel({

       renderTo:"hello",

       title:"容器组件",

       width:500,

       height:200,

       layout:"card",

       activeItem: 0,

       layoutConfig: {

           animate:true

       },

       items:[{title:"子元素1",html:"这是子元素1中的内容"},

           {title:"子元素2",html:"这是子元素2中的内容"},

           {title:"子元素3",html:"这是子元素3中的内容"}],

       buttons:[{text:"切换",handler:changeTab}]

   });

 

   var i=1;

   function changeTab()

   {

       panel.getLayout().setActiveItem(i++);

       if(i>2)i=0;

   }

});

显示结果如下:



点击一下“切换”按钮,结果如下图所示:



5. Ext.layout.AnchorLayout锚点布局

根据容器的大小为其所包含的子面板进行定位的布局layout:'anchor'  分为:百分比,偏移,参考边三种方式的定位。

主要配置项:

    anchorSize:父容器提供

    anchor:子容器提供

 

加入到使用anchor布局面板中的子面板都支持一个anchor配置项,它是一个包含两个值的字符串,水平值和垂直值。其有效值:

    百分比:100% 50%

         1项数值:表示子面板占父容器宽度的百分比

         2项数值:表示子面板占父容器高度的百分比

         如果只提供一个值则只对子面板的宽度生效,高度保持默认值。

 

    偏移量:-50 -100

         1项数值:表示子面板到父容器右边缘的偏移量

         2项数值:表示子面板到父容器下边缘的偏移量

         如果只提供一个值则只对子面板的宽度生效,高度保持默认值。

 

    参考边:r b

         要求容器设置固定的大小或提供相应的anchorSize配置项才会有正确的效果。

代码例:

Ext.onReady(function(){

   var panel=new Ext.Panel({  

       renderTo:"div2",  

       frame:true,  

       layout:"anchor",  

       title:"锚点布局(AnchorLayout",  

       height: 300,  

       width: 500,  

       autoScroll:true,  

       defaults: {  

           bodyStyle:"padding:3px;background-color: #FFFFFF" 

       },  

       items: [  

           {anchor:"50% 30%",title:"嵌套面板1", html:"嵌套面板1"},  

           {anchor:"-50 -150",title:"嵌套面板2", html:"嵌套面板2"},  

           {anchor:"r b", width: 300,height:100, title:"嵌套面板3", html:"嵌套面板3"}  

       ]  

   }); 

});

显示结果如下:



 

6.Ext.layout.AbsoluteLayout绝对位置布局

根据面板中配置x/y坐标进行定位,layout:'absolute'坐标值支持使用固定值和百分比两种形式。代码例:

Ext.onReady(function(){

       var win =new Ext.Window({

           title:"AbsoluteLayout",

           height: 400,

           width: 400,

           plain:true,

           x: 10,

           y:10,

           layout:'absolute',

           items: [

               new Ext.Panel({

                   title:"panel 1",

                   x:50,

                   y: 50,

                   width: 100,

                   height:100,

                   html:"Positioned atx:50,y:50",

                   frame:true

               }),

               new Ext.Panel({

                   title:"panel 2",

                   x: 125,

                   y: 125,

                   width: 100,

                   height: 100,

                   html:"Positioned atx:125,y:125",

                   frame:true

               })

           ]

 

       })

       win.show();

});

显示结果如下:



7. Ext.layout.FormLayout 表单布局(常用)

用来管理表单字段的显示,内制了表单布局,提供了表单提交,读取等表单功能,layout:'form'

Ext.layout.FormLayout配置表:

elementStyle         String          应用到每个布局中元素上的样式列(默认'')

labelStyle           String          应用到每个字段标签上的样式(默认'')

代码例:

Ext.onReady(function(){

   new Ext.Panel({

       renderTo:"hello",

       title:"容器组件",

       width:300,

       layout:"form",

       hideLabels:false,

       labelAlign:"right",

       height:120,

       defaultType:'textfield',

       items:[

           {fieldLabel:"请输入姓名",name:"name"},

           {fieldLabel:"请输入地址",name:"address"},

           {fieldLabel:"请输入电话",name:"tel"}]

   });

});

显示结果:



在实际应用中,Ext.form.FormPanel这个类默认布局使用的是Form布局,而且FormPanel还会创建与<form>标签相关的组件,因此一般情况下我们直接使用FormPanel即可。上面的例子可改写成如下的形式:

Ext.onReady(function(){

   new Ext.form.FormPanel({

       renderTo:"hello",

       title:"容器组件",

       width:300,

       labelAlign:"right",

       height:120,

       defaultType:'textfield',

       items:[

           {fieldLabel:"请输入姓名",name:"name"},

           {fieldLabel:"请输入地址",name:"address"},

           {fieldLabel:"请输入电话",name:"tel"}]

   });

});

显示结果同上。

8. Ext.layout.ColumnLayout列布局

 多列风格的布局格式,每一列的宽度都可以通过百分比和数值确定宽度,layout:'column'

列布局把整个容器组件看成一列,然后往里面放入子元素的时候,可以通过在子元素中指定使用columnWidthwidth来指定子元素所占的列宽度。columnWidth表示使用百分比的形式指定列宽度,而width则是使用绝对象素的方式指定列宽度,在实际应用中可以混合使用两种方式。代码例:

Ext.onReady(function(){

   new Ext.Panel({

       renderTo:"hello",

       title:"容器组件",

       layout:"column",

       width:500,

       height:100,

       items:[{title:"1",width:100},

           {title:"2",width:200},

           {title:"3",width:100},

           {title:"4"}]

   });

});

显示结果如下:



Items也可改为下列代码:

items:[{title:"1",columnWidth:.2},

   {title:"2",columnWidth:.3},

   {title:"3",columnWidth:.3},

{title:"4",columnWidth:.2}]

或:

items:[{title:"1",width:200},

   {title:"2",columnWidth:.3},

   {title:"3",columnWidth:.3},

   {title:"4",columnWidth:.4}]

结果如下:





9. Ext.layout.TableLayout表格布局

可以指定列数,跨行,跨列,可以创建出复杂的表格布局layout:'table'。使用Table布局,layoutConfig使用columns指定父容器分成3列,子元素中使用rowspancolspan来指定子元素所横跨的单元格数。代码例:

Ext.onReady(function(){

   var panel=new Ext.Panel({

   renderTo:"hello",

   title:"容器组件",

   width:500,

   height:200,

   layout:"table",

   layoutConfig: {columns: 3 },

   items:[{title:"子元素1",html:"这是子元素1中的内容",rowspan:2,height:100},

       {title:"子元素2",html:"这是子元素2中的内容",colspan:2},

       {title:"子元素3",html:"这是子元素3中的内容"},

       {title:"子元素4",html:"这是子元素4中的内容"}]

   });

});

显示结果如下:



10.Ext.layout.BorderLayout边框布局

该布局包含多个面板,是一个面向应用的UI风格的布局,它包含5个部分:east,south,west,north,center,layout:'border'通过region来配置面板。如果没有指定其中的某些部分,其相邻的部分就会扩散,占据其他没有指定的部分。需要注意的是,Border布局的中间部分必不可少。代码例:

Ext.onReady(function(){

   newExt.Viewport({

       layout:"border",

       items:[{

           region:"north",

           height:50,

           title:"顶部面板"

       },{region:"south",

           height:50,

           title:"底部面板"

       },{region:"center",

           title:"中央面板"

       },{region:"west",

           width:100,

           title:"左边面板"

       },{region:"east",

           width:100,

           title:"右边面板"

       }]

   });

});

 

显示结果如下:



总结:

简单总结起来border布局一般作为页面整体布局来使用;fit布局适用于那种需要将子类完全占满父类容器的情况;column布局用于多列;form是一种表单特有布局方式,实质是一行一控件的形式;table布局适用多行多列但是有时宽高不太容易控制。而且值得强调的一点就是给一个控件设置layout属性,其实指的是其内部控件的布局方式而不是它本身的布局,这点要搞清楚。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值