--- title: MDN Web 文档写作规范 slug: MDN/Guidelines/Writing_style_guide tags: - MDN - MDN Meta - MDN Web 文档 - MDN 规范 - 写作规范 - 准则 - 教程 - 文档 - 规范 translation_of: MDN/Guidelines/Writing_style_guide original_slug: MDN/Guidelines/Style_guide ---
{{IncludeSubnav("/zh-CN/docs/MDN")}}
为了提供更加组织化、标准化且易于阅读的文档,MDN Web 文档写作规范明确了文本的组织方式、拼写规则、固定格式等内容,不过这些内容只是指导性的而不是严格的规定,因为比起格式我们对内容更感兴趣,所以没有必要在参与贡献之前强迫自己学习本规范。但是如果有一位勤劳的志愿者在之后编辑了你的文档使它更加符合本规范,也请不要感到惊讶或难过。
如果你正在寻找一个特定类型的页面应该如何构建的相关细节,请参阅MDN Web 文档页面布局规范。
本规范主要适用于英文文档。 其他语言可能也有(也欢迎创建)相应的规范。 这些应该作为子页面发布在各个本地化小组的页面中。
译注:本文的写作规范虽说是针对英文所写,但是其中的不少内容也适用于中文,可花点时间阅读一下。另外,中文翻译时的规范请参见《翻译术语表和翻译规范》。
对于那些为MDN以外的站点内容所编写的规范,请参考 Mozilla 统一规范。
为了使文档保持更好的一致性,所有主流的写作规范指南都是从一些比较基本的写作规范开始的。以下几个小节所概述的这些基本规范内容应该会对你有很大帮助。
页面标题不仅会在搜索时用到,在页面顶部的面包屑路径中也会被用来表示文档的层级结构。页面标题(就是显示在页面顶部以及搜索结果中标题的部分)可以与页面URL“<locale>/docs/”之后的“铭牌(slug)”部分不同.
页面的标题和章节的标头应当使用语句式大写(只大写第一个单词的首字母以及专有名词的首字母),而不应该使用标题式大写:
我们还有很多旧的页面是在这条规范确立之前就已经发布了的。所以只要你愿意,你随时可以更新它们的标题。我们也正在逐步完善它们。
页面的铭牌应该尽量简短,当创建一个新的层级时,新层级的铭牌最好只由一到两个单词组成。
而页面的标题长度并没有什么严格的限制,只要合理并且表意明确即可。
当你要给某个新的主题或主体添加文章时,你通常需要创建一个引导页,然后再把要添加的文章作为子页面添加进去。引导页开篇应当用一两段话来描述一下当前主题或技术,然后添加一个子页面的目录列表,并简要描述每个页面的内容。你可以使用一些我们已经编写好的宏把相关的子页面自动插入到目录列表中。
例如,JavaScript手册,其结构如下:
尽量避免把文章内容放置在层次结构的顶层,这会降低网站的访问速度,同时搜索和导航的效率也会下降。
在写任何文档时,知道该写多少是很重要的。如果你写的长篇大论,文章读起来就会冗长无味,更不会有人愿意使用它。保持文章内容适量很重要,原因有很多。这其中的原因就有:为了确保读者能够找到他们真正想要的信息,以及为搜索引擎提供足够的优质素材来对文章进行分析和排名。我们将在这里讨论前者(提供读者可能需要的信息)。如果想了解如何让文章更好地被搜索引擎分类和排名,查阅文章How to write for SEO on MDN。
我们的目标是在页面中包含读者可能需要的所有信息,但又不至于太过冗长。为了实现这个目标,我们给出了一些建议。
请记住,这些只是指导性的。其中某些建议并不适用于所有状况。当然你应该始终为你的读者着想。例如,在一篇介绍高级网络技术的文章中,通常不需要像介绍网络编程的文章那样包含过多的网络基本概念。
在开篇或第一个段落标题之前给出文章的简介,以使读者快速了解文章中是否包含他们感兴趣的内容。在指南或教程类的文章中,简介还应该让读者明白文章覆盖了哪些主题,以及文章期望读者能够从中了解到哪些知识。简介中应该包含文章中介绍和讨论的技术、API,并提供相关的链接,同时还应该提供可能会遇到的情况的提示。
下面这个例子中的简介太过于简短,很多信息都没有包含进来,比如“stroke text”是什么意思,文本会在哪里等。
CanvasRenderingContext2D.strokeText()
draws a string.
下面是上面那个简介的修改版,但是这次它又太过冗长了。其中包含了过多的细节,并且还包含了很多其他方法和属性,但实际上它应该将重点聚焦在 strokeText()
方法上,然后给出详细介绍它的文章的链接即可。
译注:作为例子,内容并不重要,所以就不逐句翻译了。
When called, the Canvas 2D API method CanvasRenderingContext2D.strokeText()
strokes the characters in the specified string beginning at the coordinates specified, using the current pen color. In the terminology of computer graphics, "stroking" text means to draw the outlines of the glyphs in the string without filling in the contents of each character with color.
The text is drawn using the context's current font as specified in the context's {{domxref("CanvasRenderingContext2D.font", "font")}} property.
The placement of the text relative to the specified coordinates are determined by the context's textAlign
, textBaseline
, and direction
properties. textAlign
controls the placement of the string relative to the X coordinate specified; if the value is "center"
, then the string is drawn starting at x - (stringWidth / 2)
, placing the specified X-coordinate in the middle of the string. If the value is "left"
, the string is drawn starting at the specified value of x
. And if textAlign
is "right"
, the text is drawn such that it ends at the specified X-coordinate.
(etc etc etc...)
You can, optionally, provide a fourth parameter that lets you specify a maximum width for the string, in pixels. If you provide this parameter, the text is compressed horizontally or scaled (or otherwise adjusted) to fit inside a space that wide when being drawn.
You can call the fillText()
method to draw a string's characters as filled with color instead of only drawing the outlines of the characters.
下面这个简介比前两个要好很多。
The {{domxref("CanvasRenderingContext2D")}} method strokeText()
, part of the Canvas 2D API, strokes—that is, draws the outlines of—the characters of a specified string, anchored at the position indicated by the given X and Y coordinates. The text is drawn using the context's current {{domxref("CanvasRenderingContext2D.font", "font")}}, and is justified and aligned according to the {{domxref("CanvasRenderingContext2D.textAlign", "textAlign")}}, {{domxref("CanvasRenderingContext2D.textBaseline", "textBaseline")}}, and {{domxref("CanvasRenderingContext2D.direction", "direction")}} properties.
For more details and further examples, see {{SectionOnPage("/en-US/docs/Learn/JavaScript/Client-side_web_APIs/Drawing_graphics", "Text")}} in the Learning Area as well as our main article on the subject, Drawing text.
文章应该尽量多提供一些示例。实际上,大多数文章都应该包含不止一个例子。使用例子来说明每个参数的用途或每个可能的边界条件是很有必要的。同时还应该用例子来演示常见问题的解决方法,以及应该如何解决使用过程中可能碰到的坑。
每个例子都应该先给出解释,说明它做了什么,以及读者在阅读或动手尝试之前需要了解的内容。
另外,每段示例代码都应该就其工作原理给出说明。最好将一段较长的代码分解成多个较小的部分,并提供每个部分的说明,说明时注意细节的层次。如果代码很简单并且不直接涉及到当前 API,可以只给出一个简单的介绍,说明其用途,以及为何要把它放在这里;而如果代码比较复杂、或用到了当前的 API、或在技术上比较有创造性,那么你应该提供更详细的说明。
如果使用的是在线演示的方式,则可以将 HTML、CSS、JavaScript 拆分到不同的 {{HTMLElement("pre")}} 中,它们在运行时会自动组合到一起,但使用这种方式每个里面都可以有自己的说明。因此这是一种很好很强大的方式。
如果文章过短,那么搜索引擎可能会难以甚至无法对其建立关键字索引。一般来说,文章的主体内容应该至少包含 250-300 个单词。但是也不要对内容确实很少的文章进行刻意的扩充,在可能的情况下尽量遵守该指导原则即可。
对于小节的标题,应使用从大到小的方式来定义级别:{{HTMLElement("h2")}}、{{HTMLElement("h3")}}、{{HTMLElement("h4")}} 这样,并且中间不要跳过某一级。因为 H1 已用于文章的标题,因此小节的标题应该从 H2 开始。如果你的文章中小节的层次超过了 3 到 4 级,那么你可能需要考虑将整篇文章拆分成几篇小的文章,然后用一个引导页给出这些文章的链接,并用 {{TemplateLink("Next")}}、{{TemplateLink("Previous")}}、{{TemplateLink("PreviousNext")}} 宏为它们创建导航。
按下回车键(Enter 或 Return)可以开始一个新的段落。如果只是想换行而不是另起一段,可以按住 Shift 并敲下回车。
不要创建只包含一个小节的子级别,如果只有一个小节,那么拆分主题就是没有意义的。至少包含两个小节,要么就不要拆分。
不要让两个小节标题紧挨在一起,这样看起来很丑。每个小节标题的下面至少要放上一段对后面各子小节的简短说明,这会对阅读的人很有帮助。
列表的格式应该在所有文章中保持一致,并且应在列表中恰当使用标点和结构合理的句子。不管是哪种类型的列表,都需要对格式进行适当的调整。下面的内容说明了每种列表之间的不同。
无序列表可以以简洁且有效的方式对内容进行分组显示。每个条目都会以类似“•”的符号来标识。在无序列表中要注意正确使用标点,尤其是每句的最后不要遗漏掉句号。应该以标准写作方式来对待无序列表。
下面是一个结构良好的无序列表的例子:
在这个例子中需要包括:
另一种情况,并跟上一些解释和说明。
可以看到,每个条目的格式都是一致的:首先显示一个“•”符号,然后列出一种情况,然后写上逗号,并在逗号后面添加一些对当前情况的简单说明。
有序列表用序号来标识每个条目。同样要注意应该在有序列表中使用适当的格式,保持列表的清晰和简洁,这一点与无序列表是类似的。但是有序列表中的某些条目内容可能会很多,因此正确使用标点就更为重要了,因为难免会遇到必须使用复杂句子的情况。
下面是一个结构良好的有序列表的例子:
为了创建一个好的有序列表,你需要:
- 以一个介绍性的标题开始,以引出后续的序列。我们可以在开始有序列表的序列之前提供这一内容。
- 开始创建各个序列,这些序列会用数字依次编号。这是有序列表的标准格式,能够很容易地被读者理解。有序列表中的某些条目内容可能会很多,因此正确使用标点是很重要的。
- 列表序列完成之后,应在后面再提供一段简短的总结。
这段内容就是一个总结。我们已经创建了一个简短的有序列表,解释了创建良好格式的有序列表应遵循的步骤。
有序列表基本都用来表示具有连续性关系的内容,因此应该先深入思考你要用这些内容达到什么目的,然后再去撰写。
可以使用“样式”下拉列表中的预定义样式来格式化你选定的内容。
“Note”样式用来强调重要提示,就像这个。
类似地,“Warning”样式用来创建一个警告框。
除非有特殊需要,否则请不要用 HTML 的 style
属性来手动给内容添加样式。如果你没有找到你需要的预定义样式,可以放置一个 Matrix 并寻求帮助。
这一小节只是讨论 MDN 文章中的示例代码的样式和格式问题,如果你想了解如何编写示例代码,请参考示例代码指南。
每级缩进都使用两个空格来缩进,并在所有的示例中保持一致。对于代码块的起始语句,应将开大括号“{”与当前语句写在一行上,比如:
if (condition) { /* handle the condition */ } else { /* handle the "else" case */ }
如果一行的代码很长,应在适当的地方换行以避免出现水平滚动条。下面是一个例子:
if (class.CONDITION || class.OTHER_CONDITION || class.SOME_OTHER_CONDITION || class.YET_ANOTHER_CONDITION ) { /* something */ } var toolkitProfileService = Components.classes["@mozilla.org/toolkit/profile-service;1"] .createInstance(Components.interfaces.nsIToolkitProfileService);
对于函数名、变量名、方法名等,应使用“Inline Code”按钮(编辑器中显示为“<>”的按钮)将其设置为内联代码格式(内联代码使用的是 {{HTMLElement("code")}} 元素)。比如:frenchText()
函数。
方法名后面应该加上小括号:doSomethingUseful()
,这样会比较容易将方法与其他代码元素区分开来。
对于整行或多行代码,此时别再使用 {{HTMLElement("code")}} 元素来格式化了,而应该对其进行语法高亮。点击语法高亮器按钮(图标是两个代码块),从语言下拉列表中选择一种合适的语言即可。见右图。
下面的例子使用了 JavaScript 语法高亮:
for (var i = 0, j = 9; i <= 9; i++, j--) document.writeln("a[" + i + "][" + j + "]= " + a[i][j]);
如果没有在下拉列表中找到你需要的语言,可以选择第一项“没有高亮”,此时代码显示的是不带高亮效果的普通样式:
x = 42;
如果你想插入一段语法定义,可以使用样式下拉列表中的“Syntax Box”选项。语法定义的样式与普通代码的样式会有所区别。
有些情况下需要用到 <pre>
区块而不是代码区块,此时不会进行语法高亮,也不会显示行号。比如你需要显示树形结构,就可以使用 <pre>
:
root/ folder1/ file1 folder2/ file2 file3
插入方法是要先点击”pre“按钮,然后输入想要的内容即可。
HTML 元素的样式有一套自己的规则。遵守这些规则可以让元素及其组件的描述方式保持统一,并且还可以保证能够正确链接到各元素的详细文档页面。
<title>
。<input>
元素的 type 属性设置为 email
或 tel
时……一般的拉丁文缩写(如:”etc.“、”i.e.“、”e.g.“)都可以用在起补充说明的括号里面。这时应在缩写中添加句号,后面加上逗号或其他恰当的标点。
在普通的句子中(即括号的外面),请使用与缩写等价的英文单词或短语。
缩写 | 拉丁文 | 英文 |
---|---|---|
cf. | confer | compare |
e.g. | exempli gratia | for example |
et al. | et alii | and others |
etc. | et cetera | and so forth, and so on |
i.e. | id est | that is, in other words |
N.B. | nota bene | note well |
P.S. | post scriptum | postscript |
在使用前请仔细思考使用拉丁文缩写是否真的能带来好处。上面列出的某些缩写很少用到,很多读者可能不知道其意思,还有一些读者可能会分不清其中的某些缩写。另外,如果你决定使用缩写,那么请确保你的用法是正确的。比如,一个很多人经常会犯的错误是将“e.g.”和“i.e.”弄混。
在文章内容中请使用标准英文大写规则,比如对于”World Wide Web“需大写每个单词的首字母。如果”web“和”internet“是单独使用或作为修饰词使用,那么将其全小写也可以——这一指导原则是后来修改过的,所以在 MDN 中你也许会看到很多首字母大写的”Web“和”Internet“。当你编辑文章的时候遇到这种情况,可以随它去,也可以随手修改一下。但是仅仅只是为了修改一下大写的话就没必要专门去编辑一下了。
对于键盘按键,应该使用普通的大写规则,而不是全大写。比如,是”Enter“而不是”ENTER“。
我们倾向于宽松的写作风格,所以你可以按你的喜好来决定是否使用简写(如”don't“、”can't“、”shouldn't“)。
请使用英文风格的复数形式,不要使用拉丁文或希腊文的形式。
当两个单词连起来组成另一个单词时,如果前一个单词的最后一个字母是元音字母,并且与后一个单词的第一个字母相同时,应使用连字符。
在任何性别无关的场合使用性别中立的表述方式是一种比较好的做法,这样可以使你的文章具有普适性。举个例子,如果你正在写的是关于某个男人的行为,那么使用”他“来指代是没问题的;但如果内容并没有特指是男还是女,那么再使用”他“就不太恰当了。
让我们再看几个例子:
弹出一个对话框,让用户确认他是否允许网页使用他的网络摄像头。
弹出一个对话框,让用户确认她是否允许网页使用她的网络摄像头。
这两句话使用的都是特定性别的表述方式,我们可以将其修改为性别中立的代词:
弹出一个对话框,让用户确认他们是否允许网页使用他们的网络摄像头。
译注:这里原文为”they“和”their“,在英文中是性别中立的代词。而中文中如果上下文没有强调性别,则”他们“也具有性别中立性。
MDN 允许使用这种通用性的语法(尽管在正式用法中这一点还存在争议)来弥补英语在表达中立性别时的不足。将第三人称复数的代词用来表示性别中立代词(即使用”they“、”them“、”their“、”theirs“)是可以接受的,也就是通常所说的”单数形式的‘they’“。
你还可以同时写上两个性别:
弹出一个对话框,让用户确认他或她是否允许网页使用他/她的网络摄像头。
译注:中文里一般不这么用,所以如果在翻译中遇到这种情况,请简单翻译为”他“即可。”中文翻译规范“一文的”误解:100% 翻译 = 准确“一节中也提到了这个问题。
或者使用复数形式的”users“:
弹出一个对话框,让用户(译注:原文为”users“)确认他们是否允许网页使用他们的网络摄像头。
当然,最好的方法还是重写句子,去掉其中的代词:
弹出一个对话框,询问用户是否允许网页对网络摄像头的访问。
弹出一个询问用户以获取网络摄像头访问权限的对话框。
最后一种方法(译注:意指去除代词的方法)可能更好一些,因为它不但语法上更加正确,而且还能消除不同语言处理性别问题时所带来的复杂性,因为不同语言对性别的处理可能有不同的规则。因此这种方法无论是对读者(译注:意为阅读英语原文的非英语读者)还是翻译者来说都可以让翻译更简单。
请用”January 1, 1990“这样的形式来表达日期(不包括代码中的日期)。
或者你也可以使用”YYYY/MM/DD“的形式:
请使用”1990s“这种形式来表示年代,但不要使用撇号:
数词的复数直接在后面加”s“,同样不要使用撇号:
应该仅在数字的位数大于等于 5 位时才使用逗号分隔符:
请使用连续逗号。连续逗号(也叫牛津逗号)是在一个包含三个或以上单词或短语的序列中位于连词前的那个逗号。
译注:这种情况在翻译时应将逗号翻译为顿号。”中文翻译规范“一文的”标点符号“一节中也提到了这个问题。
这一点与 Mozilla 统一规范有冲突,后者要求不要使用连续逗号。MDN 是这一规则的特例。
如果一个单词具有多种拼写,请使用美国英语的拼写。一般来说,Dictionary.com 上的第一个拼写是符合此要求的,除非单词本身即为其他变体形式或主要用于美国以外的国家中。例如,如果你去查”honour“,你会看到一个标注”Chiefly British“,并在其后有一个指向美语标准形式的链接。请不要使用其他的拼写变体。
请使用”元素“来表示 HTML 和 XML 元素,不要使用”标记“。另外,请在元素名称两边使用尖括号 ”<>“ 括起来,并使用 {{HTMLElement("code")}} 样式。当文章中第一次出现某个元素的时候,应该用 {{TemplateLink("HTMLElement")}} 宏创建一个指向该元素文档的链接(除非你正在撰写的恰好是该元素的文档页面)。
在 MDN 上推荐使用 parameters 来表示函数的参数,为了保持一致性,如果可能的话请尽量避免使用”arguments“。
在说明一系列操作步骤时,应使用祈使语气来描述用户的操作,并用 UI 组件的名称和其元素类型来标识操作对象。
推荐使用主动语态,但被动语态也可以接受,只是可能会让文章看起来不太正式。建议选择一种并在文章中尽量保持统一。
链接是 wiki 中最重要的功能元素之一。这里会介绍一些链接的基本内容,在我们的编辑器指南中的在MDN中创建和编辑链接这篇文章中有关于链接的详细介绍。
我们鼓励适当的添加一些相关文章的链接,这样可以提高页面导航的效率和内容的易发现性。链接不但可以指向其他 MDN 页面(内部链接),也可以指向其他网站的页面(外部链接)。
有两种创建链接的方式:点击编辑器工具栏中的“插入/编辑超链接”按钮(也可以按 Ctrl+K 键(在 Mac 上是 Cmd-K 键)),或者使用 MDN 强大的宏功能来自动创建或根据输入的内容创建链接。
下面列出的指导意见可以帮助你确定创建链接时使用什么样的链接文本:
为了保险起见,应始终使用下面的语法来创建链接:
http://
https://
ftp://
mailto:
其他语法可能无法工作或者不受支持,并有可能会被编辑人员删掉。
强调一下,不要使用 about:
和 chrome://
等语法,因为它们可能无法生效。类似地, javascript:
可能会被最新的浏览器阻止,jar:
同理。
标签用来提供与页面有关的元数据信息,或者用来标记当前页面在某方面仍需要完善。wiki 中的每个页面都应该包含标签。在如何合理地标记页面这篇指南中有更多关于使用标签的信息。
在编辑文章时,标签位于编辑器的底部,看起来是这样的:
要添加标签,点击标签列表最后的”新建标签……“按钮,然后输入要添加的标签名称。标签会随着你的输入显示自动完成提示。最后按下回车键来确认并提交新标签。可以为一篇文章添加任意多个标签。举个例子,一篇关于在 AJAX 编程中使用 JavaScript 的文章可能需要添加”JavaScript“和”AJAX“这两个标签。
要删除一个标签,点击标签上的”X“图标即可。
标签还可以用于将文章标记为需要某些后续的工作,用来跟踪文章质量和内容方面的信息。
可使用下面的标签来标记不再使用的页面:
SEO 概要是对一篇文章的简短描述,它会在网页机器爬虫抓取到当前页面时告诉爬虫该文章的概要,当用户搜索到该页面时就会显示此概要信息。另外,在 MDN 内部通过宏来自动生成引导页的时候也会用到它。
默认情况下,文章的第一段内容会被当成是 SEO 概要。但是你可以在编辑器中使用“SEO Summary“样式来手动指定一段内容作为 SEO 概要。
引导页的层级位于网站层级的顶层,例如 CSS 和 HTML 的主页面就是引导页。引导页具有标准的格式,由以下 3 个部分组成:
译注:这里的链接原本是指向原文的”Writing a landing page overview“一节,但该节貌似已被删除了,所以链接已失效。这里我找到了一个与其内容相近的小节。
引导页中的链接列表部分有两列,其 HTML 代码的结构如下:
<div class="row topicpage-table"> <div class="section"> ... 左侧列 ... </div> <div class="section"> ... 右侧列 ... </div> </div>
左侧列的顶部是一个 <h2>
标题,用来说明此列的内容是当前主题所包含的文章列表(如”某某的文档和教程“),其下方则是具体的文章列表。该列的标题样式应使用 CSS 类 ”Documentation“,而下方的文章列表是一个 <dl>
列表,其中的每个 <dt>
都包含一个文章的链接和位于 <dd>
中的该目标文章的一两句话的说明。
右侧列则包含一或多个小节,各小节按以下顺序排列:
<<<当引导页的标准完成时需要继续完善本节内容>>>
在创建或编辑文章时,有时候使用图片会对文章内容有不少好处,特别是文章的技术性很强的时候。可以使用下面的方法来添加一个图片:
如果你在撰写过程中或在格式方面遇到了本文尚未提及的问题,我们建议你参考 Economist 网站的风格指南,如果还是不能解决问题,还可参考芝加哥论文格式。
如果有拼写方面的问题,请参考 Dictionary.com。本网站的拼写检查采用美国英语规则,因此请不要使用其他拼写规则(例如应该使用“color”而不是“colour”)。
我们会继续扩充本指南,因此如果你遇到了本文未提及的问题,请通过 MDC 邮件列表或项目带头人联系我们,让我们了解还需要加入哪些内容。
MDN 中常用的宏及其说明。
如果你对提高写作和编辑能力感兴趣,下面的资料会对你有所帮助: