自定义主题

更改主题以满足您的需求。


如果您想对现有主题进行一些调整,则无需从头开始创建自己的主题。对于只需一些 CSS 和/或 JavaScript 的微调,您可以使用 docs_dir。但是,对于更复杂的自定义(包括覆盖模板),您将需要使用主题 custom_dir设置。

使用 docs_dir

extra_cssextra_javascript 配置选项可用于对现有主题进行调整和自定义。要使用它们,您只需在文档目录中包含 CSS 或 JavaScript 文件即可。

例如,要更改文档中标题的颜色,请创建一个名为(例如)style.css 的文件,并将其放在文档 Markdown 旁边。在该文件中添加以下 CSS。

h1 {
  color: red;
}

然后您需要将其添加到 mkdocs.yml

extra_css:
  - style.css

完成这些更改后,在运行 mkdocs serve 时应该可以看到它们 - 如果您已经运行了它,您应该会看到 CSS 更改被自动拾取,文档将更新。

注意

任何额外的 CSS 或 JavaScript 文件都将在页面内容之后添加到生成的 HTML 文档中。如果您希望包含 JavaScript 库,您可能可以使用主题custom_dir更好地包含库。

使用主题 custom_dir

theme.custom_dir 配置选项可用于指向一个目录,其中包含覆盖父主题中的文件的文件。父主题将是 theme.name 配置选项中定义的主题。custom_dir 中与父主题中文件同名的任何文件将替换父主题中同名文件。custom_dir 中的任何其他文件都将添加到父主题中。custom_dir 的内容应与父主题的目录结构相匹配。您可以包含模板、JavaScript 文件、CSS 文件、图像、字体或主题中包含的任何其他媒体。

注意

为了使此功能正常工作,theme.name 设置必须设置为已知的已安装主题。如果 name 设置改为设置为 null(或未定义),则没有主题可以覆盖,并且 custom_dir 的内容必须是一个完整的独立主题。有关更多信息,请参阅主题开发者指南

例如,mkdocs 主题(浏览源代码)包含以下目录结构(部分)

- css\
- fonts\
- img\
  - favicon.ico
  - grid.png
- js\
- 404.html
- base.html
- content.html
- nav-sub.html
- nav.html
- toc.html

要覆盖该主题中包含的任何文件,请在您的 docs_dir 旁边创建一个新目录

mkdir custom_theme

然后将您的 mkdocs.yml 配置文件指向新目录

theme:
  name: mkdocs
  custom_dir: custom_theme/

要覆盖 404 错误页面(“文件未找到”),请在 custom_theme 目录中添加一个名为 404.html 的新模板文件。有关模板中可以包含的内容的信息,请查看主题开发者指南

要覆盖网站图标,您可以在 custom_theme/img/favicon.ico 中添加一个新的图标文件。

要包含 JavaScript 库,请将库复制到 custom_theme/js/ 目录中。

您的目录结构现在应该如下所示

- docs/
  - index.html
- custom_theme/
  - img/
    - favicon.ico
  - js/
    - somelib.js
  - 404.html
- config.yml

注意

父主题(在 name 中定义)中包含但在 custom_dir 中未包含的任何文件仍将被使用。custom_dir 仅会覆盖/替换父主题中的文件。如果您想删除文件或从头开始构建主题,那么您应该查看主题开发者指南

覆盖模板块

内置主题在其模板块中实现了许多部分,这些块可以在 main.html 模板中单独覆盖。只需在您的 custom_dir 中创建一个 main.html 模板文件,并在该文件中定义替换块即可。只需确保 main.html 扩展 base.html。例如,要更改 MkDocs 主题的标题,您的替换 main.html 模板将包含以下内容

{% extends "base.html" %}

{% block htmltitle %}
<title>Custom title goes here</title>
{% endblock %}

在上面的示例中,您在自定义 main.html 文件中定义的 htmltitle 块将用于代替父主题中定义的默认 htmltitle 块。您可以重新定义任意数量的块,只要这些块在父主题中定义即可。例如,您可以用另一个服务的 Google Analytics 脚本替换 Google Analytics 脚本,或用您自己的搜索功能替换搜索功能。您需要查阅您正在使用的父主题以确定哪些块可供覆盖。MkDocs 和 ReadTheDocs 主题提供以下块

  • site_meta:包含文档头部中的元标签。
  • htmltitle:包含文档头部中的页面标题。
  • styles:包含样式表的链接标签。
  • libs:包含页面标题中包含的 JavaScript 库(jQuery 等)。
  • scripts:包含页面加载后应执行的 JavaScript 脚本。
  • analytics:包含分析脚本。
  • extrahead<head> 中的空块,用于插入自定义标签/脚本等。
  • site_name:包含导航栏中的网站名称。
  • site_nav:包含导航栏中的网站导航。
  • search_button:包含导航栏中的搜索框。
  • next_prev:包含导航栏中的下一页和上一页按钮。
  • repo:包含导航栏中的仓库链接。
  • content:包含页面的页面内容和目录。
  • footer:包含页面页脚。

您可能需要查看源模板文件以确保您的修改与网站结构兼容。有关您可以在自定义块中使用的变量列表,请参阅模板变量。有关块的更完整说明,请查看Jinja 文档

组合 custom_dir 和模板块

将 JavaScript 库添加到 custom_dir 将使其可用,但不会将其包含在 MkDocs 生成的页面中。因此,需要从 HTML 向库添加一个链接。

从上面的目录结构开始(已截断)

- docs/
- custom_theme/
  - js/
    - somelib.js
- config.yml

需要向模板添加一个指向 custom_theme/js/somelib.js 文件的链接。由于 somelib.js 是一个 JavaScript 库,因此它应该放在 libs 块中。但是,仅包含新脚本的新 libs 块将替换父模板中定义的块,并且父模板中对库的任何链接都将被删除。为了避免破坏模板,可以使用super 块,并在块内调用 super

{% extends "base.html" %}

{% block libs %}
    {{ super() }}
    <script src="{{ base_url }}/js/somelib.js"></script>
{% endblock %}

请注意,使用了base_url 模板变量来确保链接始终相对于当前页面。

现在生成的页面将包含指向模板提供的库以及 custom_dir 中包含的库的链接。对 custom_dir 中包含的任何其他 CSS 文件也需要这样做。