Ext Js简单容器常用布局的创建使用

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介:

Ext Js简单容器常用布局的创建使用

在布局页面的时候,对于Ext Js提供了几种常用的布局方式,在一个容器中使用适当的布局方式进行适当的布局,对于继承自Ext.Container类的容器都可以使用这些布局,可以有很不错的效果。在上篇文章对于面板Panel的扩展练习Viewport容器中,使用了border和accordion两种布局方式结合做的效果。
通过设置容器的layout配置指定布局方式,常用布局方式:FitLayout(自适应)\BorderLayout(边界式)\CardLayout(卡片式)\Accordion(手风琴式)\TableLayout(表格式)\ColumnLayout(列式)\AnchorLayout(锚定)\FormLayout(表单式)

1.FitLayout(自适应):对于只包含了一个组件的容器,这种布局使得内部组件撑满容器。这个布局没有配置选项。如果容器中有多个组件,所有的组件的尺寸都会设为相同,这一般来说都不是我们期望的行为,所以在fit布局的容器中,只能放一个子组件。

复制代码
//创建fitLayOut布局
function fitLayout() {
    var myFitLayout = new Ext.Panel({
        title: "Fit Layout",
        layout: "fit",
        width: 300,
        height: 300,
        style: {
            width: '95%',
            marginBottom: '10px',
            color: "red",
            background: "blue"
        },
        items: [
                {
                    title: 'InnerPanelOne',
                    style: { background: "yellow", height: "100px" },
                    html: '<p>The Inner Panel ContentOne</p>',
                    border: true
                },
                {
                    title: "InnerPanelTwo",
                    style: { background: "Orange" },
                    html: "<p>The Inner Panel ContentTwo</p>",
                    border: true
                }
                ]
    });
    myFitLayout.render(Ext.getBody());
}
复制代码

2.BorderLayout(边界式):这是一种多窗口,面向应用的UI布局样式。支持多层嵌套面板,块于块之间自动的分界,支持某块区域的展开和缩起。通过border关键字来指定或者扩展,一般不用new关键字来创建。此布局内的空间被分为东南西北中五个区域。设定split属性为true,可以使某块区域能被resize。所有使用这种布局的容器,至少要指定一个子元素,来占据“中间”区域center。中间区域的子组件总是会撑满容器没有被设定的剩下区域。西侧或者东侧的子组件可以指定初始宽度,或者通过flex属性来指定宽度占比。同理,南北两侧的可以指定高度。可以用collapsible设定是否可以折叠。

复制代码
function borderLayOut() {
    var myBorderLayout = new Ext.Panel({
        renderTo: document.body, width: 800, height: 600, title: "Border Layout", layout: "border",
        style: { marginTop: "10px", marginLeft: "50px", background: "Red" },
        items: [
                { title: "Border East", region: "east", width: 150, split: true, collapsible: true, layout: "fit",
                    style: { background: "Orange" }, html: "<h1>East模块!</h1>"
                },
                { title: "Border West", region: "west", width: 150, split: true, collapsible: true, layout: "fit",
                    style: { background: "Purple" }, html: "<h1>West模块<h1>"
                },
                { title: "Border South", region: "south", height: 80, split: true, minSize: 75, maxSize: 150,
                    style: { color: "Blue" }, html: "<h1>South模块</h1>"
                },
                { title: "Border North", region: "north", height: 100, split: true, minSize: 75, maxSize: 150,
                    style: { color: "Orange" }, html: "<h1>North模块</h1>"
                },
                { title: "Border Center", region: "center", layout: "fit",
                    style: { color: "orange" }, html: "<h1>Center模块,信息提示!</h1>"
                }
                ]
    });
}
复制代码

3.CardLayout(卡片式):这种布局形式,将容器内部子组件都撑满到容器的大小叠放,所以一次只能显示位于最上面的那个组件。这个布局方式,通常用来创建应用的向导程序。这种布局有个方法setActiveItem来决定显示哪个组件,参数是id或者下标。布局本身不提供UI来实现内部组件的导航,所以开发向导的时候,要自己开发导航按钮。

