一些 HTML 小技巧

前段时间我写了一篇关于 一些 CSS 小技巧 的文章,现在是时候给我们的 HTML 添加一些润色了!在这篇文章中,我将分享一些关于 HTML 代码的技巧和建议。其中一些指导最适合初学者 - 如何正确构建段落,使用标题,或改进表单,但我们还将讨论 SVG 精灵用于图标,这是一个更高级的话题。

文本

段落

我们的大部分写作都以段落的形式组织,并且有一个 HTML 元素用于此:<p>不要使用换行符标签 <br> 将文本块分隔成伪段落,因为换行符不是用于此目的的。

避免

Cupcake ipsum dolor sit. Amet chupa chups chupa chups sesame snaps. Ice cream pie jelly
beans muffin donut marzipan oat cake.

<br>

Gummi bears tart cotton candy icing. Muffin bear claw carrot cake jelly jujubes pudding
chocolate cake cheesecake toffee.

推荐

<p>Cupcake ipsum dolor sit. Amet chupa chups chupa chups sesame snaps. Ice cream
pie jelly beans muffin donut marzipan oat cake.</p>

<p>Gummi bears tart cotton candy icing. Muffin bear claw carrot cake jelly jujubes
pudding chocolate cake cheesecake toffee.</p>

换行符的合法用途是,例如,将一首诗或歌曲的诗节分隔开来。

<p>So close, no matter how far<br>
Couldn’t be much more from the hearth<br>
Forever trusting who we are<br>
And nothing else matters</p>

标题

<h1><h6> 的标题标签都有一个隐含的等级分配给它们,从 1(最重要)到 6(不重要)。

为了正确处理语义, 按顺序选择你的标题等级,不仅仅是因为浏览器将使用的大小来渲染标题。你可以 - 并且应该!- 为此使用 CSS,并选择一个合适的等级。

避免

<article>
    <h1>Monkey Island</h1>
    <h4>Look behind you! A three-headed monkey!</h4>
    <!-- ... -->
</article>

推荐

<article>
    <h1>Monkey Island</h1>
    <h2>Look behind you! A three-headed monkey!</h2>
    <!-- ... -->
</article>

另一个要考虑的事情是如何创建子标题或标签线来伴随标题。 W3C 的建议 是使用常规文本标记,而不是更低等级的标题。

避免

<header>
    <h1>Star Wars VII</h1>
    <h2>The Force Awakens</h2>
</header>

推荐

<header>
    <h1>Star Wars VII</h1>
    <p>The Force Awakens</p>
</header>

表单

占位符

<input> 表单元素中的占位符属性将让你向用户显示一个示例值,该值会在用户在字段中输入任何内容后自动擦除。占位符旨在显示格式的示例,该格式对于字段是有效的。

不幸的是,在实际应用中,有很多占位符充当 <label> 元素,告知字段是什么,而不是作为有效输入值的示例。这种做法不是 可访问的,你应该避免这样做。

避免

<input type="email" placeholder="Your e-mail" name="mail">

推荐

<label>
    Your e-mail:
    <input type="email" placeholder="darth.vader@empire.gov" name="mail">
</label>

移动设备上的键盘

为从移动设备(如手机或平板电脑)浏览的人提供输入提示至关重要。我们可以通过为 <input> 元素选择 正确的类型 来轻松实现这一点。

例如,type="number" 将使移动电话显示数字键盘,而不是常规的字母数字键盘。同样适用于 type="email"type="tel" 等。

避免

<label>Phone number: <input type="text" name="mobile"></label>

推荐

<label>Phone number: <input type="tel" name="mobile"></label>

以下是一个比较:左侧是使用 type="text" 时出现的键盘;右侧是 type="tel" 的键盘。

keyboard comparison

图像

SVG 文件问好!你不仅可以在 <img> 标签中使用矢量图形,就像这样

<img src="acolyte_cartoon.svg" alt="acolyte">

