Layout 布局

协助进行页面级整体布局。

设计规则

尺寸

一级导航项偏左靠近 logo 放置,辅助菜单偏右放置。

  • 顶部导航(大部分系统):一级导航高度 64px,二级导航 48px
  • 顶部导航(展示类页面):一级导航高度 80px,二级导航 56px
  • 顶部导航高度的范围计算公式为:48+8n
  • 侧边导航宽度的范围计算公式:200+8n

交互

  • 一级导航和末级的导航需要在可视化的层面被强调出来;
  • 当前项应该在呈现上优先级最高;
  • 当导航收起的时候,当前项的样式自动赋予给它的上一个层级;
  • 左侧导航栏的收放交互同时支持手风琴和全展开的样式,根据业务的要求进行适当的选择。

视觉

导航样式上需要根据信息层级合理的选择样式:

  • 大色块强调

建议用于底色为深色系时,当前页面父级的导航项。

  • 高亮火柴棍

当导航栏底色为浅色系时使用,可用于当前页面对应导航项,建议尽量在导航路径的最终项使用。

  • 字体高亮变色

从可视化层面,字体高亮的视觉强化力度低于大色块,通常在当前项的上一级使用。

  • 字体放大

12px14px 是导航的标准字号,14 号字体用在一、二级导航中。字号可以考虑导航项的等级做相应选择。

组件概述

  • Layout:布局容器,其下可嵌套 Header Sider Content FooterLayout 本身,可以放在任何父容器中。
  • Header:顶部布局,自带默认样式,其下可嵌套任何元素,只能放在 Layout 中。
  • Sider:侧边栏,自带默认样式及基本功能,其下可嵌套任何元素,只能放在 Layout 中。
  • Content:内容部分,自带默认样式,其下可嵌套任何元素,只能放在 Layout 中。
  • Footer:底部布局,自带默认样式,其下可嵌套任何元素,只能放在 Layout 中。
注意:采用 flex 布局实现,请注意浏览器兼容性问题。

代码演示

基本结构

典型的页面布局。

  1. <template>
  2. <div class="components-layout-demo-basic">
  3. <v-layout>
  4. <v-header>Header</v-header>
  5. <v-content>Content</v-content>
  6. <v-footer>Footer</v-footer>
  7. </v-layout>
  8. </div>
  9. <div class="components-layout-demo-basic">
  10. <v-layout>
  11. <v-header>Header</v-header>
  12. <v-layout>
  13. <v-sider>Sider</v-sider>
  14. <v-content>Content</v-content>
  15. </v-layout>
  16. <v-footer>Footer</v-footer>
  17. </v-layout>
  18. </div>
  19. <div class="components-layout-demo-basic">
  20. <v-layout>
  21. <v-header>Header</v-header>
  22. <v-layout>
  23. <v-content>Content</v-content>
  24. <v-sider>Sider</v-sider>
  25. </v-layout>
  26. <v-footer>Footer</v-footer>
  27. </v-layout>
  28. </div>
  29. <div class="components-layout-demo-basic">
  30. <v-layout>
  31. <v-sider>Sider</v-sider>
  32. <v-content>
  33. <v-header>Header</v-header>
  34. <v-content>Content</v-content>
  35. <v-footer>Footer</v-footer>
  36. </v-content>
  37. </v-layout>
  38. </div>
  39. </template>
  40. <style>
  41. .components-layout-demo-basic {
  42. text-align: center;
  43. margin: 2rem;
  44. }
  45. .components-layout-demo-basic .ant-layout-header,
  46. .components-layout-demo-basic .ant-layout-footer {
  47. background: #7dbcea;
  48. color: #fff;
  49. }
  50. .components-layout-demo-basic .ant-layout-footer {
  51. line-height: 1.5;
  52. }
  53. .components-layout-demo-basic .ant-layout-sider {
  54. background: #3ba0e9;
  55. color: #fff;
  56. line-height: 120px;
  57. }
  58. .components-layout-demo-basic .ant-layout-content {
  59. background: rgba(16, 142, 233, 1);
  60. color: #fff;
  61. min-height: 120px;
  62. line-height: 120px;
  63. }
  64. </style>

