首页 > 代码库 > extjs布局(一)

extjs布局(一)

Ext常用的布局都在Ext.layout下,这里几乎涵盖了所有的布局方式,满足开发者需求。那么我们就其中常用的方式逐一介绍。

Border布局

Border布局是Ext中常用布局方式(经常用到整个页面的总体布局),感觉用的几率很大。在看代码之前先熟悉一种特殊的容器ViewPort,它是对于浏览器视窗的抽象,你可以将它理解为浏览器的可见区域,它将渲染到document.body并自动调整大小,一个页面只能创建一个Viewport。

var pnNorth=new Ext.Panel({
	id:‘pnNorth‘,
	autoWidth:true,
	heigth:80,
	frame:true,
	region:‘north‘,
	html:‘这里放置页头内容‘
});
var pnWest=new Ext.Panel({
	id:‘pnWest‘,
	title:‘菜单项‘,
	width:200,
	heigth:‘auto‘,
	split:true,//显示分隔条
	region:‘west‘,
	collapsible:true
	
});
var pnCenter=new Ext.TabPanel({
	region:‘center‘,
	activeTab:0,
	items:[
		{
			title:‘收件箱‘,
			authHeight:true,
			closable:true,//是否可关闭
			html:‘这里显示所收邮件。。。‘
		}
	]
});
var vp=new Ext.Viewport({
	layout:"border",
	items:[
		pnNorth,
		pnWest,
		pnCenter
	]
});


 

Column布局

从字面就知道Column布局就是列布局,例如我一个panel中还有两个子panel现在想要左侧显示一个右侧显示一个怎么办?这是可以选择Column将父Panel分为两列,左侧一个右侧一个。

var pnSub1=new Ext.Panel({
	height:300,
	columnWidth:.3,
	html:‘这是子panle1‘
});
var pnSub2=new Ext.Panel({
	height:300,
	columnWidth:.7,
	html:‘这是子panle2‘
});
var pn=new Ext.Panel({
	id:‘pn‘,
	title:‘父Panel‘,
	renderTo:‘divPanel‘,
	width:800,
	height:300,
	layout:‘column‘,
	items:[
		pnSub1,
		pnSub2
	]
});


 

Fit布局

如果从复杂度来说fit布局应该算是最简单的了,设置是最少的。Fit布局同样也是设置父容器的layout属性,但是子容器不用设置任何相应属性。它的目的就是为了让子容器能够自适应于父容器(用了fit布局子容器设置宽度无效),但是请注意如果父容器有多个子容器,只会显示第一个。

var pnSub1=new Ext.Panel({
	title:"子panel1",
	html:"子panel1(会显示)"
});
var pnSub2=new Ext.Panel({
	title:"子panel2",
	html:"子panel2(不会显示)"
});
var pn=new Ext.Panel({
	renderTo:"divPanel",
	title:"父panel",
	width:800,
	height:200,
	layout:"fit",
	items:[
		pnSub1,
		pnSub2
	]
});


 

Table布局

Table布局多数用在较为复杂的情况下,想一想做web开发总不能就上面几种简单情况吧,因此也就是说Table布局还是很常用的。当然,但是和其他布局相比其参数设置也稍微一些(不用怕,事实上还是很少的)。

new Ext.Panel({
	title:"父Panel",
	renderTo:"divPanel",					
	width:900,
	height:200,
	layout:"table",
	layoutConfig:{
		columns:3					
	},
	defaults:{
		height:100,
		width:300
	},
	items:[
		{
			html:"第一个子panel(行:1,列:1)",
			rowspan:2,//合并行
			height:200
		},
		{
			html:"第二个子panel(行:1,列:2)",
			colspan:2,//合并列
			width:600
		},
		{
			html:"第三个子panel(行:2,列:1)"
		},
		{
			html:"第四个子panel(行:2,列:2)"
		}
	]
});


 

Form布局

这个布局是专门为表单而设计的布局方式,当然多数是用在FormPanel中(它也是FormPanel默认的布局方式)。我们前面说过FormPanel但是没有涉及复杂布局,事实实际应用中更多的是较复杂的布局。

new Ext.Panel({
	renderTo:"divPanel",
	title:"这个是Panel",
	width:300,
	height:120,
	bodyStyle:‘padding:10‘,
	layout:"form",
	hideLabels:false,
	labelAlighn:"right",
	defaultType:"textfield",
	items:[
		{fieldLabel:"姓名",name:"name"},
		{fieldLabel:"年龄",name:"age"}
	]
});
new Ext.FormPanel({
	renderTo:"divPane2",
	title:"这个是FormPanel",
	width:300,
	height:120,
	bodyStyle:‘padding:10‘,
	layout:"form",
	hideLabels:false,
	labelAlighn:"right",
	defaultType:"textfield",
	items:[
		{fieldLabel:"姓名",name:"name"},
		{fieldLabel:"年龄",name:"age"}
	]
});


