概述
Layout:布局容器,其下可嵌套HeaderSiderContentFooter或Layout本身,可以放在任何父容器中。Header:顶部布局,其下可嵌套任何元素,只能放在Layout中。Sider:侧边栏,其下可嵌套任何元素,只能放在Layout中。Content:内容部分,其下可嵌套任何元素,只能放在Layout中。Footer:底部布局,其下可嵌套任何元素,只能放在Layout中。
代码演示
如何引入
<script setup lang="ts">
import { Layout } from '@fibrous/semi-ui-vue';
</script>
子组件通过 Layout.Header、Layout.Sider、Layout.Content、Layout.Footer 使用,也可以按名导入 LayoutHeader、LayoutSider、LayoutContent、LayoutFooter。
三行布局
代码
<script setup lang="ts">
import { Layout } from '@fibrous/semi-ui-vue';
const commonStyle = {
height: '64px',
lineHeight: '64px',
background: 'var(--semi-color-fill-0)',
};
</script>
<template>
<Layout class="components-layout-demo">
<Layout.Header :style="commonStyle">Header</Layout.Header>
<Layout.Content :style="{ height: '300px', lineHeight: '300px' }">Content</Layout.Content>
<Layout.Footer :style="commonStyle">Footer</Layout.Footer>
</Layout>
</template>左侧边栏布局
代码
<script setup lang="ts">
import { Layout } from '@fibrous/semi-ui-vue';
const commonStyle = {
height: '64px',
lineHeight: '64px',
background: 'var(--semi-color-fill-0)',
};
</script>
<template>
<Layout class="components-layout-demo">
<Layout.Header :style="commonStyle">Header</Layout.Header>
<Layout>
<Layout.Sider :style="{ width: '120px', background: 'var(--semi-color-fill-2)' }">Sider</Layout.Sider>
<Layout.Content :style="{ height: '300px', lineHeight: '300px' }">Content</Layout.Content>
</Layout>
<Layout.Footer :style="commonStyle">Footer</Layout.Footer>
</Layout>
</template>右侧边栏布局
代码
<script setup lang="ts">
import { Layout } from '@fibrous/semi-ui-vue';
const commonStyle = {
height: '64px',
lineHeight: '64px',
background: 'var(--semi-color-fill-0)',
};
</script>
<template>
<Layout class="components-layout-demo">
<Layout.Header :style="commonStyle">Header</Layout.Header>
<Layout>
<Layout.Content :style="{ height: '300px', lineHeight: '300px' }">Content</Layout.Content>
<Layout.Sider :style="{ width: '120px', background: 'var(--semi-color-fill-2)' }">Sider</Layout.Sider>
</Layout>
<Layout.Footer :style="commonStyle">Footer</Layout.Footer>
</Layout>
</template>侧边栏布局
代码
<script setup lang="ts">
import { Layout } from '@fibrous/semi-ui-vue';
const commonStyle = {
height: '64px',
lineHeight: '64px',
background: 'var(--semi-color-fill-0)',
};
</script>
<template>
<Layout class="components-layout-demo">
<Layout.Sider :style="{ width: '120px', background: 'var(--semi-color-fill-2)' }">Sider</Layout.Sider>
<Layout>
<Layout.Header :style="commonStyle">Header</Layout.Header>
<Layout.Content :style="{ height: '300px', lineHeight: '300px' }">Content</Layout.Content>
<Layout.Footer :style="commonStyle">Footer</Layout.Footer>
</Layout>
</Layout>
</template>响应式布局
侧边栏预设了六个响应尺寸:xs、sm、md、lg、xl、xxl。可以通过设置 breakpoint 属性设置断点。
通过 @breakpoint 监听断点命中状态的变化。
代码
<script setup lang="ts">
import { Layout } from '@fibrous/semi-ui-vue';
const commonStyle = {
height: '64px',
lineHeight: '64px',
background: 'var(--semi-color-fill-0)',
};
</script>
<template>
<Layout class="components-layout-demo">
<Layout.Header :style="commonStyle">Header</Layout.Header>
<Layout>
<Layout.Sider :breakpoint="['md']" :style="{ width: '120px', background: 'var(--semi-color-fill-2)' }" @breakpoint="(screen, matches) => console.log(screen, matches)"> Sider </Layout.Sider>
<Layout.Content :style="{ height: '300px', lineHeight: '300px' }">Content</Layout.Content>
</Layout>
<Layout.Footer :style="commonStyle">Footer</Layout.Footer>
</Layout>
</template>布局示例
顶部导航布局
顶部导航-侧边布局
侧边导航
API 参考
Layout
Props
| 属性 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| prefixCls | 类名前缀。 | string | semiDefault("Layout", "prefixCls", cssClasses.PREFIX) |
| tagName | 根元素的标签名。 | keyof HTMLElementTagNameMap | semiDefault("Layout", "tagName", "section") |
| hasSider | 表示子元素里有 Sider。直接子节点中的 Sider 会自动识别;嵌套更深的 Sider 在挂载后才登记,服务端渲染时传 true 可避免样式闪动。传 false 不能去掉 Sider 带来的 has-sider 类。 | boolean | semiGlobalDefault("Layout", "hasSider") |
Events
| 事件 | 说明 | 回调参数 |
|---|---|---|
| 无 |
Slots
| 插槽 | 说明 | 作用域参数 |
|---|---|---|
| default | Layout 的内容,可放 Layout.Header、Layout.Sider、Layout.Content、Layout.Footer 或嵌套的 Layout。 | any |
Exposes
| 名称 | 说明 | 类型 |
|---|---|---|
| 无 |
class、style 与原生属性(含 role、aria-*)经 attrs 落在根元素上。
Layout.Header、Layout.Footer、Layout.Content
三者的 API 相同,默认标签依次为 header、footer、main。
Layout.Header
Props
| 属性 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| prefixCls | 类名前缀。 | string | cssClasses.PREFIX |
| tagName | 根元素的标签名。 | keyof HTMLElementTagNameMap | "header" |
| type | 内部使用,决定类名后缀。 | string | "header" |
Events
| 事件 | 说明 | 回调参数 |
|---|---|---|
| 无 |
Slots
| 插槽 | 说明 | 作用域参数 |
|---|---|---|
| default | 顶部区域的内容。 | any |
Exposes
| 名称 | 说明 | 类型 |
|---|---|---|
| 无 |
Layout.Footer
Props
| 属性 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| prefixCls | 类名前缀。 | string | cssClasses.PREFIX |
| tagName | 根元素的标签名。 | keyof HTMLElementTagNameMap | "footer" |
| type | 内部使用,决定类名后缀。 | string | "footer" |
Events
| 事件 | 说明 | 回调参数 |
|---|---|---|
| 无 |
Slots
| 插槽 | 说明 | 作用域参数 |
|---|---|---|
| default | 底部区域的内容。 | any |
Exposes
| 名称 | 说明 | 类型 |
|---|---|---|
| 无 |
Layout.Content
Props
| 属性 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| prefixCls | 类名前缀。 | string | cssClasses.PREFIX |
| tagName | 根元素的标签名。 | keyof HTMLElementTagNameMap | "main" |
| type | 内部使用,决定类名后缀。 | string | "content" |
Events
| 事件 | 说明 | 回调参数 |
|---|---|---|
| 无 |
Slots
| 插槽 | 说明 | 作用域参数 |
|---|---|---|
| default | 内容区域的内容。 | any |
Exposes
| 名称 | 说明 | 类型 |
|---|---|---|
| 无 |
class、style 与原生属性(含 role、aria-*)经 attrs 落在各自的根元素上。
Layout.Sider
Props
| 属性 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| prefixCls | 类名前缀。 | string | cssClasses.PREFIX |
| breakpoint | 触发响应式布局的断点,可选 xs、sm、md、lg、xl、xxl。仅在挂载时读取一次。 | Breakpoint[] | undefined |
Events
| 事件 | 说明 | 回调参数 |
|---|---|---|
| breakpoint | 挂载时对 breakpoint 中的每个断点按当前视口触发一次,之后在命中或离开时触发,参数为断点名与是否命中。 | [screen: Breakpoint, match: boolean] |
Slots
| 插槽 | 说明 | 作用域参数 |
|---|---|---|
| default | 侧边栏的内容。 | any |
Exposes
| 名称 | 说明 | 类型 |
|---|---|---|
| 无 |
class、style 与原生属性(含 role、aria-*)经 attrs 落在根元素 aside 上。
responsive map
{
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 渲染
aside,可传入aria-label描述该 Sider 的作用。 - Header、Footer 默认渲染
header、footer,位于 Layout 的section内时不会成为 banner、contentinfo 地标;作为整页的页头、页脚时传入role="banner"、role="contentinfo"。 - Content 默认渲染
main,一个页面只应有一个main;嵌套使用时可通过tagName换成其他标签。 - Header、Content、Footer 可传入
role、aria-label描述对应元素的作用。