上下中布局

最基本的『上-中-下』布局。一般主导航放置于页面的顶端,从左自右依次为:logo、一级导航项、辅助菜单(用户、设置、通知等)。通常将内容放在固定尺寸(例如:1200px)内,整个页面排版稳定,不受用户终端显示器影响;上下级的结构符合用户上下浏览的习惯,也是较为经典的网站导航模式。页面上下切分的方式提高了主工作区域的信息展示效率,但在纵向空间上会有一些牺牲。此外,由于导航栏水平空间的限制,不适合那些一级导航项很多的信息结构。

  1. <template>
  2. <div id="components-layout-demo-top">
  3. <v-layout class="layout">
  4. <v-header>
  5. <div class="logo"></div>
  6. <v-menu theme="dark" mode="horizontal" :data="menuData1" :style="{lineHeight: '64px'}"></v-menu>
  7. </v-header>
  8. <v-content :style="{ padding: '0 50px' }">
  9. <v-breadcrumb :style="{ margin: '12px 0' }">
  10. <v-breadcrumb-item>Home</v-breadcrumb-item>
  11. <v-breadcrumb-item href="">List</v-breadcrumb-item>
  12. <v-breadcrumb-item href="">App</v-breadcrumb-item>
  13. </v-breadcrumb>
  14. <div style="background: #fff; padding: 24px; min-height: 280px">Content</div>
  15. </v-content>
  16. <v-footer :style="{ textAlign: 'center' }">
  17. Ant Design ©2016 Created by Ant UED
  18. </v-footer>
  19. </v-layout>
  20. </div>
  21. </template>
  22. <style>
  23. #components-layout-demo-top .logo {
  24. width: 120px;
  25. height: 31px;
  26. background: #333;
  27. border-radius: 6px;
  28. margin: 16px 24px 16px 0;
  29. float: left;
  30. }
  31. </style>
  32. <script>
  33. export default {
  34. data() {
  35. return {
  36. menuData1: [{
  37. name: 'nav 1'
  38. },{
  39. name: 'nav 2',
  40. selected: true
  41. },{
  42. name: 'nav 3'
  43. }]
  44. }
  45. }
  46. }
  47. </script>

顶部-侧边布局

多用在同时拥有顶部导航及侧边栏的页面。

  1. <template>
  2. <div id="components-layout-demo-top-side">
  3. <v-layout>
  4. <v-header>
  5. <div class="logo"></div>
  6. <v-menu theme="dark" mode="horizontal" :data="menuData1" :style="{lineHeight: '64px'}"></v-menu>
  7. </v-header>
  8. <v-content :style="{ padding: '0 50px' }">
  9. <v-breadcrumb :style="{ margin: '12px 0' }">
  10. <v-breadcrumb-item>Home</v-breadcrumb-item>
  11. <v-breadcrumb-item href="">List</v-breadcrumb-item>
  12. <v-breadcrumb-item href="">App</v-breadcrumb-item>
  13. </v-breadcrumb>
  14. <v-layout style="background: #fff; padding: 24px 0;">
  15. <v-sider :width="200" style="background: #fff">
  16. <v-menu mode="inline" :data="menuData2"></v-menu>
  17. </v-sider>
  18. <v-content :style="{ padding: '0 24px', minHeight: 280 }">Content</v-content>
  19. </v-layout>
  20. </v-content>
  21. <v-footer :style="{ textAlign: 'center' }">
  22. Ant Design ©2016 Created by Ant UED
  23. </v-footer>
  24. </v-layout>
  25. </div>
  26. </template>
  27. <style>
  28. #components-layout-demo-top-side .logo {
  29. width: 120px;
  30. height: 31px;
  31. background: #333;
  32. border-radius: 6px;
  33. margin: 16px 28px 16px 0;
  34. float: left;
  35. }
  36. </style>
  37. <script>
  38. export default {
  39. data() {
  40. return {
  41. menuData1: [{
  42. name: 'nav 1'
  43. },{
  44. name: 'nav 2',
  45. selected: true
  46. },{
  47. name: 'nav 3'
  48. }],
  49. menuData2: [{
  50. name: 'subnav 1',
  51. icon: 'user',
  52. expand: true,
  53. children: [{
  54. name: 'option1',
  55. selected: true
  56. },{
  57. name: 'option2'
  58. },{
  59. name: 'option3'
  60. },{
  61. name: 'option4'
  62. }]
  63. },{
  64. name: 'subnav 2',
  65. icon: 'laptop',
  66. children: [{
  67. name: 'option5'
  68. },{
  69. name: 'option6'
  70. },{
  71. name: 'option7'
  72. },{
  73. name: 'option8'
  74. }]
  75. },{
  76. name: 'subnav 3',
  77. icon: 'notification',
  78. children: [{
  79. name: 'option9'
  80. },{
  81. name: 'option10'
  82. },{
  83. name: 'option11'
  84. },{
  85. name: 'option12'
  86. }]
  87. }]
  88. }
  89. }
  90. }
  91. </script>

