呼吁高质量 HTML5 演示标记

HTML5 是让 Web 变得更好的必要演变。在 HTML5 规范创建之前,我们使用(并且现在仍在使用)一组用来描述和链接文档以创建应用程序的拼凑系统。我们使用通用元素来模拟桌面开发中使用的丰富交互模块,并假设用户代理(浏览器)可以为最终用户执行什么操作。

这种混乱的优点在于它教会我们在过去几年中在开发方法上保持警惕——我们意识到,为了交付有效、可访问、可维护和可扩展的系统,我们必须在决策中,尤其是在规划和架构中保持专业性和智慧。

问题是,随着人们对 HTML5 新功能的兴奋,许多这些原则被遗忘或被认为过时了。它们并没有过时——Web 混乱的部分原因是,在 1999 年,许多人抛弃了所有其他东西,只专注于当时最流行的 Internet Explorer 6 和 DHTML。我们不要重蹈覆辙。

HTML5 热情的两面

现在,HTML5 有两件事值得我们兴奋:新元素更丰富、更有意义的语义,以及提供对浏览器和操作系统工作原理的深入访问的 API。前者使我们能够构建更丰富的界面,而后者使我们能够构建更复杂的应用程序。

所有这些都伴随着源代码查看(或在开发工具中检查)的优势,可以进行调试。您可以通过编写干净且有用的标记来宣传 HTML5。您也可以通过将标记视为二等公民来扼杀它,而标记仅仅是为了服务脚本而存在的。

标记爱好者对 HTML5 非常满意,这使得人们很容易进行升级——许多酷炫的新 博客模板HTML 模板 正在被构建,并且 polyfills 被创建以允许使用新功能,而不留下过时的浏览器。

在应用程序开发方面,情况看起来截然不同,这令人感到难过。我唯一可能的解释是,来自桌面环境的人现在开始使用 HTML5 API,而无需关心标记。HTML5 的实用性允许比 XHTML 更宽容的语法,但这并不意味着我们可以简单地重新应用所有导致我们多年来在维护方面受阻的错误。

在我作为 Web 开发人员的职业生涯中,我意识到在构建 Web 应用程序时,一些事情非常有意义

  • 如果有用于特定任务的元素,就使用该元素。该元素很可能附带免费的可访问性和交互功能,否则您将不得不模拟这些功能。
  • 将 CSS、JavaScript 和 HTML 分开——这意味着您可以轻松地重构代码,而无需更改所有代码。这也意味着您可以与他人并行工作,而不是相互破坏对方的代码
  • 永远不要依赖标记或内容——因为迟早会出现一些编辑工具,会破坏您创建的所有内容

这意味着很多事情

  • 首先,这意味着内联样式根本是邪恶的,因为它们会覆盖样式表中的任何设置。只有在确切需要这样做或动态计算样式时才使用它们。
  • 内联脚本也是如此。如果您在 HTML 中的某个位置有 onclick="foo()" 并且 foo() 更改为 bar(),则必须在每个 HTML 文档中重命名它(当然现在是一个模板,但这仍然意味着要查找您可能错过的引用)。
  • 如果您不使用本机 HTML 元素来完成特定工作,而是使用 SPAN 和 DIV,则必须添加类才能使它们看起来和工作——并且还要模拟键盘可访问性。
  • 您不能依赖任何元素的文本值。<button>edit</button> 使用“edit”作为某些功能的触发器,在您创建德语 <button>bearbeiten</button> 时,必须对 JS 进行本地化。

等等等等……来吧,Chris,没那么糟糕!

上述最佳实践已经提到了很多年,许多人厌倦了反复看到它们。毕竟,这是智能开发,也是后端技术中的标准做法。但是,最近我在查看 HTML5 演示(特别是 HTML5 圣诞日历中的演示)的源代码时,发现了很多“创造性”用法。以下是我的收获。

模拟导航列表

我遇到的第一个是绘图工具,该工具将创建的图形库作为背景。对我来说,这将是一个简单的列表

  • {title}
  • [...]

但我发现的标记是这样的

[...]

