牛骨文教育服务平台(让学习变的简单)
博文笔记

ExtJS面板与布局

创建时间:2015-12-05 投稿人: 浏览次数:2937

本例演示版为ext-4.2.1

面板(Panel)
        ExtJS不但在Web开发中成功引入了丰富的组件,也引入了桌面程序中常用到的面板和布局概念。这些概念的引入在很大程度上改变了传统的Web开发方式。
面板(panel)是ExtJS中一个很重要的概念,它相当于一幅画板,我们可以在它的上面放置需要的各种组件,并使用不同的布局类对组件的摆放位置进行格式化,掌握这些布局类的特点及使用方式是突波ExtJS页面设计的关键。我们可以在面板中随意地排版布局,面板在ExtJS中起着页面骨架的作用,所以学习面板是学习ExtJS页面布局的基础和起点。ExtJS面板共支持10中不同风格的布局样式,并且允许无限制的进行嵌套。
        Ext.panel.Panel扩展自Ext.container.Container,它可以应用布局(默认为Auto),也可以作为各种组件的容器,并且可以扩展出功能更加强大的面板。作为标准的面板组件主要包括如下5部分:底部工具栏(buttom toolbars)、顶部工具栏(top toolbars)、面板头部(header)、面板底部(footer)和面板体(body),面板组件还内置了折叠、展开和关闭功能。
Ext.panel.Panel示例

Ext.onReady(function(){
	// Ext.panel.Panel示例 标准面板的创建演示
	Ext.create("Ext.panel.Panel",{
		title:"面板顶部(header)",
		tbar:["顶部工具栏(top toolbars)"],
		bbar:["底端工具栏(bottom toolbars)"],
		height:200,
		width:300,
		frame:true,
		renderTo:Ext.getBody(),
		bodyPadding:5,
		bodyStyle:"background-color:#FFFFFF",
		html:"面板体(body)",
		tools:[
		       {id:"toggle"},
		       {id:"close"},
		       {id:"maximize"}
		],
		buttons:[{
			text:"面板底部(footer)"
		}]
	});
});

标准布局类
面板相当于一张干净的白纸,如果直接在上面添加内容,将很难控制面板中内容的显示位置,面板元素越多就显得越凌乱,所以需要在面板上划分不同的区域,将面板内容展示到希望的位置上。ExtJS通过提供多种布局类为面板提供支持,主要包括如下11种:
Auto(自动布局)
Fit(自适应布局)
Accordion(折叠布局)
Card(卡片式布局)
Anchor(锚点布局)
Absolute(绝对位置布局)
CheckboxGroup(复选框布局)
Column(列布局)
Table(表格布局)
Border(边框布局)
Box(盒布局)


Auto自动布局
        Ext.layout.container.Auto自动布局是容器在没有指定布局方式中默认采用的布局类型,它使用原始的HTML文件流来布局子元素,并把布局调用传递到子容器中,对应面板布局配置(layout)名称为Auto。
Auto(自动布局)示例

Ext.onReady(function(){
	//P136 Auto(自动布局)示例
	Ext.create("Ext.panel.Panel",{
		title:"Ext.layout.container.Auto布局示例",
		frame:true,//渲染面板
		width:300,
		renderTo:Ext.getBody(),
		bodyPadding:5,
		layout:"auto",//自动布局
		defaults:{//设置默认属性
			bodyStyle:"backgroud-color:#FFFFFF" //设置面板体的背景色
		},
		//面板items配置项默认的xtype类型panel,
		//该默认值可以通过defaultType配置项进行更改
		items:[{
			title:"嵌套面板一",
			html:"面板一"
		},{
			title:"嵌套面板二",
			html:"面板二"
		}]
		
	});
});


Fit自适应布局
Ext.layout.container.Fit是布局的基础类,对应面板布局配置项(layout)的名称为Fit,Fit布局将使唯一的子元素充满容器,如果在当前容器中存在多个子面板则只有第一个会被显示。
注:组件的xtype类型,xtype类型相当于组件的别名,通过使用xtype类型可以实现组件的延时创建。
Fit(自适应布局)示例