顶部-侧边布局-通栏

同样拥有顶部导航及侧边栏,区别是两边未留边距,多用于应用型的网站。

  1. <template>
  2. <div id="components-layout-demo-top-side">
  3. <v-layout>
  4. <v-header>
  5. <div class="logo"></div>
  6. <v-menu theme="dark" mode="horizontal" :data="menuData1" style="line-height: 64px"></v-menu>
  7. </v-header>
  8. <v-layout>
  9. <v-sider :width="200" style="background: #fff">
  10. <v-menu mode="inline" :data="menuData2" style="height:100%"></v-menu>
  11. </v-sider>
  12. <v-layout style="padding:0 24px 24px">
  13. <v-breadcrumb style="margin:12px 0">
  14. <v-breadcrumb-item>Home</v-breadcrumb-item>
  15. <v-breadcrumb-item href="">List</v-breadcrumb-item>
  16. <v-breadcrumb-item href="">App</v-breadcrumb-item>
  17. </v-breadcrumb>
  18. <v-content style="background: #fff; padding: 24px; margin: 0; min-height: 280px">Content</v-content>
  19. </v-layout>
  20. </v-layout>
  21. </v-layout>
  22. </div>
  23. </template>
  24. <style>
  25. #components-layout-demo-top-side .logo {
  26. width: 120px;
  27. height: 31px;
  28. background: #333;
  29. border-radius: 6px;
  30. margin: 16px 28px 16px 0;
  31. float: left;
  32. }
  33. </style>
  34. <script>
  35. export default {
  36. data() {
  37. return {
  38. menuData1: [{
  39. name: 'nav 1'
  40. },{
  41. name: 'nav 2',
  42. selected: true
  43. },{
  44. name: 'nav 3'
  45. }],
  46. menuData2: [{
  47. name: 'subnav 1',
  48. icon: 'user',
  49. expand: true,
  50. children: [{
  51. name: 'option1',
  52. selected: true
  53. },{
  54. name: 'option2'
  55. },{
  56. name: 'option3'
  57. },{
  58. name: 'option4'
  59. }]
  60. },{
  61. name: 'subnav 2',
  62. icon: 'laptop',
  63. children: [{
  64. name: 'option5'
  65. },{
  66. name: 'option6'
  67. },{
  68. name: 'option7'
  69. },{
  70. name: 'option8'
  71. }]
  72. },{
  73. name: 'subnav 3',
  74. icon: 'notification',
  75. children: [{
  76. name: 'option9'
  77. },{
  78. name: 'option10'
  79. },{
  80. name: 'option11'
  81. },{
  82. name: 'option12'
  83. }]
  84. }]
  85. }
  86. }
  87. }
  88. </script>

侧边布局

