网络多媒体和合理使用 HTML5

上周,我参加了在英国伦敦举行的 伦敦 Ajax 用户聚会,并做了两场关于 HTML5 的演讲。一个是之前在麻省理工学院关于网络多媒体的演讲的重播,另一个是呼吁大家合理使用 HTML5 的号召。您可以访问 Skillsmatter 网站观看这两场演讲 - 但也请务必查看本文中对第二个演讲的笔记。

除了我在这里的笔记之外,Ian Alderson 还撰写了一篇关于当晚活动的 精彩文章,可在网络上找到。

网络多媒体

我们之前在 这篇博文 中介绍过这个演讲,您还可以 在我的博客上阅读整个演讲的详细笔记,包括代码示例。多媒体演讲的 幻灯片在 slideshare 上,这里也有。

您可以在任何支持 HTML5 的设备上 观看“网络多媒体”(由 vid.ly 提供)或将其嵌入到此处。

合理使用 HTML5

“合理使用 HTML5”是我一直想做的一个演讲。与其只是陈述事实,我更想提出一些每个开发者都应该问自己的问题,以及 HTML5 工作组和所有关心的人。我们正处于开发环境的重大变革之中,但很多人没有意识到,我们在没有回退的情况下打破了许多旧的约定。

您可以在 Slideshare 上获取幻灯片或在这里查看:

您可以在任何支持 HTML5 的设备上 观看“合理使用 HTML5”(由 vid.ly 提供)。

“合理使用 HTML5”的笔记

我开始演讲时讲述了 南极雪地巡洋舰 的故事——这是一款 1939 年制造的技术奇迹,旨在让人员能够探索南极洲。雪地巡洋舰的任务是为人员提供所有必要的舒适条件,并让他们能够穿越南极洲,那里既非常寒冷,也存在车辆需要越过的巨大裂缝。巧妙的解决方案是配备巨大的车轮,这些车轮可以缩回巡洋舰内部,以防止它们在夜间变脆,并推动车辆越过裂缝。雪地巡洋舰是在匆忙中建造的,并在前往南极洲港口的途中进行了测试。它受到了媒体和公众的热烈欢迎,人们甚至因此推迟了整个行程,想要与它合影。抵达后,车辆几乎坠入大海,因为为其运送到冰面而建造的坡道不够坚固。更糟糕的是,一旦到达冰面,巡洋舰就无法获得抓地力,车轮空转,几乎导致发动机过热。尽管炒作声不断,但巡洋舰最终以惨败告终。

巡洋舰出现了一些问题

  • 它纯粹是工程驱动的
  • 它在道路上进行了测试
  • 它从未在真实环境中进行过测试
  • 在证明其价值之前,它就引起了巨大的媒体关注

这与我们如今处理 HTML5 的方式非常相似。关于 HTML5 的许多信息都是营销驱动的,用于向人们推销特定的环境或浏览器。我们不是创建真实的应用程序和日常使用的网站,而是创建 演示 网站 来展示“HTML5 能为你做什么”。“HTML5”一词变得模糊不清,因为它既用于规范部分的实现,也用于仅在特定环境中有效的特定于浏览器的代码。

这部分原因在于规范以及 HTML5 世界本身中不同的参与者。规范不仅包含标记的定义,还包含 JavaScript API 和关于如何编写渲染 HTML5 内容的浏览器的说明。这很棒,因为它消除了浏览器供应商过去在“创造性地”应用 HTML4 规范方面的自由,但也意味着人们可以专注于规范的某些部分,当然也可以抱怨所有其他部分。您可能看到过一个关于 HTML5 标记惊人的全新语义的演讲,以及另一个关于使用完全无意义的标记的 API 实现的演讲,它们一个接一个地进行。这就是我们现在遇到的情况,因为规范对于实施者来说过于庞大和包罗万象。

HTML5 工作的主要主题之一是实用性——XML 和严格的 HTML 使用了许多我们根本不需要的东西。这在简化普通 HTML 文档中表现得淋漓尽致。在 HTML4.01 严格模式下,它是这样的



  
  HTML - c'est moi! 
  
  


  

Heading! Everybody duck!

I am content, hear me roar!

浏览器从未使用过冗长的 DOCTYPE 定义或 http-equiv。浏览器执行其工作不需要它。在 HTML5 中,这是一个纯净的 Vanilla 文档



  
  HTML5, c'est moi, ou HTML... 
  
  


  

Heading! Everybody duck!

I am content, hear me roar!

更简单、更短。除此之外,HTML5 还包括新的语义元素



  HTML5, c'est moi, ou HTML... 
  
  


  