你还可以使用SVG 精灵在你的网站中实现矢量图标,而不是使用网页字体 - 这是一个技巧,可能不会产生完美的结果。这是因为浏览器将网页字体图标视为文本,而不是图像。还有一些其他潜在问题,例如内容/广告拦截器会禁用网页字体的下载。如果你想了解更多关于这方面的信息,请观看 Sarah Semark 关于为什么使用 SVG 用于图标比使用网页字体更好的演讲。你也可以在 CSS-Tricks 上阅读更多关于此技术的知识。

SVG 精灵的概念与 CSS 精灵 非常相似。实现方法是将所有 SVG 资源合并到一个图像文件中。对于 SVG,每个资源都被包裹在一个 <symbol> 标签中,就像这样

<svg>
    <symbol id="social-twitter" viewBox="...">
        <!-- actual image data here -->
    </symbol>
</svg>

然后,可以使用 <svg> 标签在 HTML 中使用图标,就像这样,这样我们就可以指向 SVG 文件中的符号 ID

<svg class="social-icon">
    <use xlink:href="icons.svg#social-twitter" />
</svg>

创建 SVG 精灵表是否看起来很繁琐?好吧,这就是为什么会有像 gulp-svgstore 这样的工具来自动化这个过程,并从你的单个资源文件生成一个精灵表。

请记住,由于我们使用的是 <svg> 标签而不是 <img> 来包含图片,因此我们可以使用 CSS 来应用样式。因此,你可以使用网页字体图标完成的所有酷炫的事情,也可以使用这些 SVG 图标完成!

.social-icon {
    fill: #000;
    transition: all 0.2s;
}

.social-icon:hover {
    fill: #00f;
}

不过,有一些 CSS 限制:以这种方式使用 SVG 时,使用 <use> 链接到 <symbol>,图像会被注入到 Shadow DOM 中,并且我们失去了一些 CSS 功能。在这种情况下,我们无法挑选 SVG 中要应用样式的哪些元素,而某些属性(例如,fill)将只应用于那些属性未定义的元素。但是,嘿,你无法使用网页字体图标做到这一点!

在下面的演示中,你可以看到一个 SVG 精灵在行动的例子。当你的鼠标悬停在图像上时,火把的火焰会通过 CSS 改变颜色。

查看 SVG 助手演示 由 ladybenko (@ladybenko) 在 CodePen 上创建。


我希望这些技巧对你有所帮助。如果你有任何问题,或者想分享你自己的技巧,请留言!

关于 Belén Albeza

Belén 是一位工程师和游戏开发者,在 Mozilla 开发者关系部门工作。她关心网络标准、高质量代码、可访问性和游戏开发。

更多 Belén Albeza 的文章...