复制代码
function cardLayOut() {
    var cardLayout = new Ext.Panel({
        title: "CardLayOut-Wizard", renderTo: Ext.getBody(),
        bodyStyle: "padding:15px", width: 300, defaults: { border: false }, //border应用于每个面板上
        layout: "card", activeItem: 0,
        bbar: [
                { id: "move-prev", text: "上一步", disabled: true,
                    handler: function () {
                        var id = cardLayout.layout.activeItem.id;
                        Ext.getCmp("move-next").setDisabled(false);
                        var tempArray = id.split('-');
                        if (tempArray[1] == 1) {
                            this.setDisabled(true);
                        }
                        var newID;
                        if (tempArray[1] != 0) {
                            newID = tempArray[0] + "-" + (parseInt(tempArray[1]) - 1);
                        }
                        cardLayout.layout.setActiveItem(newID);
                    }
                },
                "->", //贪婪分隔符,这样按钮就被对齐到边界处
                {
                id: "move-next", text: "下一步",
                handler: function () {
                    var id = cardLayout.layout.activeItem.id;
                    Ext.getCmp("move-prev").setDisabled(false);
                    var tempArray = id.split('-');
                    if (tempArray[1] == 1) {
                        this.setDisabled(true);

                    }

                    var newID;
                    if (tempArray[1] != 2) {
                        newID = tempArray[0] + "-" + (parseInt(tempArray[1]) + 1);
                    }
                    cardLayout.layout.setActiveItem(newID);
                }
            }
                ],
        items: [
            { id: "card-0", html: "<h1>Welcome To The Wizard!</h1><p>Step 1 Of 3</p>" },
            { id: "card-1", html: "<h1>Welcome To The Wizard!</h1><p>Step 2 Of 3</p>" },
            { id: "card-2", html: "<h1>Welcome To The Wizard!</h1><p>Step 3 Of 3</p>" }
            ]
    });
}
复制代码

4.Accordion(手风琴式):实现了一种让许多面板在垂直方向上可以折叠展开的布局方式。任意时刻,只能展开一个面板。折叠和展开的行为都是自动支持的,不需要额外的编程。只有Panel和Panel的子类才能用于使用了Accordion布局的容器内部子组件。

复制代码
function accordinLayOut() {
    var accordionLayout = new Ext.Panel({
        title: "Accordion Layout", layout: "accordion", width: 260, height: 500, renderTo: Ext.getBody(),
        style: { marginTop: "10px", marginLeft: "100px" },
        defaults: { bodyStyle: { pandding: "15px", color: "Red", background: "Purple" }, border: false }, //应用每一个Panel
        layoutConfig: { titleCollapse: true, animate: true, activeTop: true }, //布局的相关配置
        items: [
                { title: "Panel One", html: "<p>我是Panel One!</p>" },
                { title: "Panel Two", html: "<p>我是Panel Two!</p>" },
                { title: "Panel Three", html: "<p>我是Panel Three!</p>" }
                ]
    });
}
复制代码

5.TableLayout(表格式):使界面按照HTML的table的形式来进行布局,可以指定总的列数,然后配合colspan和rowspan来生成复杂的表格结构。这个布局背后的思想就是一个table元素,所以,所有的注意点都跟table的注意点一样。该布局只需要指定列数column,然后会将其内子元素按照从左到右,从上到下的顺序排布在界面上。

复制代码
function tableLayOut() {
    var tableLayout = new Ext.Panel({
        title: "Table LayOut", renderTo: Ext.getBody(), width: 500, height: 300, layout: "table",
        defaults: { bodyStyle: { padding: "20px"} }, layoutConfig: { columns: 3 },
        items: [
                { title: "Cell A", html: "<p>Cell A Content</p>", rowspan: 2, width: 100, height: 300, style: { color: "red" }, bodyStyle: { background: "purple", height: "100px"} },
                { title: "Cell B", html: "<p>Cell B Content</p>", colspan: 2 },
                { title: "Cell C", html: "<p>Cell C Content</p>", cellCls: "highlight" },
                { title: "Cell D", html: "<p>Cell D Content</p>" }
                ]
    });
}
复制代码

6.ColumnLayout(列式):对容器进行分栏布局,分栏的宽度可以用百分比,也可以用固定宽度。分栏的高度是可以根据内容来指定的。此布局本身没有什么配置选项,但是位于此布局中的面板,可以使用columnWidth属性来指定分栏宽度。在指定宽度的时候width属性和columnWidth属性都是有效的,width的值必须是大于1的整数,columnWidth的值是百分比,取值范围是0到1的左开右闭区间。
在渲染布局的时候,外层容器首先遍历内部宽度固定的面板,然后算出剩余没有分配的宽度,然后按照columnWidth所指定的百分比,分给其他面板。所以,此布局中所有使用columnWidht指定宽度的面板的columnWidth值之和必须是1,否则该布局的行为不可预期。