Ext.onReady(function(){
	Ext.create("Ext.panel.Panel",{
		layout:"fit",
		title:"Ext.layout.container.Fit布局示例",
		frame:true,//渲染面板
		height:150,
		width:250,
		renderTo:Ext.getBody(),
		defaults:{//设置默认属性
			bodyStyle:"background-color:#FFFFFF"//设置面板体的背景色
		},
		//面板items配置项默认的xtype类型为panel
		//该默认值可以通过defaultType配置项进行更改
		items:[{
			title:"嵌套面板一",
			html:"面板一"
		},{
			title:"嵌套面板二",
			html:"面板二"
		}]
	});
});

Accordion折叠布局
Ext.layout.container.Accordion折叠布局,对应面板布局(layout)配置项的名称为Accordion。该布局会包含多个子面板,任何时候都只有一个子面板处于打开状态,每一个子面板都内置了对展开和收缩功能的支持。
Accordion(折叠布局)示例

Ext.onReady(function(){
	// Accordion(折叠布局)示例
	Ext.create("Ext.panel.Panel",{
		layout:"accordion",
		title:"Ext.layout.container.Accordtion布局示例",
		frame:true,//渲染面板
		height:200,
		width:250,
		renderTo:Ext.getBody(),
		bodyPadding:5,
		defaults:{//设置默认属性
			bodyStyle:"background-color:#FFFFFF;padding:15px"//设置面板体的背景色
		},
		items:[{
			title:"嵌套面板一",
			html:"说明一"
		},{
			title:"嵌套面板二",
			html:"说明二"
		},{
			title:"嵌套面板三",
			html:"说明三"
		}]
	});
});


Card卡片式布局
        Ext.layout.container.Card对应面板布局(layout)配置项的名称为Card。该布局会包含多个子面板,任何时候都只有一个子面板处于显示状态,这种布局类经常来制作向导和标签页。该布局的重点方法是setActiveItem,因为一次只能显示一个子面板,所以切换子面板的唯一途径就是调用setActiveItem方法,它接受一个子面板id或索引作为参数。Card布局并没有提供一个子面板的导航机制,导航逻辑需要开发人员自己实现。
Card(卡片式布局)示例
Ext.onReady(function(){
	// Card(卡片式布局)示例
	var panel = Ext.create("Ext.panel.Panel",{
		layout:"card",
		activeItem:0,//设置默认显示第一个子面板
		title:"Ext.layout.container.CardLayout布局示例",
		frame:true,
		height:150,
		width:250,
		renderTo:Ext.getBody(),
		bodyPadding:5,
		defaults:{//设置默认属性
			bodyStyle:"background-color:#FFFFFF;padding:15px"
		},
		items:[{
			title:"嵌套面板一",
			html:"说明一",
			id:"p1"
		},{
			title:"嵌套面板二",
			html:"说明二",
			id:"p2"
		},{
			title:"嵌套面板三",
			html:"说明三",
			id:"p3"
		}],
		buttons:[{
			text:"上一页",
			handler:changePage
		},{
			text:"下一页",
			handler:changePage
		}]
	});
	
	//切换子面板
	function changePage(btn){
		var index = Number(panel.layout.activeItem.id.substring(1));
		if(btn.text == "上一页"){
			index -= 1;
			if(index<1){
				index = 1;
			}
		}else{
			index +=1;
			if(index>3){
				index=3;
			}
		}
		panel.layout.setActiveItem("p"+index);
	}
});

Anchor锚点布局
        Ext.layout.container.Anchor是根据容器大小为其所包含的子面板进行定位的布局,对应面板布局(layout)配置项的名称为Anchor。如果容器大小发生变化,所有子面板的位置都会根据规则重新计算,并自动渲染。使用Anchor布局需要注意配置项的使用。