从代码我们也可看出来,区别就是对于Panel我们配置了layout为form,从这也能看出来说FormPanel默认的布局就是form布局,所以对于习惯于用Panel而不习惯用FormPanel的朋友尽管用Panel,但是一定要考虑好提交的问题,如果使用panel的话,要做提交可是要一个个获得控件的值的,而FromPanel则不需要。

Ext.onReady(function(){
	var pnRow1=new Ext.Panel({
		border:false,
		layout:‘column‘,
		items:[
			new Ext.Panel({
				columnWidth:.5,
				layout:‘form‘,
				border:false,
				labelWidth:40,
				labelAlign:‘right‘,
				items:[
					{
						xtype:‘textfield‘,
						fieldLabel:‘姓名‘,
						name:‘uname‘,
						anchor:‘95%‘
					}
				]
			}),
			new Ext.Panel({
				columnWidth:.3,
				layout:‘form‘,
				border:false,
				labelWidth:40,
				labelAlign:‘right‘,
				items:[
					{
						xtype:‘radio‘,
						fieldLabel:‘性别‘,
						boxLabel:‘男‘,
						name:‘sex‘,
						inputValue:‘男‘,
						checked:true,
						anchor:"95%"
					}
				]
			}),
			new Ext.Panel({
				columnWidth:.2,
				layout:‘form‘,
				border:false,
				labelWidth:1,
				items:[
					{
						xtype:‘radio‘,
						boxLabel:‘女‘,
						name:‘sex‘,
						inputValue:‘女‘,
						labelSeparator:‘‘,
						anchor:"95%"
					}
				]
			})
		]
	});
	var pnRow2=new Ext.Panel({
		layout:‘column‘,
		border:false,
		items:[
			new Ext.Panel({
				columnWidth:.5,
				layout:‘form‘,
				border:false,
				labelWidth:40,
				labelAlign:‘right‘,
				items:[
					{
						xtype:‘datefield‘,
						name:‘birthday‘,
						fieldLabel:‘生日‘,
						anchor:‘95%‘
					}
				]
			}),
			new Ext.Panel({
				columnWidth:.5,
				layout:‘form‘,
				border:false,
				labelWidth:40,
				labelAlign:‘right‘,
				items:[
					{
						xtype:‘combo‘,
						name:‘study‘,
						store:[‘专科‘,‘本科‘,‘硕士‘,‘博士‘],
						fieldLabel:‘学历‘,
						anchor:‘95%‘
					}
				]
			})
		]
	});
	var pnRow3=new Ext.Panel({
		layout:‘column‘,
		border:false,
		items:[
			new Ext.Panel({
				columnWidth:.3,
				layout:‘form‘,
				border:false,
				labelWidth:40,
				labelAlign:‘right‘,
				items:[
					{
						xtype:‘checkbox‘,
						name:‘hoby‘,
						inputValue:‘computer‘,
						fieldLabel:‘爱好‘,
						boxLabel:‘计算机‘,
						anchor:‘95%‘
					}
				]
			}),
			new Ext.Panel({
				columnWidth:.3,
				layout:‘form‘,
				border:false,
				labelWidth:1,
				labelAlign:‘right‘,
				items:[
					{
						xtype:‘checkbox‘,
						name:‘hoby‘,
						inputValue:‘football‘,
						boxLabel:‘足球‘,
						labelSeparator:‘‘,
						anchor:‘95%‘
					}
				]
			}),
			new Ext.Panel({
				columnWidth:.4,
				layout:‘form‘,
				border:false,
				labelWidth:1,
				labelAlign:‘right‘,
				items:[
					{
						xtype:‘checkbox‘,
						name:‘hoby‘,
						intputValue:‘tinyTable‘,
						boxLabel:‘乒乓球‘,
						labelSeparator:‘‘,
						anchor:‘95%‘
					}
				]
			})
		]
	});
	
	var pnRow4=new Ext.Panel({//当然这里直接在FormPanel中添加TextField就可以了,因为只有一行,但是为了一致以及对齐方便我这里还是放到了panel中
		layout:‘form‘,
		border:false,
		labelWidth:40,
		labelAlign:‘right‘,
		items:[
			{
				xtype:‘textfield‘,
				name:‘email‘,
				fieldLabel:‘住址‘,
				anchor:‘98%‘
			}
		]
	});
	var pnRow5=new Ext.Panel({
		layout:‘form‘,
		border:false,
		labelWidth:40,
		labelAlign:‘right‘,
		items:[
			{
				xtype:‘htmleditor‘,
				name:‘note‘,
				fieldLabel:‘备注‘,
				height:200,
				anchor:‘98%‘
			}
		]
	});
	
	new Ext.FormPanel({
		renderTo:"divPanel",
		title:"个人信息录入",
		width:600,
		bodyStyle:‘padding:10px‘,
		layout:"form",
		items:[
			pnRow1,
			pnRow2,
			pnRow3,
			pnRow4,
			pnRow5
		]
	});
});