侧边两列式布局。页面横向空间有限时,侧边导航可收起。侧边导航在页面布局上采用的是左右的结构,一般主导航放置于页面的左侧固定位置,辅助菜单放置于工作区顶部。内容根据浏览器终端进行自适应,能提高横向空间的使用率,但是整个页面排版不稳定。侧边导航的模式层级扩展性强,一、二、三级导航项目可以更为顺畅且具关联性的被展示,同时侧边导航可以固定,使得用户在操作和浏览中可以快速的定位和切换当前位置,有很高的操作效率。但这类导航横向页面内容的空间会被牺牲一部份。

  1. <template>
  2. <div id="components-layout-demo-side">
  3. <v-layout>
  4. <v-sider collapsible v-model="collapsed">
  5. <div class="logo"></div>
  6. <v-menu theme="dark" :mode="collapsed?'vertical':'inline'" :data="menuData3">
  7. <template slot-scope="{data}">
  8. <i v-if="data.icon" :class="'anticon anticon-' + data.icon"></i>
  9. <span :class="{'nav-text':data.icon}">{{data.name}}</span>
  10. </template>
  11. <template slot-scope="{data}" slot="sub">
  12. <i v-if="data.icon" :class="'anticon anticon-' + data.icon"></i>
  13. <span class="nav-text">{{data.name}}</span>
  14. </template>
  15. </v-menu>
  16. </v-sider>
  17. <v-layout>
  18. <v-header :style="{ background: '#fff', padding: 0 }"></v-header>
  19. <v-content :style="{ padding: '0 50px' }">
  20. <v-breadcrumb :style="{ margin: '12px 0' }">
  21. <v-breadcrumb-item>Home</v-breadcrumb-item>
  22. <v-breadcrumb-item href="">List</v-breadcrumb-item>
  23. <v-breadcrumb-item href="">App</v-breadcrumb-item>
  24. </v-breadcrumb>
  25. <div style="padding: 24px; background: #fff; min-height: 360px;">Content</div>
  26. </v-content>
  27. <v-footer :style="{ textAlign: 'center' }">
  28. Ant Design ©2016 Created by Ant UED
  29. </v-footer>
  30. </v-layout>
  31. </v-layout>
  32. </div>
  33. </template>
  34. <style>
  35. #components-layout-demo-side .logo {
  36. height: 32px;
  37. background: #333;
  38. border-radius: 6px;
  39. margin: 16px;
  40. }
  41. #components-layout-demo-side .ant-layout-sider-collapsed .anticon {
  42. font-size: 16px;
  43. margin-left: 8px;
  44. }
  45. #components-layout-demo-side .ant-layout-sider-collapsed .nav-text {
  46. display: none;
  47. }
  48. #components-layout-demo-side .ant-layout-sider-collapsed .ant-menu-submenu-vertical > .ant-menu-submenu-title:after {
  49. display: none;
  50. }
  51. </style>
  52. <script>
  53. export default {
  54. data() {
  55. return {
  56. collapsed: false,
  57. menuData3: [{
  58. name: 'User',
  59. icon: 'user',
  60. children: [{
  61. name: 'Tome'
  62. },{
  63. name: 'Bill'
  64. },{
  65. name: 'Alex'
  66. }]
  67. },{
  68. name: 'Team',
  69. icon: 'team',
  70. children: [{
  71. name: 'Team1'
  72. },{
  73. name: 'Team2'
  74. }]
  75. },{
  76. name: 'File',
  77. icon: 'file',
  78. selected: true
  79. }]
  80. }
  81. },
  82. watch: {
  83. collapsed(val) {
  84. console.log(val);
  85. },
  86. },
  87. }
  88. </script>

自定义触发器