•anchorSize(父容器提供)
Anchor布局提供了anchorSize配置型用来设置虚拟容器的大小,默认情况下Anchor布局是根据容器自身的大小来进行计算定位的,如果提供了anchorSize属性则Anchor布局就会根据该尺寸生成一个虚拟容器,然后根据这个虚拟容器的大小来进行计算定位。
•anchor(子容器提供)
加入到使用Anchor布局面板中的子面板也都支持一个anchor配置项,它是一个包含2个值的字符串,水平值和垂直值,例如:’100% 50%’,这个值告知父容器应该怎样为加入到其中的子面板进行定位,有效值包括如下3类。
■百分比(Percenge):1~100的任意百分比,第1项数值表示子面板占父容器宽度的百分比,第2项数值表示子面板占父容器高度的百分比,例如’100% 50%’表示,子面板宽度为父容器的100%,而高度为父容器的1/2,如果只提供一个值(如’50%’)则只对子面板的宽度生效,高度保持默认值。
■偏移量(Offsets):任意整数,可以为正数也可以为负数,第1项数值表示子面板到父容器右边缘的偏移量,第2项数值表示子面板到父容器下边缘的偏移量,例如’-50 -100’表示,子面板距父容器的右边缘偏移50像素,即子面板的宽度为父容器的宽度减去50像素;子面板距父容器的下边缘偏移100像素,即子面板高度为父容器的高度减去100像素。如果只提供一个值(如’-50’)则只对子面板的宽度生效,高度保持默认值。
■参考边(Sides):有效的值包括’right’(或’r’)和’bottom’(或’b’)。要求容器设置固定的大小或提供相应的anchorSize配置项才会有正确的效果,例如’r b’,说明父容器会计算与子容器宽度和高度的差值,然后按父容器体(body)的实际宽度和高度减去这个差值,重新为子面板定位。
以上3种赋值类型可以组合使用,例如’-50 75%’。
百分比(Percentage)定位
Ext.onReady(function(){
	//百分比(Percentage)定位示例
	Ext.create("Ext.panel.Panel",{
		layout:"anchor",
		title:"Ext.layout.container.Anchor布局示例",
		frame:false,//渲染面板
		height:150,
		width:300,
		renderTo:Ext.getBody(),
		defaults:{//设置默认属性
			bodyStyle:"background-color:#FFFFFF;padding:15px"//设置面板的背景色
		},
		items:[{
			anchor:"50% 50%",//设置子面板的宽高为父面板的50%
			title:"子面板"
		}]
	});
});

偏移值(Offsets)定位

Ext.onReady(function(){
	Ext.create("Ext.panel.Panel",{
		layout:"anchor",
		title:"Ext.layout.container.Anchor布局示例",
		frame:false,//渲染面板
		height:150,
		width:300,
		renderTo:Ext.getBody(),
		defaults:{//设置默认属性
			bodyStyle:"background-color:#FFFFFF;padding:15px"//设置面板的背景色
		},
		items:[{
			anchor:"-10 -10",//设置子面板的宽高偏移父面板10像素
			title:"子面板"
		}]
	});
	
});

参考边(Sides)定位

Ext.onReady(function(){
	Ext.create("Ext.panel.Panel",{
		layout:"anchor",
		title:"Ext.layout.container.Anchor布局示例",
		autoScroll:true,//自动显示滚动条
		frame:false,//渲染面板
		height:150,
		width:300,
		renderTo:Ext.getBody(),
		defaults:{//设置默认属性
			bodyStyle:"background-color:#FFFFFF;padding:15px"//设置面板的背景色
		},
		items:[{
			anchor:"r b",//相对于父容器的右边和底边的差值进行定位
			width:200,
			height:100,
			title:"子面板"
		}]
	});
});
Absolute绝对位置布局
Ext.layout.container.Absolute对应面板布局(layout)配置项的名称为Absolute。它可以根据子面板中配置的x/y坐标进行定位。
Absolute(绝对位置布局)示例