复制代码
function columnLayOut() {
    var columnLayout = new Ext.Panel({
        title: "Column Layout-Mixed", width: 800, heiht: 300, renderTo: Ext.getBody(), layout: "column",
        items: [
                    { title: "Column One", width: 200, html: "Column One Content " },
                    { title: "Column Two", columnWidth: .8, html: "Column Two Content" }, //百分比 0.8
                    {title: "Column Three", columnWidth: .2, html: "Column Three Content " }
                ]
    });
}
复制代码

7.AnchorLayout(锚定):使包含的元素相对于容器的尺寸发生变化。如果容器被resize,那么内部包含的元素就会根据指定的规则来自动重绘。这种布局一般不使用new来创建,也没有直接的配置选项。此种布局没有任何直接的配置选项。缺省情况下,AnchorLayout基于应用容器的尺寸来计算锚定规则。使用AnchorLayout的容器,可以通过anchorSize属性来设定可供内含组建计算尺寸用的虚拟容器。

复制代码
function anchorLayOut() {
    var anchorLayout = new Ext.Panel({
        title: "锚点布局", width: 500, height: 300, frame: true, autoScroll: true, layout: "anchor", renderTo: Ext.getBody(),
        defaults: { bodyStyle: 'background-color:Purple;padding:0px' }, style: { marginLeft: "100px" },
        items: [
        // { anchor: "30% 30%", title: "Panel One", html: "百分比(Percentage定位)", frame: true }, //百分比定位
                {anchor: "-30 0", title: "Panel Two", html: "偏移量(Offsets)定位", frame: true}  //偏移量定位
        //{anchor: "r b", title: "Panel Three", html: "参考边(side)定位", frame: true}         //参数边定位(右边和底部)
                ]
    });
}
复制代码

8.FormLayout(表单式):这种布局方式用于渲染表单域,表单域一个一个纵向排列并且会被拉长到填满容器的宽度。在这种布局内,内部元素上设定的padding值都会被忽略。

复制代码
function formLayOut() {
    //可以创建Ext.form.FormPanel或指定layout:"form"
    var formLayout = new Ext.form.FormPanel({
        title: "Form Layout", renderTo: Ext.getBody(), width: 500, hidLables: false, labelAlign: "left", //'right'or 'top'
        labelWidth: 65, labelPad: 8, bodyStyle: "padding:15px", defaultType: "textfield",
        defaults: { width: 230, msgTarget: 'side' }, layoutConfig: { labelSeparator: '~' },
        labelSeparator: ":", //field的label显示分隔符,不需要使用""
        items: [
                        { fieldLabel: "First Name", name: "first", allowBlank: false, labelSeparator: ":" },
                        { fieldLabel: "Last Name", name: "last" },
                        { fieldLabel: "Email", name: "email", vtype: "email" },
                        { xtype: "textarea", fieldLabel: "Message", hideLabel: true, name: "msg", achor: "100% -53" }
                ],
        buttons: [
                { text: "Save" }, { text: "Cancel" }
                ]
    });
}
复制代码

9.布局字符串和类的对应关系

复制代码
以下是所有的布局字符串和类的对应关系,所有的布局类均继承自 Ext.layout.ContainerLayout类 

