HTML转换器可以配置为将样式表的CSS直接嵌入到HTML中、链接到样式表文件,或者完全禁用它。无论您是使用默认样式表还是自定义样式表,这些模式都是可用的。本页面涉及控制应用样式表的文档属性。

Important
HTML转换器只会在生成独立的HTML文档时应用样式表。这是因为样式表会被放置在HTML的`<head>`元素内部,而转换器仅在生成独立输出时创建该元素。

嵌入样式表

安全模式为server或更低时,HTML转换器的默认行为是读取样式表文件,将其内容封装在`<style>`元素中,并直接嵌入到生成的HTML的`<head>`元素中。这个默认设置使得HTML更具可移植性,因为如果你移动了文件,你不会丢失样式表。

然而,如果安全模式是安全的,转换器将会链接到样式表文件。如果在生成的HTML中你预期嵌入样式表的地方看到了一个指向样式表文件的链接,请检查你的安全模式设置。

无论是使用默认样式表还是自定义样式表,相同的两条规则都适用。

您已经知道当安全模式为安全时,HTML转换器会链接到样式表。然而,不依赖于安全模式也可以启用这种行为。如果你正在将多个AsciiDoc文档转换为HTML,并希望它们都使用同一个样式表,这可能会有益。这也可以使检查HTML变得简单一些。

如果设置了`linkcss`文档属性,转换器将链接到样式表而不是嵌入它。为了链接到样式表,转换器使用了一个通过`rel="stylesheet"`属性专门化的`<link>`元素。`href`属性将使用相对路径引用样式表。

linkcss`文档属性必须在标题的末尾设置才能生效。一种设置属性的方法是在文档头部设置:

在文档头部设置的linkcss属性
Unresolved directive in stylesheet-modes.adoc - include::example$my-document.adoc[tag=title]
:linkcss:
Unresolved directive in stylesheet-modes.adoc - include::example$my-document.adoc[tag=body]

您也可以使用API或CLI(如下所示)设置`linkcss`:

$ asciidoctor -a linkcss my-document.adoc

无论哪种情况,如果你检查输出文件[path]_my-document.html_中的`<head>`元素,你会看到HTML链接到了样式表。

my-document.html
<link rel="stylesheet" href="./asciidoctor.css">

由于我们没有指定样式表,转换器链接到默认的样式表。但是这个样式表在哪里呢?让我们找出来。

将样式表复制到输出目录

如果您要链接到样式表文件,样式表文件必须在引用的路径上可用,这样浏览器才能访问它。对于简单的情况,Asciidoctor 会为您处理这个问题。

如果安全模式是服务器级别或更低,且设置了`linkcss`文档属性,Asciidoctor将会把样式表复制到输出目录,以便HTML能够链接到它。当使用默认样式表时,Asciidoctor会将CSS写入到输出目录中的[.path]_asciidoctor.css_文件。如果你指定了一个自定义的样式表,Asciidoctor将复制该文件,保留文件的名称。即使你指定了一个与源文件不同目录的输出文件,这个工具仍然有效。

共同的责任

转换器负责嵌入或链接到样式表文件的任务,但是处理复制样式表的是处理器本身(而不是转换器)。

如果安全模式是安全的,Asciidoctor将不会复制样式表文件,因此,链接到它的链接将会断开(除非,当然,你单独复制该文件)。

我们来回顾一下前面的例子:

$ asciidoctor -a linkcss my-document.adoc

执行这个命令后,样式表文件 asciidoctor.css 将被复制到生成的HTML文件 my-document.html 所在的同一个目录中。输入命令 ls 来查看目录中的文件。你应该看到一个名为 asciidoctor.css 的文件。

$ ls asciidoctor.css my-document.adoc my-document.html

当你在浏览器中查看HTML文件时,你应该观察到默认的样式表已被应用。

是否复制

Asciidoctor是否将样式表复制到输出目录由`copycss`文档属性控制。除非安全模式是安全的,否则默认设置`copycss`属性。

为了防止Asciidoctor在任何安全模式下都会复制样式表,请取消设置`copycss`文档属性。

copycss` 文档属性必须在页眉结束前取消设置才能生效。一种方法是在文档页眉中取消设置该属性:

在文档头部取消设置copycss属性
Unresolved directive in stylesheet-modes.adoc - include::example$my-document.adoc[tag=title]
:linkcss:
:!copycss:
Unresolved directive in stylesheet-modes.adoc - include::example$my-document.adoc[tag=body]

您也可以通过API或CLI取消设置`copycss`(如下所示):

$ asciidoctor -a linkcss -a copycss! my-document.adoc

无论哪种情况,如果你检查输出目录,你会发现样式表文件[.path]_asciidoctor.css_缺失(除非它已经存在)。

我们会在自定义样式表页面上再次看到`copycss`属性,作为一种覆盖要复制的样式表位置的方法。

禁用样式表

在生成嵌入式HTML时,样式表实际上是禁用的,因为嵌入式HTML不包括`<head>`元素。如果您不希望转换器在独立HTML中包含样式表,请使用CLI取消设置`stylesheet`属性。

$ asciidoctor -a stylesheet! my-document.adoc

你必须取消设置`stylesheet`属性的原因是因为它默认是设置的(为空值)。当`stylesheet`属性被设置但为空时,HTML转换器会使用默认的样式表。通过取消设置这个属性,我们告诉转换器完全不使用样式表。

当你查看生成的HTML文件,my-document.html 时,你会看到裸露的HTML,没有应用任何样式,如下所示:

无样式表
Note
stylesheet 属性未设置时,linkcsscopycss 属性将被忽略。

现在既然你有了一个干净的画布,让我们来学习如何应用你自己的自定义样式表吧。