假设您遇到 双标题 情况。 一个小标题在另一个大标题之上。 我想说,这种情况每天出现很多次吧。 您会选择什么 HTML? 我要是不说,取决于具体情况? 但是您是否考虑了所有选项? 这些选项在语义和无障碍方面如何发挥作用?
正如我们有时在这里做的那样,让我们来回顾一下这些选项。
视觉示例
假设这些不是页面上的 <h1>
。 并不是说其中一个是,事情就会有很大不同,但这只是为了设置场景。 我发现这种情况在小节或卡片中最为常见。
这里有一个例子,我的朋友前几天在聊天时提到的

这里有一个我前几天也做过的例子

这里是一个经典的卡片

<h3>
然后是 <h2>
选项 1:老式的 较小的标题在顶部,较大的标题在底部,显然 <h3>
总是比 <h2>
小,对吧?
<h3>Subheading</h3>
<h2>Heading</h2>
这可能是非常普遍的思路,也是我 最不喜欢的做法。
我更希望看到类名被使用,这样样式就可以隔离到这些类名中。
<h3 class="card-subhead">Subheading</h3>
<h2 class="card-head">Heading</h2>
不要根据纯粹的视觉处理来做出语义上的选择,尤其是那些影响无障碍性的选择。
更大的奇怪之处是根本使用两个标题元素。 对单个内容使用两个标题感觉不太对劲。 这种组合感觉就像:“嘿,这里有一个新的主要部分,然后这里还有一个副标题,因为在这个小节中还有更多副标题,所以这个副标题只是用于第一个小节。” 但是之后就没有其他小节了,也没有其他副标题了。 即使这并不奇怪,副标题在前的顺序也很奇怪。
如果您要使用两个不同的标题元素,在我看来,较小的标题更有可能作为 <h2>
更合理,这让我们想到......
<h2>
和 <h3>
选项 2:小而强大的 如果我们有类名,并且副标题在上下文中是更主要的标题,那么我们可以这样做
<h2 class="card-subheading">Subheading</h2>
<h3 class="card-heading">Heading</h3>
仅仅因为 <h2>
在视觉上较小并不意味着它不能在文档大纲中仍然是主要的标题。 如果您查看上面 CodePen 中的示例,标题“Context Switching”感觉比后面的句子更适合作为标题。 我认为在较小的标题上使用 <h2>
很好,并且使结构更加“正常”(我想) <h2>
在前。
但是,对一个部分使用两个标题仍然感觉很奇怪。
选项 3:一个标题,一个 div
也许这两个中只有一个需要是标题? 这对我来说总体上感觉更正确。 我之前肯定这样做过
<div class="card-subheading">Subheading</div>
<h3 class="card-heading">Heading</h3>
感觉还可以,除了副标题可能包含相关内容,如果人们通过屏幕阅读器导航到标题,并从那里开始阅读,他们可能会错过这些内容。 我想您可以交换视觉顺序......
<hgroup> <!-- hgroup is deprecated, just defiantly using it anyway -->
<h3 class="card-heading">Heading</h3>
<div class="card-subheading">Subheading</div>
</hgroup>
hgroup {
display: flex;
flex-direction: column;
}
hgroup .card-subheading {
/* Visually, put on top, without affecting source order */
order: -1;
}
但我认为以这种方式打乱视觉顺序通常是不好的,比如,对有视力的屏幕阅读器用户来说很尴尬。 所以不要告诉任何人我向你展示了这个。
选项 4:将所有内容都放在一个标题中
既然我们无论如何都只显示一个标题的内容,那么似乎只使用一个标题是正确的。
<h2>
<strong>Subheading</strong>
Heading
</h2>
在其中使用 <strong>
元素为我们提供了在 CSS 中进行相同类型样式化的钩子。 例如......
h2 strong {
display: block;
font-size: 75%;
opacity: 0.75;
}
这里的技巧是标题需要作为一个整体来运作/阅读。 因此,要么它们自然地一起阅读,要么您可以使用冒号 :
等等。
<h2>
<strong>New Podcast:</strong>
Struggling with Basic HTML
</h2>
ARIA 角色
事实证明,有一个专门用于字幕的 ARIA 角色
所以,就像
<h2 class="card-heading">Heading</h2>
<div role="doc-subtitle">Subheading</div>
我通常喜欢基于 ARIA 角色的样式(因为它要求正确使用它们),因此样式可以直接用它完成
[role="doc-subtitle"] { }
Steve 和 Léonie 的测试表明,浏览器通常将其视为“没有级别的标题”。 JAWS 是例外,它将其视为 <h2>
。 这似乎没问题...... 也许吧? Steve 甚至认为将副标题放在前面是可以的。
不好和丑陋
这里发生的事情是副标题为标题提供了总体上下文 - 有点像标记它
<label for="card-heading-1">Subheading</label>
<h2 id="card-heading-1" class="card-heading">Heading</h2>
但我们这里没有处理表单元素,因此不建议这样做。 另一种使它成为单个标题的方法是使用伪元素来放置副标题,例如
<h2 class="card-heading" data-subheading="Subheading">Heading</h2>
.card-head::before {
content: attr(data-subheading);
display: block;
font-size: 75%;
opacity: 0.75;
}
曾经屏幕阅读器会忽略伪内容,但现在已经改善了,尽管还不完美。 这使得它只有稍微更易于使用,但文本仍然无法选择,也无法在页面上查找,因此我不希望这样做。
我利用了类,尤其是在 Bootstrap 中,我认为这是最好的方法
<h2 class="h3">视觉上尺寸较小的主标题</h2>
<h3 class="h2">视觉上的主标题</h3>
因此,css 优先选择类选择器而不是元素选择器,这很有帮助
等等,hgroup 已弃用? 我在 WHATWG 的 hgroup 页面上看不到这一点。 我应该在其他地方寻找有关这方面的官方声明吗?
查看 MDN 上的使用说明:https://mdn.org.cn/en-US/docs/Web/HTML/Element/hgroup#Usage_notes
它存在于 WHATWG 版本中,但不属于 W3C 版本的规范。 实际上,您可以使用 hgroup 元素,但没有浏览器使用它来实际概述文档。 所以它没有真正的语义价值。
嘿,Glen - 它在 W3Cs HTML 规范中已弃用 - 但在 WHATWG 规范中未弃用。 MDN 的 hgroup 页面 中对此有一些说明。
https://mdn.org.cn/en-US/docs/Web/HTML/Element/hgroup#Usage_notes
您可以在这里找到一些更好的背景信息:https://mdn.org.cn/en-US/docs/Web/HTML/Element/hgroup
看起来您仍然可以在*技术上*使用它,大多数浏览器都支持它。
aria-role
看起来很有趣,但根据我所见,它似乎只引用 H1,因此您不能在子标题上使用它。从您提供的替代方案中,我喜欢第 4 个,因为在很多情况下,将整个内容作为一个标题是有意义的。
另外,如果您在
<section>
内使用<header>
,它在很多情况下不也是有效的吗?这样,您就可以拥有想要的 h 标签以及<p>
。感谢您提供有关
role="doc-subtitle"
的信息。我不知道有这样一个对字幕有用的 aria 角色。在查看推文后,我发现了一个回复,它解释了字幕和引言之间的区别。这有点道理。在我看来,引言最好用
small
元素包装,而不是用role="doc-subtitle"
的元素包装。像这样怎么样?
和
您只需在
div
规则中使用flex-direction: column-reverse;
,就可以消除对h2
和h3
规则的需要。从视觉上解决了这个问题,但标签索引有点笨拙,如果这是一个巨大的问题,就会破坏流程。
我将在 HTML 中实现标题和子标题,以查看所有更改。干得好!
我会使用选项 4,但我认为
<strong>
不是最好的选择,因为它会为其内容添加语义重要性,这对于子标题来说可能有点奇怪。我一直使用选项 4,或者使用
<span>
的变体。我以前没听说过
role="doc-subtitle"
,所以感谢您的提示。W3C 有些建议:https://www.w3.org/TR/html52/common-idioms-without-dedicated-elements.html#common-idioms-without-dedicated-elements
对我来说,任何 h2/h3 的组合看起来都不对。正如 W3C 所说:“h1–h6 元素不得用于标记子标题、副标题、备用标题和标语,除非它们旨在成为新部分或子部分的标题”。
对我来说,单个标题元素感觉是对的。
<h2><strong>新事物:</strong> 事物标题</h2>
它以逻辑的方式读取,您不需要依赖屏幕阅读器的行为。您可以很容易地对其进行样式设置,并且 - 如果你不喜欢冒号和空格,您可以以可访问的方式隐藏这些字符。
但是,正如我所说,这只是对我来说感觉是对的 - 我没有实际的证据来支持这一点。
我不认为将 2 个标题并排放置有什么问题。这也会发生在文档中,所以为什么不将它们视为 2 个标题呢,如果它们本该如此呢?
因为它是一个副*标题*,而不是一个副*标题*。
我认为奇怪的地方是屏幕阅读器的使用。根据 WebAIM 调查结果,屏幕阅读器用户非常依赖标题进行导航。您可以弹出一个菜单并获取它们的列表,选择一个并将其放到页面上的那个位置。因此,在一个部分中并排放置两个标题对于该用户来说会很奇怪。
就我个人而言,我倾向于将“视觉上是标题”与“功能上是标题”分开,并使用 p 标签来表示“视觉上”的标题。如果文本真的在标题中是有意义的,我可以将其嵌套在标题标签中并赋予它自己的覆盖样式。
您好!我是开发新手。只要我们实现了我们想要的结果(使其对所有用户都可访问),我们使用的确切元素或方式真的重要吗?
我真的很不喜欢在这些情况下使用标题标签。特别是如果您正在构建单个组件,那么您不知道该组件将存在于什么上下文中。将 h2 推送到随机文档结构中可能与语义 HTML 使我们能够做到的相反。您如何看待将两个元素都包装在
<header>
标签中呢?因为这样语义上标题就绑定到其父级,而我认为标题标签始终是文档级,您觉得呢?也许这只是特定于此示例(即 card > card headings),但我的本能是
<h2>
用于主要标题,以及
用于子文本。在这种情况下,它们都被认为是标题吗?
我通常在英雄部分或文章页面或功能产品推广中遇到的双标题。也许只是我,但除非标题和副标题区域之后有几段文字,否则副标题应该是一个
如果它后面没有内容。
我曾经见过一次,并且对此非常信服。
您如何看待这个?
这在我公司一直是一个持续的斗争,而且似乎每个开发人员都以自己的方式进行。我最近尝试重构我们的排版,并根据以下内容构建了语义层次结构:https://www.w3.org/WAI/tutorials/page-structure/headings/
我们有一个基于标记的样式指南,其中包含固定大小/行高的值,因此在彻底审核了我们网站上现有的内容以及其存在位置之后,将此结构应用于几乎所有情况非常简单。
我不知道它是否很漂亮,但它有效,对开发人员来说有意义(对设计师来说不一定有意义,至少在没有深入对话的情况下是这样),而且可访问。
遵循 w3 规则令人耳目一新,因为最终我知道我的规则可以得到支持。
我不会将这些示例中的“子标题”称为标题;它只是对该元素中内容的描述。因此,我不会为它使用 H 标签,而是使用 P 或 DIV。问题解决。
当我有一个真正的副标题时,它只会在标题之后出现,我通常会在 H 标签内使用 SMALL 标签。例如,
<h1>Frankenstein <small>The Modern Prometheus</small></h1>
为什么提供 1 作为选项?标题顺序错误,这会造成可访问性问题。这不是“ol'”技术;这只是糟糕的技术。这样做是完全错误的。
然后这篇文章继续列出不好的或已弃用的内容。您是否意识到人们会来到 CSS tricks 并复制粘贴您的建议,而不会过多地思考,对吧?
鉴于它们属于一起,我认为像 Gustav 评论这样的解决方案是最好的。
我在最近的一个项目中使用了伪元素方法。
子标题是标题的一部分,它对标题进行评论,为标题添加了一些内容。所以让我们将它们放在一起。
子标题
标题
这些标签离开了消息,使其变得毫无价值。另一次尝试,没有第一个或最后一个括号。
嗯,这是一个有趣的问题,因为我经常问自己这个问题......我的解决方案是
我会选择 h3 而不是 h2,因为我保留 h2 用于更大的部分,这些部分可以对像这样的卡片进行分组。而且很可能它已经存在于这样的部分中。
我非常不喜欢在中使用文本
<div>
标签......也许是我的问题。我认为您应该始终将文本包装在基于文本的适当标签中,例如或或或
<h3>
等,而不是<div>
或<header>
或<footer>
或任何其他结构化标签。请继续发布这些“处理 ___ 的选项”文章......不可避免地,当我阅读其中一篇文章时,我最近遇到了完全相同的事情,而且它们总是至少有一个我从未想过的选项。在本例中,我使用了无序的多个标题以及类,但我将回去查看其他选项,尤其是单个标题的选项,因为您是对的,多个标题很奇怪。
ARIA 的
doc-subtitle
角色 是 为 epub 文档设计的。 它本身没有标题级别,所以 根据 ARIA 1.1 规范,它会默认设置为级别 2(这不是 JAWS 的 bug)。 由于是 ARIA,它只对屏幕阅读器公开,而 浏览器/屏幕阅读器支持 差异很大。如果你的受众是 NVDA/Firefox 用户,那么
doc-subtitle
可能会有用。 否则,最好不要使用它。ˋ
Supheading.Heading
ˋ 这本来应该是 :-/
我无法理解使用“副标题”这个词来指代标题上方的文本,因为“sub”前缀的意思是下方。 我明白我们指的是相对的视觉层次结构,但一定有更不容易混淆的词。
网上有很多关于标题 H1 的信息,我对一些作者在这方面的观点持不同意见。 我不知道该如何处理我网站上的标题。 阅读了你的文章后,我找到了所有问题的答案。 谢谢您!!!
只是想在这里留下这个:http://html5doctor.com/howto-subheadings/
这里有一个关于使用
<small>
的讨论线程:https://lists.w3.org/Archives/Public/public-html/2013Apr/thread.html#msg22我认为这篇文章需要重新审视。
正如其他人指出的那样,选项 1 和 2 是错误的。
这里有一些更好的解决方案
https://www.w3.org/TR/2014/REC-html5-20141028/common-idioms.html
我最喜欢的,就像文章中的卡片示例一样
看起来你的网站有我问谷歌的每一个问题的答案。 非常感谢。