1. 程式人生 > >ExtJS常用佈局詳解

ExtJS常用佈局詳解

ExtJS的容器元件都可以通過設定layout引數來選擇佈局改變顯示風格,

它的有效值有:

absolute:控制位置,accordion:手風琴佈局,anchor:控制大小,border:邊界式佈局,card:卡片佈局,column:列布局,fit:填充式佈局,form:表單佈局,table:表格式佈局

 一共9種,在這裡簡單總結一下


absolute:Absolute佈局的目的是為了擴展布局的屬性,使得佈局更容易使用

accordion:accordion佈局也稱手風琴佈局,在accordion佈局下,在任何時間裡,只有一個面板處於啟用狀態。其中每個面板都支援展開和摺疊。注意:只有Ext.Panels和所有Ext.panel.Panel子項,才可以使用accordion佈局。


Ext.onReady(function(){
     var viewport = new Ext.Viewport({
        layout:'border',
        items:[{
            region: 'west',
            width: 200,
            layout: 'accordion',
            layoutConfig: {
                titleCollapse: true, 
                animate: true, //是否使用動畫效果
                activeOnTop: false
            },
            items: [{
                title: '我的好友', //必須加上title引數,accordion佈局中沒有提供預設標題,不加一定會出錯
                html: '我的好友'
            },{
                title: '陌生人',
                html: '陌生人'
            },{
                title: '黑名單',
                html: '黑名單'
            }]
        },{
            region: 'center',
            split: true,
            border: true
        }]
    });
});
anchor:Anchor佈局將使元件固定於父容器的某一位置,試用Anchor佈局的子元件尺寸相對於容器的尺寸,即父容器的大小發生變化時,試用Anchor佈局的元件會根據規定重新渲染位置和大小。

AnchorLayout佈局沒有任何的直接配置選項(繼承的除外),然而在使用AnchorLayout佈局時,其子元件都有一個anchor屬性,用來配置此元件在父容器中所處的位置。

anchor屬性為一組字串,可以使用百分比或者是數字來表示。配置字串使用空格隔開。

 Ext.OnReady(function() {
        var panel1 = new Ext.Panel({
            title: "panel1",
            height: 100,
            anchor: '-50',
            html: "高度等於100,寬度=容器寬度-50"
        });

        var panel2 = new Ext.Panel({
            title: "panel2",
            height: 100,
            anchor: '50%',
            html: "高度等於100,寬度=容器寬度的50%"

        });

        var panel3 = new Ext.Panel({
            title: "panel3",
            anchor: '-10, -250',
            html: "寬度=容器寬度-10,高度=容器寬度-250"

        });

        var win = new Ext.Window({
            title: "Anchor Layout",
            height: 400,
            width: 400,
            plain: true,                    
            layout: 'anchor',
            items: [panel1, panel2,panel3]            
        });

        win.show();

    });


border:邊框佈局,他將整個區域分成了東、西、南、北、中五個部分,除了中間部分以外,其他部分都是可以省略的,

Border佈局也稱邊界佈局,他將頁面分隔為west,east,south,north,center這五個部分,我們需要在其items中指定試用region引數為其子元素指定具體位置。注意:north和south部分只能設定高度(height),west和east部分只能設定寬度(width)。north south west east區域變大,center區域就變小了。

引數 split:true 可以調整除了center四個區域的大小。

引數 collapsible:true 將啟用摺疊功能,title必須設定,因為摺疊按鈕是出現標題部分的。

center 區域是必須使用的,而且center區域不允許摺疊。center區域會自動填充其他區域的剩餘空間。尤其在ExtJS4.0中,當制定佈局為border時,沒有指定center區域時,會出現報錯資訊。


Ext.onReady(function(){
    var viewport = new Ext.Viewport({
        layout: 'border',
        items: [
            {region:'north',title:"north",height:100},
            {region:'south',title:'south',height:100},
            {region:'east',title:'east',width:100},
            {region:'west',title:'west',width:100},
            {region:'center',title:'center'}
        ]
    });
});