Heading! Everybody duck!

I am content, hear me roar!

By me!

这为我们提供了样式处理的句柄,并告诉浏览器不同部分是什么。但是,简化程度更深。由于人们似乎从未费心在 HTML 中编写有效的 XML,因此现在完全可以混合使用大小写并省略属性周围的引号(如果属性具有一个值,则多值属性如类在添加多个值后需要在其周围加上引号)


  HTML5, c'est moi, ou HTML... 
  
  

  

Heading! Everybody duck!

I am content, hear me roar!

By me!

浏览器足够宽容,可以为我们修复这些不一致之处。例如,Firefox 中生成的代码是


  HTML5, c'est moi, ou HTML... 
  
  
  
  

Heading! Everybody duck!

I am content, hear me roar!

By me!

但是,如果我们在 <section> 中省略闭合 </p> 标记,则生成的代码看起来会有所不同


  HTML5, c'est moi, ou HTML... 
  
  

  

Heading! Everybody duck!

I am content, hear me roar!

By me!

如您所见,<footer> 已移动到 section 内部的段落中。为什么?谁知道呢?问题是我们要求浏览器为我们进行有根据的猜测,而由于浏览器不理解语义,因此我们得到了这样的结果。

这导致我提出了一些我们需要询问并找到答案的问题

  • 创新可以基于“人们以前从未正确地做过这件事”吗?
  • 是 HTML 还是 BML?(超文本标记语言还是浏览器标记语言)
  • HTML 是否只应该存在于浏览器中?转换服务、搜索引擎机器人、内容抓取器呢?

我想要讨论的下一个问题是遗留浏览器,这似乎是 IE6 的委婉说法。IE6 的问题是,当您专门使用新的语义 HTML 元素时,就无法在此浏览器中对其进行样式设置。通过使用应该为我们带来诸多好处的正确新语法,您会让旧版浏览器的用户看到未设置样式的文档。

有一些解决方法。第一个需要 JavaScript——如果您首先使用 DOM 创建元素,则可以在 IE 中对其进行样式设置



  
  
  


  

Hello!

Remy Sharp 将此技术很好地封装在一个名为 HTML5 shiv 的脚本中。当然,这意味着您使标记依赖于 JavaScript 才能工作,这与纯粹的 Web 标记理念相悖。您可以通过多种方式解决此依赖关系。您可以 将 HTML5 编写为 XHTML,您可以 使用条件注释或命名空间,或者您可以同时使用新的语义元素和带有类的 DIV 来满足所有浏览器的需求


  
    HTML5, c'est moi, ou HTML... 
    
    
    
  
  
  

Heading! Everybody duck!

I am content, hear me roar!

这似乎是最实用的解决方案,但需要付出很多额外的努力。

主要问题在于,不仅遗留浏览器无法正确支持 HTML5,这也是人们倾向于使用像 Modernizr 这样的库来检查 HTML5 支持情况后再应用它的原因。Modernizr 在检查当前浏览器支持哪些功能后,会向 HTML 元素添加类,从而为您提供在渐进增强中使用的句柄。所有这些技巧和修复程序也包含在 HTML5 Boilerplate 中,包括服务器设置以及使遗留浏览器正常工作的方法。从本质上讲,如果您在真实世界中对其进行测试,则体积更小的 Vanilla HTML5 标记又会变成大量代码。

如果您还想使用所有很酷的新 JavaScript API,则可以使用 Polyfill 来使遗留浏览器对您编写的代码做出一些处理。

这导致了更多我们需要回答的问题

  • 我们应该将新技术硬塞进遗留浏览器吗?
  • 补丁是否会增加复杂性,因为我们需要测试它们的性能?(为旧版浏览器提供看起来很糟糕或导致其速度下降的功能毫无意义)
  • 如何将 IE 修复程序移动到服务器端?在检查浏览器后,使用 PHP/Ruby/Python 中带有类的 DIV 进行填充,并且 IE 不使用 JS?

我想要讨论的 HTML5 的最后一个功能是视频和音频。同样,它比表面上看起来要复杂得多

从技术上讲,嵌入 HTML5 视频应该像这样简单

但是,一旦您考虑了不同浏览器所需的各种不同格式,工作量就会大大增加

原因是知识产权、法律编解码器之争以及不同浏览器和平台中视频的实现。从本质上讲,您需要以三种格式提供视频。当然,当有需求时,总会有公司想出解决方案。Vid.ly 是 encoding.com 的一项服务,它为您提供一个唯一的 URL,该 URL 会以正确的格式将视频发送到您使用的设备。总而言之,他们为您创建了 28 种不同的格式,以满足各种移动设备和浏览器的需求。