36 条评论

  1. Gerd Neumann

    浏览器支持怎么样?我理解正确吗?IE 11 不支持“ https://mdn.org.cn/de/docs/Web/SVG/Element/use#Browser_compatibility | https://caniuse.cn/#feat=svg

    2016 年 8 月 24 日 下午 01:54

    1. Belén Albeza

      IE11 对 SVG 的支持有限。如果你需要做的事情在 IE11(或更旧的浏览器)中不受支持,那么还有一种 polyfill 可以使用:https://github.com/jonathantneal/svg4everybody

      2016 年 8 月 24 日 下午 02:13

  2. Pablo Carballeda

    不错的文章 Belén。

    我认为 xlink:href 在 SVG 2 中已弃用,你应该使用 href 而不是 xlink:href。

    如果我错了,请纠正我。

    2016 年 8 月 24 日 下午 03:15

  3. Mike Swanson

    对于段落示例,在常规 HTML5 中不需要关闭 </p> 标签(然而,在 XHTML5 中是需要的,因为它是严格的 XML 变体)。删除它们可能使它们看起来更吸引人,并且与 <br> 示例一致。

    2016 年 8 月 24 日 下午 05:05

  4. Derek johnston

    简洁、简单的技巧,带来更好的网络体验。感谢分享!

    2016 年 8 月 24 日 下午 06:05

  5. Francute

    也许我漏掉了什么。
    在关于 SVG 的图像部分中,你如何只改变火焰的填充,而不是深色衣服的填充?
    我看到你定义了一个名为“chara”的图形,它引用了名为“acolyte”的整个符号。它包括火焰、深色衣服和其他所有东西。但是当你通过 CSS 调用 chara:hover 伪元素时,它只会改变火焰的填充,而不是整个助手的填充……为什么?为什么例如不能只改变深色衣服?你如何做到这一点?
    感谢你的时间!:)

    2016 年 8 月 24 日 下午 06:49

    1. Belén Albeza

      嗨 Francute。关键是文章中的这段文字

      我们无法挑选 SVG 中要应用样式的哪些元素,而某些属性(例如,fill)将只应用于那些属性未定义的元素。

      当你将 CSS 应用于通过 `<use>` 包含的 SVG 时,一些属性(包括 `fill`)将只应用于那些未设置/未定义的元素。这就是为什么 CSS 着色只应用于 `。fire`,因为只有这些元素在原始资产中未设置 `fill`。

      如果你像往常一样包含 SVG,你会得到你提到的行为 - 正如我们直觉上所期望的那样。

      希望这有帮助!:)

      2016 年 8 月 24 日 上午 07:02

      1. Francute

        哦... 谢谢!我错过了这一点!

        非常感谢你的文章和这个美丽的回答!:D

        2016 年 8 月 24 日 上午 07:57

      2. Christian Wilkie

        感谢你的精彩解释!我最初在阅读那部分内容时也想知道同样的事情。顺便说一下,我喜欢嵌入的代码笔,尝试更改代码并能够轻松更改值/查看结果很有趣。

        2016 年 8 月 24 日 上午 10:47

  6. Arjun

    在电子邮件字段的占位符文本中,你使用“@empire.gov”。虽然该特定域名不太可能被注册和使用,但我仍然建议始终使用“@example.com”,因为它是 IANA 为此目的保留的域名。

    2016 年 8 月 24 日 上午 07:20

    1. Belén Albeza

      我知道一些域名,包括 .gov,是受限制的。但是,`darth.vader@empire.gov` 是一个语法上有效的电子邮件地址。并非所有电子邮件地址都使用 .com 域名,示例的目的是在可能有点枯燥的帖子中做一个笑话,同时展示 `placeholder` 属性的使用。

      2016 年 8 月 25 日 上午 01:54

  7. Cornelis

    `xlink:href` 引号没有关闭。

    2016 年 8 月 24 日 上午 08:01

    1. Havi Hoffman [编辑]

      编辑注:已修复!感谢 @Cornelis 指出。感谢 vogonsPoetry 和 Yousef 也指出了缺少的结束引号。

      2016 年 8 月 24 日 下午 16:02

  8. Salva

    很棒的文章。我将一些提示标记为收藏夹。不过有一个疑问

    你认为同一个文档中的两个 h1,但每个 h1 都在独立的文章中如何?

    article#art_1 > h1
    article#art_2 > h1

    我认为这是有效的,但规范在这里怎么说?你的个人观点是什么?

    2016 年 8 月 24 日 上午 09:02

    1. Jens Andersen

      你应该根据 W3C 推荐的 HTML5 标准,按照 XHTML 中的等级使用 H1-H6。你还应该在导航栏中使用无序列表来显示你的主要导航链接。

      2016 年 8 月 25 日 下午 15:07

    2. Belén Albeza

      实际上有两个 HTML5 规范:WHATWG 规范W3C 规范

      WHATWG 规范最初创建,你会发现 W3C 规范非常相似。

      直到几个月前,这两个规范都有 这个例子,它展示了你正在评论的内容

      <body> <h1>Let's call it a draw(ing surface)</h1> <section> <h1>Diving in</h1> </section> <section> <h1>Simple shapes</h1> </section> <!-- ... --> </body>

      然而,W3C 决定在 今年 5 月 从他们的规范中删除它,因为他们认为目前的浏览器实现是不正确的 - 尤其是屏幕阅读器的实现。

      但是,WHATWG 规范仍然认为该示例有效,并且是一个推荐的替代方案。

      恕我直言,这种风格的优点很大。它是一种“沙盒”你没有自己生成的内容的方式 - 比如在博客主题中,你不知道作者将选择哪些标题,以及如何基于组件设计 UI - 你可以有一个带有标题的 `aside`,并且该标题可以完美地成为 `h1`。如果你正在创建一个应用程序,这种行为几乎是必须的,因为你可能事先不知道外部内容是什么。

      如果你在验证器中尝试上面的代码,它会验证,但你会收到警告,告诉你一些屏幕阅读器无法正确阅读它。

      虽然 99% 的时间我都赞成始终受益于可访问的代码,但这很棘手,因为理论上它是可访问的,但屏幕阅读器需要/应该赶上并提供正确的实现。

      2016 年 8 月 26 日 上午 01:42

      1. Jens Andersen

        你说得对,但由于 W3C 是负责制定标准的联盟,并且已经存在很长时间了,我们应该遵循他们的规范,以便为我们的 HTML 网页使用正确的标记。

        我知道在 HTML5 中,你刚刚展示的示例是合法的,但正如你所知,如果不在每个文档中按等级使用 H1-H6,一些浏览器或屏幕阅读器可能无法正确阅读它。

        SEO 在这种情况下也很重要,我相信我们仍然需要按等级使用标题,以便尽可能地以 SEO 友好的方式呈现我们的内容。

        2016 年 8 月 26 日 上午 02:12

        1. Belén Albeza

          恕我直言,这是一个非常灰色地带,我不想对此提出强烈的建议。

          这是规范的一部分,它被“撤销”了,这不是一件好事。而且它被撤销不是因为他们认为这是一个坏主意,而是因为屏幕阅读器没有正确实现它。

          也许当他们这样做时 - 屏幕阅读器将不得不这样做,因为这种风格很常见 - W3C 会把它带回来。

          现在,在特定用例中:你是博客主题的开发者,你无法控制用户将使用的标题等级。当然,作者不应该关心主题的实际内容,或者文档的外部结构。

          你会怎么做?

          在这种情况下,对我来说,最合理的解决方案是将帖子包装在一个 `article` 标签中,让他们使用任何标题(因为他们这样做)。

          有些情况下,你完全负责渲染的 HTML。在这种情况下,遵循你的建议可能是最好的选择。

          但是,如果你正在开发一个应用程序或任何基于 UI/小部件的网站,这几乎是不可能的。因为在这种情况下,你需要在隔离的块中创建你的 UI 块,并且你不知道一个块将被放置到哪个标题层次结构中。

          凭你的最佳判断行事。

          2016 年 8 月 26 日 上午 02:33

          1. Adrian Roselli

            Belén,这个(文档大纲算法)并没有被 W3C“撤销”,建议被更改以反映现实情况。WHATWG 还没有赶上,但这无关紧要,因为经过 7 年,它不再反映现实情况。

            你认为它被“撤销”了,这在标准讨论中毫无意义。然而,由于你附加了一个价值判断,我可以自信地说它*是*一件好事,因为 W3C 规范没有对开发者说谎。

            你还在说它是由于“屏幕阅读器没有正确实现它”。这是错误的。屏幕阅读器只能使用浏览器提供的功能,而浏览器制造商对实现文档大纲算法没有兴趣。

            你接着说,“也许当他们这样做时 - 屏幕阅读器将不得不这样做,因为这种风格很常见 - W3C 会把它带回来”。这句话表明你既不使用屏幕阅读器,也不与使用屏幕阅读器的人(也不与 W3C)合作。无论如何,如果浏览器突然决定实现文档大纲算法,那么 W3C 规范将被更新以反映这一点。我无法谈论 WHATWG 规范(因为它目前不准确)。

            如果你想责怪的话,那就责怪浏览器。不是屏幕阅读器,也不是 W3C。

            从 HTML Doctor(为规范、浏览器和/或可访问性工作的人)了解更多信息:http://html5doctor.com/computer-says-no-to-html5-document-outline/

            因此,如果你想编写可访问的代码,正如你之前的评论所说,那么忽略文档大纲算法,使用良好的标题结构。用户不关心这是否对你不方便。

            至于分块内容,我多年前就处理过这个问题(在 HTML5 之前,在 HTML4 之前),跟踪你的模板中内容块的位置,然后相应地调整标题级别,这并不是什么大问题。不学习如何做到这一点,不能成为使用不正确标题的借口。

            至于你关于博客帖子的场景,将其包装在一个 `main` 元素中,而不是 `article`。如果这是一个博客索引,将整个索引包装在一个 `main` 元素中,然后你*可以*将每个摘要包装在一个 `article` 中(前提是你也给它一个标题),但如果只是使用良好的标题结构和简单的摘要,这些 `article` 元素可能不是必需的。

            2016 年 8 月 26 日 上午 07:36

          2. Belén Albeza

            Adrian,

            Belén,这个(文档大纲算法)并没有被 W3C“撤销”,建议被更改以反映现实情况。WHATWG 还没有赶上,但这无关紧要,因为经过 7 年,它不再反映现实情况。

            更改以反映现实情况在我看来很像撤销。但除此之外,我们现在的情况是,几个月前,这实际上是 W3C 的一项建议 - 也就是说,使用它的人并没有根据规范做错任何事。

            我在规范中没有发现任何禁止你使用它的内容,现在 W3C 验证器会给你一个警告 - 不是错误 - 并提到了屏幕阅读器的情况。

            你还在说它是由于“屏幕阅读器没有正确实现它”。这是错误的。屏幕阅读器只能使用浏览器提供的功能,而浏览器制造商对实现文档大纲算法没有兴趣。

            你说得对,浏览器实现的文档大纲算法是有缺陷的。

            你接着说,“也许当他们这样做时 - 屏幕阅读器将不得不这样做,因为这种风格很常见 - W3C 会把它带回来”。这句话表明你既不使用屏幕阅读器,也不与使用屏幕阅读器的人(也不与 W3C)合作。无论如何,如果浏览器突然决定实现文档大纲算法,那么 W3C 规范将被更新以反映这一点。我无法谈论 WHATWG 规范(因为它目前不准确)。

            你在这里做了很多假设。我使用过屏幕阅读器,主要是为了测试,但我现在没有视力障碍,因此我不是“真正的”用户 - 就像大多数开发人员一样。你说 WHATWG 不准确,但那是你的评价。它是一个规范,只是不是 W3C 的规范。规范“反映现实”具有副作用,即以前有效的代码现在已过时,尤其是现在我们只需要使用 `<!doctype html>` 并且不再在其中指定版本。

            因此,如果你想编写可访问的代码,正如你之前的评论所说,那么忽略文档大纲算法,使用良好的标题结构。用户不关心这是否对你不方便。

            正如我在之前的回复中所说,只有当你完全控制页面上生成的 HTML 时才能做到这一点。即使你后来运行某种脚本,检查文章标题的等级应该从哪里开始并重新编写它们,你也可能会用完标题等级,因为只有 6 个。有人可能会争辩说 6 个等级应该足够了,但是,再一次,你无法控制其他人将输入哪些 HTML。

            至于分块内容,我多年前就处理过这个问题(在 HTML5 之前,在 HTML4 之前),跟踪你的模板中内容块的位置,然后相应地调整标题级别,这并不是什么大问题。不学习如何做到这一点,不能成为使用不正确标题的借口。

            我们正处于一个世界,今天应用程序框架会生成大量的嵌套 `div` 和糟糕的标记。实际上,几乎没有人这样做。再次,我们遇到了可能用完标题等级的问题。一个解决方案可能是使用 `p` 而不是标题,但是......

            至于你关于博客帖子的场景,将其包装在一个 `main` 元素中,而不是 `article`。如果这是一个博客索引,将整个索引包装在一个 `main` 元素中,然后你*可以*将每个摘要包装在一个 `article` 中(前提是你也给它一个标题),但如果只是使用良好的标题结构和简单的摘要,这些 `article` 元素可能不是必需的。

            article标签包裹帖子没有问题,它也不与用main标签包裹不兼容。如果你不喜欢sectionarticle并且不想使用它们,那是你的个人选择。但其他开发人员可能会有不同的看法,它们是规范中合法的标签。

            就像我之前说的,在我看来这是一个灰色地带,我不想偏袒任何一方。我当然也可能错了,所以我说“运用你的最佳判断”。如果你完全掌控你的HTML,采用严格的标题结构可能是正确的选择。但是如果你…

            最后,让我们保持文明。我发现你的措辞相当具有攻击性,在这种情况下,我并不想讨论代码。

            2016年8月26日 下午08:16

  9. sun

    当我用手机输入信用卡信息(卡号、有效期 MMDD、CVV)时,我更喜欢使用数字键盘。因此,也许将输入类型设置为tel对于这些字段也合适?我不太喜欢使用旋转滚轮来选择年份。

    2016年8月24日 下午11:29

    1. Belén Albeza

      不完全是,从语义上来说,type="tel"指的是电话号码,而不是其他类型的数字。

      规范中有一个属性,inputmode,它允许你选择显示哪个键盘,而不管输入的type是什么。所以你可以使用

      <input type="text" inputmode="numeric">

      你可以查看MDN,了解该属性的所有可能的值。问题是,该属性目前没有浏览器支持 :(

      2016年8月25日 下午01:34

      1. sun

        range属性可能对数字验证很有用,因为信用卡号为十六位数字,以3开头的是美国运通卡,以4开头的是Visa卡,以5开头的是万事达卡,以6开头的是Discover卡。

        2016年8月26日 下午02:58

  10. vogonsPoetry

    SVG示例中缺少双引号!

    ^

    2016年8月24日 下午11:41

  11. Michał

    Acolyte 是最好的 ;D

    2016年8月24日 下午13:01

    1. Belén Albeza

      忠实的Acolyte感谢您的赞赏。

      2016年8月25日 下午01:26

  12. Saa

    我希望 Firefox 很快就会支持日期输入。

    2016年8月24日 下午13:25

  13. Yousef Shanawany

    提醒一下,这里有个错字。参见:http://i.imgur.com/xNacBOI.png

    2016年8月24日 下午15:45

  14. Christian

    在你的《星球大战:原力觉醒》示例中,SUBHEAD 元素可能比 P 元素更合适:http://codepen.io/WebDevCA/pen/wzyIH

    2016年8月24日 下午20:54

    1. Belén Albeza

      不幸的是,<subhead>不是 HTML5 规范的一部分。

      2016年8月25日 下午01:44

  15. David

    我喜欢这个。除了两件事

    你甚至没有在这个评论框的文本输入中使用占位符 :)

    精灵是永远不应该存在的黑客。希望 http/2 会消除对这种丑陋东西的需求。

    2016年8月24日 下午22:54

  16. Luke

    提一下使用 来捕获用户输入是获得免费输入验证和按钮/按键处理的一个好方法,这将非常棒!

    2016年8月25日 下午22:08

  17. Chris Hills

    在最后一个示例中,为什么它以“ ”结尾而不是“ ”结尾?

    2016年8月25日 下午23:37

    1. Belén Albeza

      您好,您能解释一下吗?我担心评论过滤器可能删除了一些字符。

      2016年8月26日 下午02:02

  18. Wim Mostmans

    真的很喜欢 SVG 精灵提示。我之前并不知道这个。

    2016年8月26日 下午00:54

  19. jotarun

    喜欢猴岛的例子 :)

    2016年9月5日 下午23:18

本文评论已关闭。