card:卡片佈局,類似於卡片一樣一張張顯示,可以用來實現“嚮導”效果,注意:由於此佈局本身不提供分佈導航功能,所以需要用自己開發該功能。由於只有一個面板處於顯示狀態,那麼在初始時,我們可以試用getNext()或getPrev()來得到下一個或上一個面板。然後使用setDisabled方法來設定面板的顯示。
Ext.onReady(function(){

    var navHandler = function(direction){

        var wizard = Ext.getCmp('wizard').layout;
        var prev = Ext.getCmp('move-prev');
        var next = Ext.getCmp('move-next');
		//當前顯示子面板是靠activeItem來控制的
        var activeId = wizard.activeItem.id;
		
        if (activeId == 'card-0') { //顯示索引為0的子面板
            if (direction == 1) {
                wizard.setActiveItem(1);
                prev.setDisabled(false);
            }
        } else if (activeId == 'card-1') {
            if (direction == -1) {
                wizard.setActiveItem(0);
                prev.setDisabled(true);
            } else {
                wizard.setActiveItem(2);
                next.setDisabled(true);
            }
        } else if (activeId == 'card-2') {
            if (direction == -1) {
                wizard.setActiveItem(1);
                next.setDisabled(false);
            }
        }
    };

    var viewport = new Ext.Viewport({
        layout:'border',
        items:[{
            region: 'west',
            id: 'wizard',
            width: 200,
            title: '某某嚮導',
            layout:'card',
            activeItem: 0,
            bodyStyle: 'padding:15px',
            defaults: {
                border:false
            },
            bbar: [{
                id: 'move-prev',
                text: '上一步',
                handler: navHandler.createDelegate(this, [-1]),
                disabled: true
            }, '->',{
                id: 'move-next',
                text: '下一步',
                handler: navHandler.createDelegate(this, [1])
            }],
            items: [{
                id: 'card-0',
                html: '<p>第一步,一共三步</p>'
            },{
                id: 'card-1',
                html: '<p>第二步,一共三步</p>'
            },{
                id: 'card-2',
                html: '<p>第三步,一共三步,最後一步了。</p>'
            }]
        },{
            region: 'center',
            split: true,
            border: true
        }]
    });

});

column:列布局,這種佈局的目的是為了建立一個多列的格式。其中每列的寬度,可以為其指定一個百分比或者是一個固定的寬度。column佈局沒有直接的配置選項(繼承的除外),但column佈局支援一個columnWidth屬性,在佈局過程中,試用columnWidth指定每個面板的寬度。
Ext.onReady(function(){

    var viewport = new Ext.Viewport({
        layout:'column',
        items: [{
            title: 'Column 1',
            columnWidth: .25 //注意items中每個子元件的columnWidth引數為0~1之間的一個小數,標識每個子元件在整體中所佔的百分比,總和為1
        },{
            title: 'Column 2',
            columnWidth: .4
        },{
            title: 'Column 3',
            columnWidth: .35
        }]
    });

});

fit:填充式佈局,在Fit佈局中,子元素將自動填滿整個父容器。注意:在fit佈局下,對其子元素設定寬度是無效的。如果在fit佈局中放置了多個元件,則只會顯示第一個子元素。典型的案例就是當客戶要求一個window或panel中放置一個grid元件,grid元件的大小會隨著父容器的大小改變而改變。
Ext.onReady(function(){
    new Ext.Panel({
        title:"父容器",
		width:300,
		height:300,
		layout: 'fit',
		renderTo:Ext.getBody(),
        items: [{title:"子元件"}]//注意這裡只需要一個物件
    });
});

form:表單佈局,這個比較簡單,可以認為是元件都是一行一個
Ext.onReady(function(){
    var viewport = new Ext.Panel({
            layout: 'form',
            title: '資訊',
			width:300,
			autoHeight:true,
			renderTo:Ext.getBody(),
            labelAlign: 'right',
            labelWidth: 50,//設定子元件的fieldLabel的寬度
            items: [{
				xtype:"textfield",
                fieldLabel: '名稱',
                name: 'name',
                anchor: '90%'
            }, {
				xtype:"datefield",
                fieldLabel: '生日',
                name: 'birthday',
                xtype: 'datefield',
                anchor: '90%'
            },{
                fieldLabel: '備註',
                name: 'desc',
                xtype: 'textarea',
                anchor: '90%'
            }]
      });
});

table:表格式佈局
Ext.onReady(function(){

    var viewport = new Ext.Viewport({
        layout:'fit',
        items:[{
            title: 'Table Layout',
            layout:'table',
            defaults: {
                bodyStyle:'padding:20px'
            },
            layoutConfig: {
                columns: 3 //設定列
            },
            items: [{
                html: '<p>Cell A content</p>',
                rowspan: 2 //單元格跨兩行
            },{
                html: '<p>Cell B content</p>',
                colspan: 2 
            },{
                html: '<p>Cell C content</p>'
            },{
                html: '<p>Cell D content</p>'
            },{
                html: '<p>Cell E content</p>'
            },{
                html: '<p>Cell F content</p>'
            },{
                html: '<p>Cell G content</p>'
            }]
        }]
    });

});