要使用自定义触发器,可以设置 :trigger="false" 来隐藏默认设定。

  1. <template>
  2. <div id="components-layout-demo-custom-trigger">
  3. <v-layout>
  4. <v-sider collapsible :collapsed="customCollapsed" :trigger="false" :collapsed-width="64">
  5. <div class="logo"></div>
  6. <v-menu theme="dark" mode="inline" :data="menuData4">
  7. <template slot-scope="{data}">
  8. <i v-if="data.icon" :class="'anticon anticon-' + data.icon"></i>
  9. <span class="nav-text">{{data.name}}</span>
  10. </template>
  11. </v-menu>
  12. </v-sider>
  13. <v-layout>
  14. <v-header :style="{ background: '#fff', padding: 0 }">
  15. <v-icon class="trigger" :type="this.customCollapsed ? 'menu-unfold' : 'menu-fold'" @click.native="toggle"></v-icon>
  16. </v-header>
  17. <v-content :style="{ padding: '0 50px' }">
  18. <v-breadcrumb :style="{ margin: '12px 0' }">
  19. <v-breadcrumb-item>Home</v-breadcrumb-item>
  20. <v-breadcrumb-item href="">List</v-breadcrumb-item>
  21. <v-breadcrumb-item href="">App</v-breadcrumb-item>
  22. </v-breadcrumb>
  23. <div style="padding: 24px; background: #fff; min-height: 360px;">Content</div>
  24. </v-content>
  25. <v-footer :style="{ textAlign: 'center' }">
  26. Ant Design ©2016 Created by Ant UED
  27. </v-footer>
  28. </v-layout>
  29. </v-layout>
  30. </div>
  31. </template>
  32. <style>
  33. #components-layout-demo-custom-trigger .trigger {
  34. font-size: 18px;
  35. line-height: 64px;
  36. padding: 0 16px;
  37. cursor: pointer;
  38. transition: color .3s;
  39. }
  40. #components-layout-demo-custom-trigger .trigger:hover {
  41. color: #108ee9;
  42. }
  43. #components-layout-demo-custom-trigger .logo {
  44. height: 32px;
  45. background: #333;
  46. border-radius: 6px;
  47. margin: 16px;
  48. }
  49. #components-layout-demo-custom-trigger .ant-layout-sider-collapsed .anticon {
  50. font-size: 16px;
  51. }
  52. #components-layout-demo-custom-trigger .ant-layout-sider-collapsed .nav-text {
  53. display: none;
  54. }
  55. </style>
  56. <script>
  57. export default {
  58. data() {
  59. return {
  60. customCollapsed: false,
  61. menuData4: [{
  62. name: 'nav 1',
  63. icon: 'user',
  64. selected: true
  65. },{
  66. name: 'nav 2',
  67. icon: 'video-camera'
  68. },{
  69. name: 'nav 3',
  70. icon: 'upload'
  71. }]
  72. }
  73. },
  74. methods: {
  75. toggle() {
  76. this.customCollapsed = !this.customCollapsed;
  77. }
  78. }
  79. }
  80. </script>

响应式布局

Layout.Sider 支持响应式布局。

说明:配置 breakpoint 属性即生效,视窗宽度小于 breakpoint 时 Sider 缩小为 collapsedWidth 宽度,若将 collapsedWidth 设置为零,会出现特殊 trigger。

  1. <template>
  2. <div id="components-layout-demo-responsive">
  3. <v-layout>
  4. <v-sider breakpoint="lg" :collapsed-width="0">
  5. <div class="logo"></div>
  6. <v-menu theme="dark" mode="inline" :data="menuData5">
  7. <template slot-scope="{data}">
  8. <i v-if="data.icon" :class="'anticon anticon-' + data.icon"></i>
  9. <span class="nav-text">{{data.name}}</span>
  10. </template>
  11. </v-menu>
  12. </v-sider>
  13. <v-layout>
  14. <v-header :style="{ background: '#fff', padding: 0 }">
  15. </v-header>
  16. <v-content :style="{ padding: '0 50px' }">
  17. <v-breadcrumb :style="{ margin: '12px 0' }">
  18. <v-breadcrumb-item>Home</v-breadcrumb-item>
  19. <v-breadcrumb-item href="">List</v-breadcrumb-item>
  20. <v-breadcrumb-item href="">App</v-breadcrumb-item>
  21. </v-breadcrumb>
  22. <div style="padding: 24px; background: #fff; min-height: 360px;">Content</div>
  23. </v-content>
  24. <v-footer :style="{ textAlign: 'center' }">
  25. Ant Design ©2016 Created by Ant UED
  26. </v-footer>
  27. </v-layout>
  28. </v-layout>
  29. </div>
  30. </template>
  31. <style>
  32. #components-layout-demo-responsive .trigger {
  33. font-size: 18px;
  34. line-height: 64px;
  35. padding: 0 16px;
  36. cursor: pointer;
  37. transition: color .3s;
  38. }
  39. #components-layout-demo-responsive .trigger:hover {
  40. color: #108ee9;
  41. }
  42. #components-layout-demo-responsive .logo {
  43. height: 32px;
  44. background: #333;
  45. border-radius: 6px;
  46. margin: 16px;
  47. }
  48. #components-layout-demo-responsive .ant-layout-sider-collapsed .anticon {
  49. font-size: 16px;
  50. }
  51. #components-layout-demo-responsive .ant-layout-sider-collapsed .nav-text {
  52. display: none;
  53. }
  54. </style>
  55. <script>
  56. export default {
  57. data() {
  58. return {
  59. menuData5: [{
  60. name: 'nav 1',
  61. icon: 'user',
  62. selected: true
  63. },{
  64. name: 'nav 2',
  65. icon: 'video-camera'
  66. },{
  67. name: 'nav 3',
  68. icon: 'upload'
  69. }]
  70. }
  71. }
  72. }
  73. </script>