Ext.onReady(function(){
	//Absolute绝对位置布局示例
	Ext.create("Ext.panel.Panel",{
		layout:"absolute",
		title:"Ext.layout.container.Absolute布局示例",
		frame:false,//渲染面板
		height:150,
		width:300,
		renderTo:Ext.getBody(),
		defaults:{//设置默认属性
			frame:true,
			height:70,
			width:100,
			bodyStyle:"background-color:#FFFFFF;padding:15px"//设置面板体的背景色
		},
		items:[{
			x:10,//横坐标为距父容器左边缘90像素的位置
			y:10,//纵坐标为距父容器上边缘10像素的位置
			html:"子面板一",
			title:"子面板一"
		},{
			x:130,//横坐标为距父容器左边缘130像素的位置
			y:40,//纵坐标为距父容器上边缘40像素的位置
			html:"子面板二",
			title:"子面板二"
		}]
	});
});
CheckboxGroup复选框组布局
Ext.layout.container.CheckboxGroup复选框组布局,对应面板布局(layout)配置项的名称为CheckboxGroup。它实现了按列布局表单组件Ext.form.CheckboxGroup和Ext.form.RadioGroup的功能。


Column列布局
Ext.layout.container.Column对应面板布局(layout)配置项的名称为Column。这是一种多列风格的布局样式,每一列的宽度都可以根据百分比或固定值来进行设置,高度允许根据内容进行变化,它支持一个特殊的属性columnWidth,每一个加入到容器中的子面板都可以通过columnWidth配置项指定百分比或使用width配置项指定固定值,来确定列宽。
width配置项是以像素为单位的固定宽度,必须是大于或等于1的数字。columnWidth配置项是以百分比为单位的相对宽度,必须是大于0小于1的小数,例如“.25”。
注:所有列的columnWidth值相加必须等于1或者100%
指定固定宽度
Ext.onReady(function(){
	Ext.create("Ext.panel.Panel",{
		title:"Ext.layout.container.Column布局示例",
		layout:"column",
		frame:true,//渲染面板
		height:150,
		width:250,
		renderTo:Ext.getBody(),
		defaults:{//设置默认属性
			bodyStyle:"background-color:#FFFFFF",
			height:100,
			frame:true
		},
		items:[{
			title:"子面板一",
			width:100//指定列宽为100像素
		},{
			title:"子面板二",
			width:100//指定列宽为100像素
		}]
	});
});

使用百分比指定列宽

Ext.onReady(function(){
	Ext.create("Ext.panel.Panel",{
		title:"Ext.layout.container.Column布局示例",
		layout:"column",
		frame:true,//渲染面板
		height:150,
		width:250,
		renderTo:Ext.getBody(),
		defaults:{//设置默认属性
			bodyStyle:"background-color:#FFFFFF",
			height:100,
			frame:true
		},
		items:[{
			title:"子面板一",
			columnWidth:.3//指定列宽为容器宽度的30%
		},{
			title:"子面板二",
			columnWidth:.7//指定列宽为容器宽度的70%
		}]
	});
});

固定值与百分比结合使用

Ext.onReady(function(){
	Ext.create("Ext.panel.Panel",{
		title:"Ext.layout.container.Column布局示例",
		layout:"column",
		frame:true,//渲染面板
		height:150,
		width:350,
		renderTo:Ext.getBody(),
		defaults:{//设置默认属性
			bodyStyle:"background-color:#FFFFFF",
			height:100,
			frame:true
		},
		items:[{
			title:"子面板一",
			width:100//指定列宽为100像素
		},{
			title:"子面板二",
			columnWidth:.3//指定列宽为容器宽度的70%
		},{
			title:"子面板三",
			columnWidth:.7//指定列宽为容器宽度的70%
		}]
	});
});

Table表格布局
Ext.layout.container.Table对应面板布局(layout)配置项的名称为Table。这种布局允许你非常容易地渲染内容到HTML表格中,可以指定列数(columns),跨行(rowspan),跨列(colspan),可以创建出复杂的表格布局。
注:必须使用配置对象来配置此布局而不能只使用字符串,table布局有columns和tableAttrs两个配置项,其子面板会具有rowspan和colspan两个配置项。


Table(表格布局)示例
Ext.onReady(function(){
	Ext.create("Ext.panel.Panel",{
		title:"Ext.layout.container.Table布局示例",
		layout:{
			type:"table",//表格布局
			columns:4//设置表格布局默认列数为4列
		},
		frame:true,//渲染面板
		height:250,
		width:450,
		renderTo:Ext.getBody(),
		defaults:{//设置默认属性
			bodyStyle:"background-color:#FFFFFF;",//设置面板体的背景色
			frame:true,
			width:70,
			height:70
		},
		items:[{
			title:"子面板一",
			width:210,
			colspan:3 //设置跨列
		},{
			title:"子面板二",
			rowspan:2,
			height:140
		},
		{title:"子面板三"},
		{title:"子面板四"},
		{title:"子面板五"}]
	});
});