当然,这是由后端生成的。我的第一个抱怨是阴影图像,毕竟这是一个 HTML5 演示——只需使用 CSS3。我们还有三个生成的样式和双重类实例。当然,额外的类可以让你控制所有图像,而不是瓷砖,所以为什么不呢。但是由于图像周围没有真正的链接,点击处理程序必须从某个地方读取 URL。这里在 DOM 和脚本之间存在很多不必要的来回操作,这确实会减慢整个演示的速度。鉴于这也是从入口页面到编辑器的主要导航,这可以是 nav 元素内部的列表。列表将这些项目组合在一起,一堆 DIV 不会(例如,屏幕阅读器会告诉您列表中有多少个项目)。

我发现的另一个列表应该链接到刷新应用程序并具有层次结构,但它是一个扁平的列表,使用类来定义层次结构和分组

  • Simple
  • {name}
  • [... repeated ...]
  • {parent name}
  • {name}
  • [... repeated ...]

这可以,当然,您也可以改变键盘焦点,但为什么不

这将免费提供样式钩子和功能。链接和按钮非常适合触发功能——但似乎这太容易了。

单击(可能)这里以获得功能

如果我为应用程序构建一个按钮来触发某个功能,那么标记就是这样的

按钮 是触发功能的元素——无论是后端脚本还是 JavaScript。它们是键盘可访问的,具有禁用状态,并具有明智的开箱即用的样式,这些样式现在可以完全覆盖。类可以是按钮应该执行的操作的定义——而不是文本,文本会发生变化。您可以使用 ID,但类允许重复按钮(例如,在结果列表的顶部和底部)。

但我发现的按钮略有不同

Start Drawing

View the Mural

{title}

因此,我们没有使用嵌套列表,每个按钮都有类,并且层次结构在嵌套中,而是一堆类和一个手工制作的 DIV 结构。我们没有真正禁用按钮,而是依靠不透明度,并且混合了内联图像和背景图像(如果都是背景图像,它们可以是一个雪碧!)。键盘导航将必须为此编写,如果要添加一个按钮,则必须想出另一个 ID。

HTML5 实际上有一个用于此的结构。有一个 menu 元素,其中包含 command 子元素。这些元素例如在 Chrome 的侧边栏中使用,应该是我们应该使用的元素。如果您希望它对所有人都有效,则应使用包含 button 元素的嵌套列表。

过度复杂的 DIV 结构使用相当广泛——这是另一个例子

Start Game
Help
High Scores

如有疑问,请为所有内容添加 ID 和类。

我遇到的其他按钮实际上是链接到 javascript:// 的链接,使用内联样式来指示层次结构

说到内联——这是一个很好的例子,一个工具生成很多代码,这些代码可以用一个事件处理程序和 事件委托 代替

请注意,如果按钮的图像由于某种原因无法加载(或您根本看不到它们),那么这个应用程序确实非常令人困惑——图像没有替代文本,也没有文本内容可以回退。我也非常肯定,in 和 out 处理程序会触发 CSS 可以更好地处理的视觉效果。

原因和影响

我知道这可能有很多原因,而且我相信当我赶时间或想快速完成工作时,也会做错事。但我们必须理解的是,现在我们有责任展示我们能做的最优秀的演示。

我们不能一方面宣扬开放式网络和技术以及查看源代码,另一方面却忘记过去十年学到的东西。我发现其中一些东西看起来像是 90 年代 Frontpage 或 Dreamweaver 生成的代码,导致了大量性能低下、难以维护的产品,这些产品要么仍然困扰着必须使用它们的人,要么每两年就要被替换一次。

我们肩负着教育新一代网络开发者的重任。忘掉一些东西比学习它要难得多,所以让我们不要从臃肿的代码和快速修复开始,这些代码虽然有效,但却忽略了提倡干净的代码以及思考你的产品对最终用户(考虑无障碍性)和将来维护你产品的人的影响。我们不是来宣传效果和产品,而是来推广工具,让任何人都可以轻松地构建出既酷又容易理解的东西。

HTML5 是关于将网络作为一个平台进行演进的,我们也需要与之同步发展,承担更多责任。我们有应用程序开发人员,也有标记语言爱好者。让我们让他们共同努力,构建既有出色功能又有干净语义的东西。

关于 Chris Heilmann

HTML5 和开放式网络的布道者。让我们修复它!

更多来自 Chris Heilmann 的文章……