HTML5 视频的另一个大问题是无法防止下载视频。这是预期的结果,但对于网络上的高级内容来说是一个大问题。正如 Adobe 这篇文章的评论中所讨论的,发布者希望有一种方法来阻止人们下载和重新使用他们的视频,而是希望他们的受众在封闭的环境中观看它们。

总而言之,在涉及 HTML5 视频时,需要回答一些问题

  • 我们能否期望内容创建者创建多种格式的视频来支持一项开放技术?
  • 是否可以信任像 vid.ly 这样的服务来进行内容创建和存储?
  • HTML5 不适用于高级内容吗?

最后,我希望每位开发者和设计师都能够站出来,并要求对这些问题给出答案。仅仅说“就是这样”毫无意义。当我们保持技术封闭,并依靠脚本使网站正常工作时,从长远来看,我们确实会破坏网络。关于链接的 hashbang 的当前争论 就说明了这一点。

每个人都可以参与到 HTML5 工作组 中,并 向 MDN 添加文档——是时候开始工作了。

关于 Chris Heilmann

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

更多 Chris Heilmann 的文章…


9 条评论

  1. Jamie

    发布者希望有一种方法来阻止人们下载和重新使用他们的视频,而是希望他们的受众在封闭的环境中观看它们 << 这是 HTML5“工程驱动”的一个例子吗?

    2011 年 2 月 14 日 11:22

  2. Simon

    在你的第三个例子(你引入新的语义元素的地方),你用{header}替换了{h1}。但你没有明确说明它们并不等价——{h1}是一个现有的语义标签,表示顶级标题,通常会以大号加粗的样式显示。相比之下,{header}只是一个带有语义含义的div——一个标题的容器,但没有暗示任何特定的样式。在实践中,{header}通常包含一个{h1}标签(或其他标题)。

    2011年2月14日 13:28

    1. 贪婪

      如果{header}和{h*}之间的区别在(规范中)如此微妙,那么它要么会被完全忽略,要么会被完全按照Chris的方式使用。这是一件好事。

      2011年2月14日 21:15

      1. Luca Salvini

        规范对{header}元素做了相当清晰的说明

        “header元素通常包含该部分的标题(一个h1-h6元素或一个hgroup元素),但也可能包含其他内容,例如目录、搜索表单或任何相关的徽标”

        使用{header}代替{h*}是错误的。

        2011年2月15日 04:18

        1. Chris Heilmann

          是的,这是完全正确的。但它错过了论点的重点,即{header}是一个新的HTML5元素,*应该*为我们提供更多语义值并更好地组织文档,但目前浏览器或搜索引擎根本没有使用它。

          而且它在旧版浏览器中没有获得任何样式——所以与其争论{header}中缺少{h1},不如考虑一下这一点。

          2011年2月15日 04:39

  3. JulienW

    你好,

    关于“旧版”(有时也包括IE7和IE8),我认为HTML 5和CSS 3本质上是向后兼容的,我们大多数情况下不需要Modernizr。

    我们可以为一些真正很酷的ES5新方法使用polyfill(这就是我所做的),但当然我们必须测试这些浏览器上的体验是否正确。

    关于你的第一个问题,我想你在问题中自己回答了。当然,我不能编写不是某种XML的HTML。我认为我们都应该这样做。HTML5的新之处在于,如果你不这样做,所有浏览器都会以相同的方式运行,但这并不意味着它会按照你想要的方式运行。

    而且我绝对认为网络应该易于解析。

    2011年2月15日 00:17

  4. Felix Pleșoianu

    “发布者希望有一种方法阻止人们下载和重新使用他们的视频”

    好吧,他们做不到。如果我可以在电脑屏幕上观看,我就可以捕捉它。他们什么时候才能明白这一点?这。没。有。魔法。

    也就是说,我喜欢关于南极雪地巡洋车的部分,以及与HTML 4的并行关系。你可能还记得,W3C曾经想在某个时候通过XHTML2走得更远。幸运的是,现实世界中没有人理会他们。

    2011年2月15日 00:21

  5. JulienW

    哦,我不明白整个好的,让我们同时使用语义标记和带有id的额外div。去他的,只使用额外的div!你的网站将更容易维护并且也能正常工作。

    2011年2月15日 00:22

  6. WulfTheSaxon

    不是伦敦,而是阿肯色州?:P

    2011年2月15日 12:01

本文评论已关闭。