字符串            类                           中文名称
-------------    ------------------           ------------------
absolute         Ext.layout.absolute           绝对定位
accordion        Ext.layout.Accordion         手风琴式
anchor           Ext.layout.AnchorLayout       锚定
(新)auto         Ext.layout.auto               自动
border           Ext.layout.BorderLayout      边界式
card             Ext.layout.CardLayout        卡片式
column           Ext.layout.ColumnLayout        列式
fit              Ext.layout.FitLayout          自适应
form             Ext.layout.FormLayout          表单式
(新)hbox         Ext.layout.hbox               水平
(新)menu         Ext.layout.menu               菜单式
table            Ext.layout.TableLayout      表格式
(新)toolbar      Ext.layout.toolbar           工具条式
(新)vbox         Ext.layout.vbox                垂直
复制代码
相关文章
|
1月前
|
Java 虚拟化 容器
(Java)Java里JFrame窗体的基本操作(容器布局篇-1)
容器 容器,我的理解是可以包容其他东西的玩意。它可以是一个盒子,可以是一个虚拟化的物品,可只要能包裹住其他存在质体的东西,那么都可以称作是容器。例如:JPanel组件和JScollPane组件两者都是容器也是组件。 既然有容器,那么容器中的布局就必不可少了。不然不规矩的摆放物品,人类看不习惯,我也看不习惯 ???? 本篇内容,将说明java JFrame窗体里容器中几类布局。 说明:所有在JFrame窗体里的容器布局都会使用setLayout()方法,采用的布局参数都将放进这个方法里 绝对布局 调用窗体容器
82 1
|
8月前
|
前端开发 API 开发者
harmonyOS基础- 快速弄懂HarmonyOS ArkTs基础组件、布局容器(前端视角篇)
本文由黑臂麒麟(6年前端经验)撰写,介绍ArkTS开发中的常用基础组件与布局组件。基础组件包括Text、Image、Button等,支持样式设置如字体颜色、大小和加粗等,并可通过Resource资源引用统一管理样式。布局组件涵盖Column、Row、List、Grid和Tabs等,支持灵活的主轴与交叉轴对齐方式、分割线设置及滚动事件监听。同时,Tabs组件可实现自定义样式与页签切换功能。内容结合代码示例,适合初学者快速上手ArkTS开发。参考华为开发者联盟官网基础课程。
689 75
harmonyOS基础- 快速弄懂HarmonyOS ArkTs基础组件、布局容器(前端视角篇)
|
5月前
|
设计模式 开发者 UED
123. [HarmonyOS NEXT 实战案例一:SideBarContainer] 侧边栏容器实战:新闻阅读应用侧边栏布局 基础篇
在现代移动应用和平板应用中,侧边栏导航已经成为一种常见且实用的UI设计模式。HarmonyOS NEXT提供了专门的`SideBarContainer`组件来实现这一功能,它能够轻松创建可显示和隐藏的侧边栏布局,非常适合新闻阅读、电子商务、文件管理等应用场景。
137 3
123. [HarmonyOS NEXT 实战案例一:SideBarContainer] 侧边栏容器实战:新闻阅读应用侧边栏布局 基础篇
|
5月前
|
UED 容器
124.[HarmonyOS NEXT 实战案例一:SideBarContainer] 侧边栏容器实战:新闻阅读应用侧边栏布局 进阶篇
在基础篇中,我们学习了如何使用HarmonyOS NEXT的`SideBarContainer`组件创建新闻阅读应用的基本侧边栏布局。本篇教程将深入探讨如何为新闻阅读应用添加更多交互功能和状态管理,提升用户体验。
120 1
124.[HarmonyOS NEXT 实战案例一:SideBarContainer] 侧边栏容器实战:新闻阅读应用侧边栏布局 进阶篇
|
5月前
|
UED 容器
10.HarmonyOS Next布局进阶:嵌套Flex容器与空间分配策略
在HarmonyOS Next的ArkUI框架中,Flex布局是构建用户界面的核心技术之一。通过嵌套使用Flex容器,我们可以创建复杂而灵活的界面结构,满足各种应用场景的需求。本教程将深入探讨如何在HarmonyOS Next中使用嵌套Flex容器实现复杂布局,以及如何合理分配和控制空间。
156 0
|
Web App开发 前端开发 JavaScript
技术心得记录:瀑布流的布局原理分析(纯CSS瀑布流与JS瀑布流)
技术心得记录:瀑布流的布局原理分析(纯CSS瀑布流与JS瀑布流)
355 0
|
11月前
Next.js 实战 (二):搭建 Layouts 基础排版布局
本文介绍了作者在Next.js v15.x版本发布后,对一个旧项目的重构过程。文章详细说明了项目开发规范配置、UI组件库选择(最终选择了Ant-Design)、以及使用Ant Design的Layout组件实现中后台布局的方法。文末展示了布局的初步效果,并提供了GitHub仓库链接供读者参考学习。
374 1
Next.js 实战 (二):搭建 Layouts 基础排版布局
|
JavaScript 前端开发 容器
js之弹性布局使用方法
js之弹性布局使用方法
168 0
|
JavaScript 前端开发
网页前端课程设计-【模仿】香港中文大学官网,轮播图及div+css布局,js的dom操作
这篇文章介绍了如何模仿香港中文大学官网进行网页前端课程设计,包括使用div+css布局、js的DOM操作以及实现轮播图等技术细节。
|
容器 iOS开发 Linux
震惊!Uno Platform 响应式 UI 构建秘籍大公开!从布局容器到自适应设计,带你轻松打造跨平台完美界面
【8月更文挑战第31天】Uno Platform 是一款强大的跨平台应用开发框架,支持 Web、桌面(Windows、macOS、Linux)及移动(iOS、Android)等平台,仅需单一代码库。本文分享了四个构建响应式用户界面的最佳实践:利用布局容器(如 Grid)适配不同屏幕尺寸;采用自适应布局调整 UI;使用媒体查询定制样式;遵循响应式设计原则确保 UI 元素自适应调整。通过这些方法,开发者可以为用户提供一致且优秀的多设备体验。
492 0