10 条评论

  1. alexander farkas

    一年前,我展示了类似的例子,并提出一个简单的问题。HTML5 音频/视频播放器的播放/暂停切换按钮的标记应该是什么样的:http://protofunc.com/jme/quiz/

    但什么都没有改变…

    2010 年 12 月 19 日 下午 2:28

  2. Mardeg

    您如何评价 BlueGriffon 生成的输出?

    2010 年 12 月 19 日 下午 6:16

  3. Nick Fitzsimons

    当你说“我知道可能有很多正当理由”时,我怀疑你是在太过客气。我无法看到任何正当理由。

    我进一步怀疑,这种垃圾仍然被强加于世界的一个原因是,存在一个特定的网站,许多人似乎仍然将其与 W3C 混淆,因为它的域名以“w3”开头,并假设由于它的域名也包含“schools”一词,所以一定是具有教育价值的。

    也许我们在几年前结束 WaSP DOM Scripting TF 是操之过急了。我们以为形势正在朝着熟练的标记和脚本方向发展,但古老的残骸从未从海滩上冲刷掉,人们仍在上面跌跌撞撞,以为是宝藏。每当我看到像你引用的那些“例子”,或者链接到上述网站时,我都会感受到海豚被长久遗忘的拖网渔船的缠绕网困住而死亡,独角兽的心脏被黑色的彩虹刺穿。

    您的里程可能会有所不同。

    2010 年 12 月 19 日 下午 8:37

    1. Ankit Saini

      嗯,我也曾认为 w3schools 是一个宝藏。大多数网站在谈论学习网络开发时都会将您重定向到 w3schools。它是谷歌上学习 HTML 的首选结果,所以新来者肯定会去那里。

      2010 年 12 月 23 日 上午 8:22

  4. Jack Lukic

    我同意这篇文章的大部分内容,并赞赏你指出了 HTML5 中“展示作品”中大部分糟糕的标记。
    但我确实有一个争论点想指出。虽然使用 alpha 透明度的 CSS3 规范(如 box shadow、text-shadow 和 rgba)很漂亮,但在这一代浏览器中,它们的性能非常糟糕。让每次重排都生成即时 alpha 通道来模拟 css 阴影属性,比简单地用 background-image 和 24 位 png 绘制光栅副本慢了好几倍。

    有时,即使使用 CSS3 2D 变换和 png 阴影也可能比使用 css 生成的 alpha 更快。

    随着未来硬件加速的采用,这可能变得无关紧要,但由于只有现代浏览器的 dev/beta 版本包含 gpu 加速,因此大多数开发人员仍然轻视这些标准,以从大幅增加的帧速率中获益。
    回复

    2010 年 12 月 19 日 下午 11:25

  5. Steve

    我喜欢您关于标记的评论,完全同意,特别是语义方面和列表的嵌套。遗憾的是,我仍然在网络上看到大量自动生成的代码,它们的标记和语义都很糟糕。
    更令人难过的是,我认为那些编码糟糕的网页将在我们身边停留很长时间,现在甚至还有更多这样的网页正在涌现。

    2010 年 12 月 23 日 上午 9:34

  6. Harp B

    感谢您的文章。我一直在考虑做一些类似于事件传播的事情,现在我知道了用什么来解决我的问题。:d

    顺便问一下,您是否知道任何这样的速查表,它将 html + html5 标签分类,以便了解何时使用它们?

    2010 年 12 月 25 日 上午 3:09

  7. Felix Pleșoianu

    不用担心过分强调这些建议。我不得不向专业的网页设计师讲解一些基本的 HTML 标签(dl 及其同类),除了 class 和 ID 之外的 CSS 选择器,以及现代浏览器能识别的内容(他们一直停留在 IE6 的水平)。我不得不向他们解释语义标记的优点,但他们根本没有听。无干扰的 JavaScript?那似乎是给火箭科学家准备的。

    像这样的宣传仍然是必要的。继续努力吧。

    2011 年 1 月 1 日 上午 11:00

  8. brian

    我和 Nick Fitzsimons 一样,这些例子令人毛骨悚然。不是因为他们很令人惊讶,而是在 HTML5 的例子中?天啊!你真是太客气了。:-)

    2011 年 1 月 3 日 上午 0:05

  9. icflyoncyber

    html 5 的例子很酷。
    但我使用 div 容器的 epic 浏览器上有一些小问题。
    希望我今天能解决。

    2011 年 9 月 20 日 下午 12:55

本文的评论已关闭。