Border边框布局
Ext.layout.container.Border对应面板布局(layout)配置项的名称为Border。该布局包含多个子面板,是一个面向应用的UI风格的布局,它将整个容器分为5个部分,分别是:east(东)、south(南)、west(北)、center(中)。加入到容器中的子面板需要指定region配置型来告知容器需要加入到那个部分,并且该布局还内建了对面板分隔栏的支持。
关于border布局有以下几点需要说明:
□任何使用border布局的容器都必须有一个子元素配置为region:’center’占据中心位置,该子元素会填充布局的剩余空间。
□任何占据west或者east位置的子元素都必须指定初始化宽度、flex值或者百分比字符串,center的flex值为1。
□任何占据north或south位置的子元素都必须指定初始化高度、flex值或者百分比字符串,center的flex值为1。
□Border布局在渲染完毕后不允许动态增加或删除子元素,如果需要必须通过附加的包装容器来操作。
Border(边框布局)示例

Ext.onReady(function(){
	Ext.create("Ext.panel.Panel",{
		title:"Ext.layout.container.Border布局示例",
		layout:"border",//边框布局
		height:250,
		width:400,
		frame:true,
		renderTo:Ext.getBody(),
		defaults:{//设置默认属性
			collapsible:true
		},
		items:[{
			title:"north Panel",
			html:"上边",
			region:"north",//指定子面板所在区域为north
			height:50
		},{
			title:"south Panel",
			html:"下边",
			region:"south",//指定子面板所在区域为south
			height:50
		},{
			title:"west Panel",
			html:"左边",
			region:"west",//指定子面板所在区域为west
			width:100
		},{
			title:"east Panel",
			html:"右边",
			region:"east",//指定子面板所在区域为east
			width:100
		},{
			title:"main Content",
			html:"中间",
			region:"center"//指定子面板所在区域为center
		}]
	});
});

Box盒布局
Ext.layout.container.Box盒布局又分为HBoxLayout(水平盒布局)和VBoxLayout(垂直盒布局)两个子类,该布局通过子元素的flex配置项来划分父容器的空间。
HBox(水平布局)示例

Ext.onReady(function(){
	Ext.create("Ext.panel.Panel",{
		title:"Ext.layout.container.HBox布局示例",
		layout:{
			type:"hbox",//水平盒布局
			align:"stretch"//子面板高度充满父容器
		},
		height:150,
		width:300,
		frame:true,
		renderTo:Ext.getBody(),
		items:[{
			title:"子面板一",
			flex:1,
			html:"1/4宽(flex=1)"
		},{
			title:"子面板二",
			flex:1,
			html:"1/4宽(flex=1)"
		},{
			title:"子面板三",
			flex:2,
			html:"1/2宽(flex=2)"
		}]
	})
});

三个子面板水平依次排开,Flex值的和为4,因此第一个面板flex值为1占总宽度的1/4,第三个子面板的flex值为2占总宽度的1/2,VBox的使用方式与HBox的相同。


ViewPort的使用
Ext.container.Viewport代表浏览器窗口的整个显示区域,将document body作为渲染对象,它会根据浏览器窗口的大小自动调整自身的尺寸,在一个页面中只允许出现一个ViewPort实例,此外它没有提供对滚动条的支持,如果需要使用滚动条应该在其子面板中进行设置。
ViewPort使用示例

Ext.onReady(function(){
	Ext.create("Ext.container.Viewport",{
		layout:"border",//表格布局
		items:[{
			title:"North Panel",
			html:"上边",
			region:"north",//指定子面板所在区域为north
			height:100
		},{
			title:"West Panel",
			html:"左边",
			region:"west",//指定子面板所在区域为west
			width:150
		},{
			title:"Main Panel",
			html:"中间",
			region:"center"//指定子面板所在区域为center
		}]
	});
});


声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。