ExtJs Ext.panel.Panel和Ext.container.Viewport布局问题
- Ext.container.Viewport
- Ext.panel.Panel
Viewport 它的布局会占用整个 body,也应该是这样,它会随着浏览器的高度和宽度的变化而变化。
Panel 布局时需要提供一定的高度和宽度值,这个值是固定的,它不会随着浏览器的变化而变化。
接下来,我来演示下,这两者布局的差异,也是我在工作时遇到的问题然后解决之:
html:
<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<dynamic>" %> <!DOCTYPE html> <html> <head runat="server"> <meta name="viewport" content="width=device-width" /> <title>博客管理</title> <link href="../../Scripts/extjs/resources/css/ext-all-neptune.css" rel="stylesheet" type="text/css" /> <link href="../../Scripts/Lib/Manage/Manage.css" rel="stylesheet" type="text/css" /> <script src="../../Scripts/extjs/ext-all.js" type="text/javascript"></script> <script src="../../Scripts/extjs/ext-theme-neptune.js" type="text/javascript"></script> <script src="../../Scripts/extjs/locale/ext-lang-zh_CN.js" type="text/javascript"></script> <script src="../../Scripts/Lib/Manage/Manage.js" type="text/javascript"></script> </head> <body>
</body> </html>
Viewport:
Ext.onReady(function () { Viewport(); }); function Viewport() { var viewport = Ext.create("Ext.container.Viewport", { layout: { type: 'border', padding: '5', }, items: [{ region: 'north', height: 50, border: false, margin: '0,0,0,0', bodyStyle: { background: '#3992D4' }, html: '<div class="header"><div class="title">优尔博客后台管理</div><div class="user">欢迎你:张威,<a href="#">退出</a></div></div>' }, { region: 'west', title: '博客导航', width: 250, stateId: 'statePanelExample', stateful: true, split: true, collapsible: true, padding:'0', layout: 'accordion', items: [ { title: '功能管理', layout: 'fit', items: [{ xtype: 'treepanel', border: 0, rootVisible: false, root: { expanded: true, children: [ { id: '01', text: '文章管理', leaf: true, href: '#' }, { id: '02', text: '标签管理', leaf: true, href: '#' }, { id: '03', text: '用户管理', leaf: true, href: '#' } ] } }] }, { title: '博客设置', layout: 'fit', items: [{ xtype: 'treepanel', border: 0, rootVisible: false, root: { expanded: true, children: [ { id: '01', text: '标题设置', leaf: true, href: '#' }, { id: '02', text: '模板设置', leaf: true, href: '#' }, { id: '03', text: '联系方式', leaf: true, href: '#' } ] } }] }, { title: '通知设置', layout: 'fit', items: [{ xtype: 'treepanel', border: 0, rootVisible: false, root: { expanded: true, children: [ { id: '01', text: '通知设置', leaf: true, href: '#' } ] } }] },{ title: '系统菜单', layout: 'fit', items: [{ xtype: 'treepanel', border: 0, rootVisible: false, root: { expanded: true, children: [ { id: '01', text: '密码修改', leaf: true, href: '#' } ] } }] } ] }, { region: 'center', xtype: 'tabpanel', id: 'MainTabPanel', activeTab: 0, items: { title: '首页', html: '<h1>欢迎使用优尔博客1.0系统</h1>' } }, { region: 'south', collapsible: false, bodyStyle: { background: '#3992D4' }, html: '<div class="footer">© 合肥优尔电子科技有限公司 2014</div>', split: false, height: 22 }] }); }
通过F12工具分析可知,Viewport确实占用整个body,
现在我们来看看Panel:
<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<dynamic>" %>
<!DOCTYPE html>
<html>
<head runat="server">
<meta name="viewport" content="width=device-width" />
<title>博客管理</title>
<link href="../../Scripts/extjs/resources/css/ext-all-neptune.css" rel="stylesheet"
type="text/css" />
<link href="../../Scripts/Lib/Manage/Manage.css" rel="stylesheet" type="text/css" />
<script src="../../Scripts/extjs/ext-all.js" type="text/javascript"></script>
<script src="../../Scripts/extjs/ext-theme-neptune.js" type="text/javascript"></script>
<script src="../../Scripts/extjs/locale/ext-lang-zh_CN.js" type="text/javascript"></script>
<script src="../../Scripts/Lib/Manage/Manage.js" type="text/javascript"></script>
</head>
<body>
<div id="container"></div>
</body>
</html>
.title{
text-align: left;
color: white;
font-weight: bold;
font-size: 30px;
margin: 0;
padding: 0;
padding-top: 5px;
width: 85%;
height: 100%;
float: left;
}
.footer {
text-align: center;
color: white;
font-weight: bold;
padding-top: 5px;
}
.user {
float: left;
color: white;
width:15%;
height: 100%;
font-size: 14px;
padding-top: 15px;
font-weight: bold;
}
.user a
{
margin-left: 10px;
color: white;
}
#container {
width: 1170px;
margin: 0 auto;
}
Ext.onReady(function () { var panel= ExtPanel(); window.onresize = function() { panel.setHeight(document.documentElement.clientHeight); }; }); function ExtPanel() { var pandel = Ext.create("Ext.panel.Panel", { renderTo:'container', width:1170, height:document.documentElement.clientHeight, layout: { type: 'border', padding: '5', }, items: [{ region: 'north', height: 50, border: false, margin: '0,0,0,0', bodyStyle: { background: '#3992D4' }, html: '<div class="header"><div class="title">优尔博客后台管理</div><div class="user">欢迎你:张威,<a href="#">退出</a></div></div>' }, { region: 'west', title: '博客导航', width: 250, stateId: 'statePanelExample', stateful: true, split: true, collapsible: true, padding:'0', layout: 'accordion', items: [ { title: '功能管理', layout: 'fit', items: [{ xtype: 'treepanel', border: 0, rootVisible: false, root: { expanded: true, children: [ { id: '01', text: '文章管理', leaf: true, href: '#' }, { id: '02', text: '标签管理', leaf: true, href: '#' }, { id: '03', text: '用户管理', leaf: true, href: '#' } ] } }] }, { title: '博客设置', layout: 'fit', items: [{ xtype: 'treepanel', border: 0, rootVisible: false, root: { expanded: true, children: [ { id: '01', text: '标题设置', leaf: true, href: '#' }, { id: '02', text: '模板设置', leaf: true, href: '#' }, { id: '03', text: '联系方式', leaf: true, href: '#' } ] } }] }, { title: '通知设置', layout: 'fit', items: [{ xtype: 'treepanel', border: 0, rootVisible: false, root: { expanded: true, children: [ { id: '01', text: '通知设置', leaf: true, href: '#' } ] } }] },{ title: '系统菜单', layout: 'fit', items: [{ xtype: 'treepanel', border: 0, rootVisible: false, root: { expanded: true, children: [ { id: '01', text: '密码修改', leaf: true, href: '#' } ] } }] } ] }, { region: 'center', xtype: 'tabpanel', id: 'MainTabPanel', activeTab: 0, items: { title: '首页', html: '<h1>欢迎使用优尔博客1.0系统</h1>' } }, { region: 'south', collapsible: false, bodyStyle: { background: '#3992D4' }, html: '<div class="footer">© 合肥优尔电子科技有限公司 2014</div>', split: false, height: 22 }] }); return pandel; }
由此可知,利用renderTo将整个的panel放在container里,然后再设置container的width:1170px和margin:0 auto;就可以让它居中,
但是,是的,我说了但是,高度要有固定值,也就是说你设置panel的高度为:height:800,它就是800,这样设置好吗?
很显然这是行不通的,为什么?因为每个人的电脑显示器的屏幕显示率是有差异的,你这样设置成固定值,就有可能不是每台电脑都能正常显示,
有兴趣的可以自己试试。
不过这也是有解决方法的,就是利用“document.documentElement.clientHeight”来获取当前浏览器的可见区域显示高度,这样一来
就解决了刚才我们提到的问题。
不要高兴的太早,还有一个问题就是说,当你浏览器的宽度和高度变化时,因为你用“document.documentElement.clientHeight”
获取的高度也是个固定值,也就是说,它不是随着浏览器的变化而变化,这可不是我们想要的。
不过我们又有新的解决方法,这些方法都是有人在网上写好的,baidu一下就有可能搜到,不过 ,我把它串联起来,
这个代码是这样的:
var panel= ExtPanel();
window.onresize = function() {
panel.setHeight(document.documentElement.clientHeight);
};
利用window.onresize监听浏览器的变化,动态的设置Panel的高度,这样一来,所有问题全部解决!