Skip to content

布局

你可以选择页面布局。有 3 个布局选项:docpagehome。如果未指定任何内容,则页面被视为 doc 页面。

yaml
---
layout: doc
---

Doc 布局

选项 doc 是默认布局,它将整个 Markdown 内容样式化为"文档"外观。它的工作原理是将整个内容包装在 vp-doc css 类中,并将样式应用于其下的元素。

几乎所有通用元素(如 ph2)都获得特殊样式。因此,请记住,如果你在 Markdown 内容中添加任何自定义 HTML,这些也将受到这些样式的影响。

它还提供文档特定功能,如:

  • 编辑链接
  • 上一页下一页链接
  • Outline
  • Carbon Ads

Page 布局

选项 page 被视为"空白页面"。Markdown 仍将被解析,所有 Markdown 扩展 的工作方式与 doc 布局相同,但它不会获得任何默认样式。

页面布局将让你样式化所有内容而不受 VitePress 主题影响。当你想创建自己的自定义页面时,这很有用。

请注意,即使在此布局中,如果页面具有匹配的侧边栏配置,侧边栏仍将显示。

Home 布局

选项 home 将生成模板化的"主页"。在此布局中,你可以设置额外的选项,如 herofeatures 以进一步自定义内容。请访问默认主题:主页了解更多详细信息。

无布局

如果你不想要任何布局,你可以通过 frontmatter 传递 layout: false。如果你想要一个完全自定义的着陆页,这个选项很有帮助(没有侧边栏、导航栏或页脚的默认样式)。

自定义布局

你也可以使用自定义布局:

md
---
layout: foo
---

这将寻找名为 foo 的注册组件。例如,如果你的组件位于 .vitepress/theme/layouts/foo.vue,你需要将其注册到你的主题中:

js
// .vitepress/theme/index.js
import DefaultTheme from 'vitepress/theme'
import Foo from './layouts/foo.vue'

export default {
  extends: DefaultTheme,
  Layout: Foo // <- 这里
}

或者你可以混合使用:

js
// .vitepress/theme/index.js
import DefaultTheme from 'vitepress/theme'
import Foo from './layouts/foo.vue'

export default {
  extends: DefaultTheme,
  Layout() {
    return h(DefaultTheme.Layout, null, {
      // https://vitepress.dev/guide/extending-default-theme#layout-slots
    })
  },
  enhanceApp({ app }) {
    app.component('foo', Foo)
  }
}

布局插槽

VitePress 的默认主题的 Layout 组件有一些插槽,可用于在页面的某些位置注入内容。以下是可用插槽的示例:

js
// .vitepress/theme/index.js
import DefaultTheme from 'vitepress/theme'
import MyLayout from './MyLayout.vue'

export default {
  extends: DefaultTheme,
  Layout: MyLayout
}
vue
<!--.vitepress/theme/MyLayout.vue-->
<script setup>
import DefaultTheme from 'vitepress/theme'

const { Layout } = DefaultTheme
</script>

<template>
  <Layout>
    <template #aside-outline-before>
      My custom sidebar top content
    </template>
  </Layout>
</template>

或者你可以使用渲染函数。

js
// .vitepress/theme/index.js
import { h } from 'vue'
import DefaultTheme from 'vitepress/theme'
import MyComponent from './MyComponent.vue'

export default {
  extends: DefaultTheme,
  Layout() {
    return h(DefaultTheme.Layout, null, {
      'aside-outline-before': () => h(MyComponent)
    })
  }
}

VitePress 默认主题布局的完整插槽列表:

layout: 'doc'(默认)时:

  • doc-top
  • doc-bottom
  • doc-footer-before
  • doc-before
  • doc-after
  • sidebar-nav-before
  • sidebar-nav-after
  • aside-top
  • aside-bottom
  • aside-outline-before
  • aside-outline-after
  • aside-ads-before
  • aside-ads-after

layout: 'home' 时:

  • home-hero-before
  • home-hero-info-before
  • home-hero-info
  • home-hero-info-after
  • home-hero-actions-before
  • home-hero-actions-after
  • home-hero-image
  • home-hero-after
  • home-features-before
  • home-features-after

layout: 'page' 时:

  • page-top
  • page-bottom

总是:

  • layout-top
  • layout-bottom
  • nav-bar-title-before
  • nav-bar-title-after
  • nav-bar-content-before
  • nav-bar-content-after
  • nav-screen-content-before
  • nav-screen-content-after

条件插槽

某些插槽可能会根据页面大小有条件地呈现。

目前有 4 个断点:

  • mobile768px
  • tablet960px
  • laptop1280px
  • desktop1440px

每个断点键可以作为插槽名称的后缀(用 - 分隔)。

这里有一个例子,只在桌面视口大小上呈现组件:

js
// .vitepress/theme/index.js
import { h } from 'vue'
import DefaultTheme from 'vitepress/theme'
import MyComponent from './MyComponent.vue'

export default {
  extends: DefaultTheme,
  Layout() {
    return h(DefaultTheme.Layout, null, {
      'aside-outline-after-desktop': () => h(MyComponent)
    })
  }
}

vitepress开发指南