Layout 布局
用于快捷划分页面整体布局
概述
Layout
:布局容器,其下可嵌套Header
Sider
Content
Footer
或Layout
本身,可以放在任何父容器中。Header
:顶部布局,其下可嵌套任何元素,只能放在Layout
中。Sider
:侧边栏,其下可嵌套任何元素,只能放在Layout
中。Content
:内容部分,其下可嵌套任何元素,只能放在Layout
中。Footer
:底部布局,其下可嵌套任何元素,只能放在Layout
中。
注意事项
1、布局组件采用 Flex 布局实现,无法在非现代浏览器中工作
2、Layout 组件仅会帮你实现布局,但不会附带背景色、文本色、宽高度等样式。你可以根据自己实际需求传入 style 或给定特定 className 另行编写css实现
2、Layout 组件仅会帮你实现布局,但不会附带背景色、文本色、宽高度等样式。你可以根据自己实际需求传入 style 或给定特定 className 另行编写css实现
代码演示
如何引入
jsx
import { Layout } from '@kousum/semi-ui-vue';
三行布局
ThreeRows.vue
tsconfig.json
Import Map
xxxxxxxxxx
19
<template>
<Layout className="components-layout-demo">
<LayoutHeader :style="commonStyle">Header</LayoutHeader>
<LayoutContent style="height: 300px; line-height: 300px;">Content</LayoutContent>
<LayoutFooter :style="commonStyle">Footer</LayoutFooter>
</Layout>
</template>
<script setup>
import { Layout, LayoutHeader, LayoutFooter, LayoutContent } from '@kousum/semi-ui-vue';
const commonStyle = {
height: '64px',
lineHeight: '64px',
background: 'var(--semi-color-fill-0)'
};
</script>
Show Error
Auto Save
左侧边栏布局
LeftSide.vue
tsconfig.json
Import Map
xxxxxxxxxx
24
<template>
<Layout className="components-layout-demo">
<LayoutHeader :style="commonStyle">Header</LayoutHeader>
<Layout>
<LayoutSider style="width: 120px; background: var(--semi-color-fill-2);">Sider</LayoutSider>
<LayoutContent style="height: 300px; line-height: 300px;">Content</LayoutContent>
</Layout>
<LayoutFooter :style="commonStyle">Footer</LayoutFooter>
</Layout>
</template>
<script setup>
import { ref } from 'vue';
import { Layout, LayoutHeader, LayoutFooter, LayoutContent, LayoutSider } from '@kousum/semi-ui-vue';
const commonStyle = ref({
height: 64,
lineHeight: '64px',
background: 'var(--semi-color-fill-0)'
});
</script>
Show Error
Auto Save
右侧边栏布局
RightSide.vue
tsconfig.json
Import Map
xxxxxxxxxx
21
<template>
<Layout className="components-layout-demo">
<LayoutHeader :style="commonStyle">Header</LayoutHeader>
<Layout>
<LayoutContent style="height: 300px; line-height: 300px;">Content</LayoutContent>
<LayoutSider style="width: 120px; background: var(--semi-color-fill-2);">Sider</LayoutSider>
</Layout>
<LayoutFooter :style="commonStyle">Footer</LayoutFooter>
</Layout>
</template>
<script setup>
import { Layout, LayoutHeader, LayoutFooter, LayoutContent, LayoutSider } from '@kousum/semi-ui-vue';
const commonStyle = {
height: '64px',
lineHeight: '64px',
background: 'var(--semi-color-fill-0)'
};
</script>
Show Error
Auto Save
侧边栏布局
SimpleLeftSide.vue
tsconfig.json
Import Map
xxxxxxxxxx
21
<template>
<Layout className="components-layout-demo">
<LayoutSider style="width: 120px; background: var(--semi-color-fill-2);">Sider</LayoutSider>
<Layout>
<LayoutHeader style="height: 64px; line-height: 64px; background: var(--semi-color-fill-0);">Header</LayoutHeader>
<LayoutContent style="height: 300px; line-height: 300px;">Content</LayoutContent>
<LayoutFooter style="height: 64px; line-height: 64px; background: var(--semi-color-fill-0);">Footer</LayoutFooter>
</Layout>
</Layout>
</template>
<script setup>
import { Layout, LayoutHeader, LayoutFooter, LayoutContent, LayoutSider } from '@kousum/semi-ui-vue';
const commonStyle = {
height: '64px',
lineHeight: '64px',
background: 'var(--semi-color-fill-0)'
};
</script>
Show Error
Auto Save
响应式布局
侧边栏预设了六个响应尺寸:xs
、sm
、md
、lg
、xl
、xxl
。可以通过设置 breakpoint
属性设置断点,通过 onBreakpoint
调用回调函数。
ReactLayout.vue
tsconfig.json
Import Map
xxxxxxxxxx
31
<template>
<Layout className="components-layout-demo">
<LayoutHeader :style="commonStyle">Header</LayoutHeader>
<Layout>
<LayoutSider
style="width: 120px; background: var(--semi-color-fill-2);"
:breakpoint="['md']"
@onBreakpoint="onbreakpoint"
>
Sider
</LayoutSider>
<LayoutContent style="height: 300px; line-height: 300px;">Content</LayoutContent>
</Layout>
<LayoutFooter :style="commonStyle">Footer</LayoutFooter>
</Layout>
</template>
<script setup>
import { Layout, LayoutHeader, LayoutFooter, LayoutContent, LayoutSider } from '@kousum/semi-ui-vue';
const onbreakpoint = (screen, bool) => {
console.log(screen, bool);
};
const commonStyle = {
height: '64px',
lineHeight: '64px',
background: 'var(--semi-color-fill-0)'
};
</script>
Show Error
Auto Save
布局示例
顶部导航布局
TopSide.vue
tsconfig.json
Import Map
xxxxxxxxxx
83
<template>
<Layout style="border: 1px solid var(--semi-color-border)">
<LayoutHeader style="background-color: var(--semi-color-bg-1)">
<div>
<Nav mode="horizontal" :defaultSelectedKeys="['Home']">
<NavHeader>
<IconSemiLogo style="font-size: 36px" />
</NavHeader>
<NavItem itemKey="Home" text="首页" :icon="h(IconHome)" />
<NavItem itemKey="Live" text="直播" :icon="h(IconLive)" />
<NavItem itemKey="Setting" text="设置" :icon="h(IconSetting)" />
<NavFooter>
<Button theme="borderless" :icon="h(IconBell)" style="color: var(--semi-color-text-2); margin-right: 12px" />
<Button
theme="borderless"
:icon="h(IconHelpCircle)"
style="color: var(--semi-color-text-2); margin-right: 12px"
/>
<Avatar color="orange" size="small">YJ</Avatar>
</NavFooter>
</Nav>
</div>
</LayoutHeader>
<LayoutContent style="padding: 24px; background-color: var(--semi-color-bg-0)">
<Breadcrumb style="margin-bottom: 24px" :routes="['首页', '当这个页面标题很长时需要省略', '上一页', '详情页']" />
<div style="border-radius: 10px; border: 1px solid var(--semi-color-border); height: 276px; padding: 32px">
<Skeleton :placeholder="h(SkeletonParagraph,{ rows: 2 }, ()=>[])" :loading="true">
<p>Hi, Bytedance dance dance.</p>
<p>Hi, Bytedance dance dance.</p>
</Skeleton>
</div>
</LayoutContent>
<LayoutFooter
style="
display: flex;
justify-content: space-between;
padding: 20px;
color: var(--semi-color-text-2);
background-color: rgba(var(--semi-grey-0), 1);
"
>
Show Error
Auto Save
顶部导航-侧边布局
TopLeftSide.vue
tsconfig.json
Import Map
xxxxxxxxxx
102
<template>
<Layout style="border: 1px solid var(--semi-color-border)">
<LayoutHeader style="background-color: var(--semi-color-bg-1)">
<div>
<Nav mode="horizontal" :defaultSelectedKeys="['Home']">
<NavHeader>
<IconSemiLogo style="height: 36px; font-size: 36px" />
</NavHeader>
<span style="color: var(--semi-color-text-2)">
<span style="margin-right: 24px; color: var(--semi-color-text-0); font-weight: 600"> 模版推荐 </span>
<span style="margin-right: 24px">所有模版</span>
<span>我的模版</span>
</span>
<NavFooter>
<Button
theme="borderless"
:icon="h(IconBell, { size: 'large' })"
style="color: var(--semi-color-text-2); margin-right: 12px"
/>
<Button
theme="borderless"
:icon="h(IconHelpCircle, { size: 'large' })"
style="color: var(--semi-color-text-2); margin-right: 12px"
/>
<Avatar color="orange" size="small">YJ</Avatar>
</NavFooter>
</Nav>
</div>
</LayoutHeader>
<Layout>
<LayoutSider style="background-color: var(--semi-color-bg-1)">
<Nav style="max-width: 220px; height: 100%" :defaultSelectedKeys="['Home']">
<NavItem itemKey="Home" text="首页" :icon="h(IconHome, { size: 'large' })" />
<NavItem itemKey="Histogram" text="基础数据" :icon="h(IconHistogram, { size: 'large' })" />
<NavItem itemKey="Live" text="测试功能" :icon="h(IconLive, { size: 'large' })" />
<NavItem itemKey="Setting" text="设置" :icon="h(IconSetting, { size: 'large' })" />
</Nav>
</LayoutSider>
<LayoutContent style="padding: 24px; background-color: var(--semi-color-bg-0)">
<Breadcrumb
style="margin-bottom: 24px"
:routes="['首页', '当这个页面标题很长时需要省略', '上一页', '详情页']"
/>
Show Error
Auto Save
侧边导航
LeftNavSide.vue
tsconfig.json
Import Map
xxxxxxxxxx
103
<template>
<Layout style="border: 1px solid var(--semi-color-border)">
<Layout>
<LayoutSider style="background-color: var(--semi-color-bg-1)">
<Nav
:header="{
logo: h(IconSemiLogo, { style: { fontSize: '36px' } }),
text: 'Semi Design',
}"
style="max-width: 220px; height: 100%"
:defaultSelectedKeys="['Home']"
:footer="{ collapseButton: true }"
>
<NavItem itemKey="Home" text="首页" :icon="h(IconHome, { size: 'large' })" />
<NavItem itemKey="Histogram" text="基础数据" :icon="h(IconHistogram, { size: 'large' })" />
<NavItem itemKey="Live" text="测试功能" :icon="h(IconLive, { size: 'large' })" />
<NavItem itemKey="Setting" text="设置" :icon="h(IconSetting, { size: 'large' })" />
</Nav>
</LayoutSider>
<Layout>
<LayoutHeader style="background-color: var(--semi-color-bg-1)">
<div>
<Nav mode="horizontal" :defaultSelectedKeys="['Home']">
<NavFooter>
<Button
theme="borderless"
:icon="h(IconBell, { size: 'large' })"
style="color: var(--semi-color-text-2); margin-right: 12px"
/>
<Button
theme="borderless"
:icon="h(IconHelpCircle, { size: 'large' })"
style="color: var(--semi-color-text-2); margin-right: 12px"
/>
<Avatar color="orange" size="small">YJ</Avatar>
</NavFooter>
</Nav>
</div>
</LayoutHeader>
<LayoutContent style="padding: 24px; background-color: var(--semi-color-bg-0)">
<Breadcrumb
style="margin-bottom: 24px"
:routes="['首页', '当这个页面标题很长时需要省略', '上一页', '详情页']"
/>
Show Error
Auto Save
API 参考
Layout
Layout.Header
Layout.Footer
Layout.Content
API 与Layout
相同
属性 | 说明 | 类型 | 默认值 |
---|---|---|---|
className | 类名 | string | - |
hasSider | 表示子元素里有 Sider,一般不用指定。可用于服务端渲染时避免样式闪动 | boolean | - |
style | 样式 | CSSProperties | - |
aria-label | aria-label 属性,用来给当前元素加上的标签描述, 提升可访问性 >=2.3.0 | string | - |
role | role 属性, 提升可访问性 >=2.3.0 | string | - |
Layout.Sider
属性 | 说明 | 类型 | 默认值 |
---|---|---|---|
breakpoint | 触发响应式布局的断点,可选值'xs', 'sm', 'md', 'lg', 'xl', 'xxl' | string[] | - |
className | 类名 | string | - |
style | 样式 | CSSProperties | - |
onBreakpoint | 触发响应式布局断点时的回调 | (screen: string, broken: bool) => void | - |
aria-label | aria-label属性,用来给当前元素加上的标签描述, 提升可访问性 >=2.3.0 | string | - |
role | role属性, 提升可访问性 >=2.3.0 | string | - |
responsive map
text
{
xs: '(max-width: 575px)',
sm: '(min-width: 576px)',
md: '(min-width: 768px)',
lg: '(min-width: 992px)',
xl: '(min-width: 1200px)',
xxl: '(min-width: 1600px)',
};
Accessibility
ARIA
- Sider 可传入 aria-label props,描述该 Sider 作用。
- Header Content Main Footer 可传入 role aria-label 描述对应元素作用。