固定头部

一般用于固定顶部导航,方便页面切换。

  1. <template>
  2. <div class="browser-mockup with-url">
  3. <iframe class="browser-content" src="./#/demo/layout-fixed" frameborder="0"></iframe>
  4. </div>
  5. </template>
  6. <style>
  7. #components-layout-demo-fixed .logo {
  8. width: 120px;
  9. height: 31px;
  10. background: #333;
  11. border-radius: 6px;
  12. margin: 16px 24px 16px 0;
  13. float: left;
  14. }
  15. </style>
  16. <script>
  17. export default {
  18. data() {
  19. return {
  20. menuData6: [{
  21. name: 'nav 1'
  22. },{
  23. name: 'nav 2',
  24. selected: true
  25. },{
  26. name: 'nav 3'
  27. }]
  28. }
  29. }
  30. }
  31. </script>

固定侧边栏

当内容较长时,使用固定侧边栏可以提供更好的体验。

  1. <template>
  2. <div class="browser-mockup with-url">
  3. <iframe class="browser-content" src="./#/demo/layout-fixed-sider" frameborder="0"></iframe>
  4. </div>
  5. </template>
  6. <style>
  7. #components-layout-demo-fixed-sider .logo {
  8. height: 32px;
  9. background: #333;
  10. border-radius: 6px;
  11. margin: 16px;
  12. }
  13. </style>
  14. <script>
  15. export default {
  16. data() {
  17. return {
  18. menuData7: [{
  19. name: 'nav 1',
  20. icon: 'user',
  21. }, {
  22. name: 'nav 2',
  23. icon: 'video-camera',
  24. }, {
  25. name: 'nav 3',
  26. icon: 'upload',
  27. }, {
  28. name: 'nav 4',
  29. icon: 'bar-chart',
  30. selected: true,
  31. }, {
  32. name: 'nav 5',
  33. icon: 'cloud-o',
  34. }, {
  35. name: 'nav 6',
  36. icon: 'appstore-o',
  37. }, {
  38. name: 'nav 7',
  39. icon: 'team',
  40. }, {
  41. name: 'nav 8',
  42. icon: 'shop',
  43. }]
  44. }
  45. }
  46. }
  47. </script>

API

Sider Props

成员说明类型默认值
collapsed当前收起状态,可用v-modelBooleanfalse
collapsible是否可收起Booleanfalse
trigger是否显示trigger,collapsible 为 true 时有效,设置为 false 时隐藏 triggerBoolean-
width宽度Number200
collapsedWidth收缩宽度,仅当 collapsed: true 时生效Number64
breakpoint触发响应式布局的断点Enum { 'xs', 'sm', 'md', 'lg', 'xl' }-

Sider Events

事件说明回调参数
collapse展开-收起时触发collapsed,当前收起状态