Hi!
As you can see, we can't use percentage width and height with border layout. If you want to do so, your just have to put this piece of code that overrides the actual ExtJS's BorderLayout. After that, you can set width like "width: '33%'".
Ext.override(Ext.layout.BorderLayout, {
onLayout : function(ct, target){
var collapsed;
var size = target.getViewSize(), w = size.width, h = size.height;
if(!this.rendered){
target.position();
target.addClass('x-border-layout-ct');
collapsed = [];
var items = ct.items.items;
for(var i = 0, len = items.length; i < len; i++) {
var c = items[i];
var pos = c.region;
if(c.collapsed){
collapsed.push(c);
}
c.collapsed = false;
var r = this[pos] = pos != 'center' && c.split ?
new Ext.layout.BorderLayout.SplitRegion(this, c.initialConfig, pos) :
new Ext.layout.BorderLayout.Region(this, c.initialConfig, pos);
if(pos == 'north' || pos == 'south'){
if(typeof c.height == 'string' && c.relHeight === undefined){
var p = c.height.match(/(\d+)%/);
if(p[1]){
c.relHeight = parseInt(p[1], 10) * .01;
}
}
if(c.relHeight !== undefined){
if(typeof c.relHeight != 'number'){
c.relHeight = parseFloat(c.relHeight);
}
c.height = h * c.relHeight;
}
r.minSize = r.minSize || r.minHeight;
r.maxSize = r.maxSize || r.maxHeight;
} else if(pos == 'east' || pos == 'west'){
if(typeof c.width == 'string' && c.relWidth === undefined){
var p = c.width.match(/(\d+)%/);
if(p[1]){
c.relWidth = parseInt(p[1], 10) * .01;
}
}
if(c.relWidth !== undefined){
if(typeof c.relWidth != 'number'){
c.relWidth = parseFloat(c.relWidth);
}
c.width = w * c.relWidth;
}
r.minSize = r.minSize || r.minWidth;
r.maxSize = r.maxSize || r.maxWidth;
}
if(!c.rendered){
c.cls = c.cls ? c.cls +' x-border-panel' : 'x-border-panel';
c.render(target, i);
}
r.render(target, c);
}
this.rendered = true;
}
if(w < 20 || h < 20){
if(collapsed){
this.restoreCollapsed = collapsed;
}
return;
}else if(this.restoreCollapsed){
collapsed = this.restoreCollapsed;
delete this.restoreCollapsed;
}
var centerW = w, centerH = h, centerY = 0, centerX = 0;
var n = this.north, s = this.south, west = this.west, e = this.east, c = this.center;
if(!c && Ext.layout.BorderLayout.WARN !== false){
throw 'No center region defined in BorderLayout ' + ct.id;
}
if(n && n.isVisible()){
var b = n.getSize();
var m = n.getMargins();
b.width = w - (m.left+m.right);
if(n.panel.relHeight !== undefined){
n.height = Math.round(h * n.panel.relHeight);
b.height = n.minSize && n.height < n.minSize ? n.minSize :
(n.maxSize && n.height > n.maxSize ? n.maxSize : n.height);
}
b.x = m.left;
b.y = m.top;
centerY = b.height + b.y + m.bottom;
centerH -= centerY;
n.applyLayout(b);
}
if(s && s.isVisible()){
var b = s.getSize();
var m = s.getMargins();
b.width = w - (m.left+m.right);
if(s.panel.relHeight !== undefined){
s.height = Math.round(h * s.panel.relHeight);
b.height = s.minSize && s.height < s.minSize ? s.minSize :
(s.maxSize && s.height > s.maxSize ? s.maxSize : s.height);
}
b.x = m.left;
var totalHeight = (b.height + m.top + m.bottom);
b.y = h - totalHeight + m.top;
centerH -= totalHeight;
s.applyLayout(b);
}
if(west && west.isVisible()){
var b = west.getSize();
var m = west.getMargins();
b.height = centerH - (m.top+m.bottom);
if(west.panel.relWidth !== undefined){
west.width = Math.round(w * west.panel.relWidth);
b.width = west.minSize && west.width < west.minSize ? west.minSize :
(west.maxSize && west.width > west.maxSize ? west.maxSize : west.width);
}
b.x = m.left;
b.y = centerY + m.top;
var totalWidth = (b.width + m.left + m.right);
centerX += totalWidth;
centerW -= totalWidth;
west.applyLayout(b);
}
if(e && e.isVisible()){
var b = e.getSize();
var m = e.getMargins();
b.height = centerH - (m.top+m.bottom);
if(e.panel.relWidth !== undefined){
e.width = Math.round(w * e.panel.relWidth);
b.width = e.minSize && e.width < e.minSize ? e.minSize :
(e.maxSize && e.width > e.maxSize ? e.maxSize : e.width);
}
var totalWidth = (b.width + m.left + m.right);
b.x = w - totalWidth + m.left;
b.y = centerY + m.top;
centerW -= totalWidth;
e.applyLayout(b);
}
if(c){
var m = c.getMargins();
var centerBox = {
x: centerX + m.left,
y: centerY + m.top,
width: centerW - (m.left+m.right),
height: centerH - (m.top+m.bottom)
};
c.applyLayout(centerBox);
}
if(collapsed){
for(var i = 0, len = collapsed.length; i < len; i++){
collapsed[i].collapse(false);
}
}
if(Ext.isIE && Ext.isStrict){
target.repaint();
}
}
});
Ext.override(Ext.layout.BorderLayout.SplitRegion, {
onSplitMove : function(split, newSize){
var s = this.panel.getSize();
this.lastSplitSize = newSize;
if(this.position == 'north' || this.position == 'south'){
this.panel.setSize(s.width, newSize);
if(this.panel.relHeight !== undefined){
this.state.relHeight = this.panel.relHeight *= newSize / this.height;
}else{
this.state.height = newSize;
}
}else{
this.panel.setSize(newSize, s.height);
if(this.panel.relWidth !== undefined){
this.state.relWidth = this.panel.relWidth *= newSize / this.width;
}else{
this.state.width = newSize;
}
}
this.layout.layout();
this.panel.saveState();
return false;
}
});
This patch has been taken from this post:
http://www.extjs.com/forum/showthread.php?p=287261#post287261
Thanks to Condor!