本文译自 What’s New in HTML 5.2?

作者 Ire Aderinokun,是一位前端开发者和 UI 设计师。

就在不到一个月之前,HTML 5.2 成为了 W3C 的官方推荐规范(REC),这意味着它得到了来自 W3C 主席及其成员的官方支持,W3C 组织将正式向浏览器厂商和 web 开发者推荐应用这一规范。

在 REC 阶段之前,规范中的每一个新特性都应当已经有了至少两个独立实现。所以对于我们这些 web 开发者来说,现在已经可以开始实际应用这些新特性了。

要了解 HTML 5.2 中的所有变化之处,可以阅读这份官方的文档。在这篇文章里,我会梳理一下我认为我的开发工作影响比较大的变化。

新特性

原生的 <dialog> 元素

在 HTML 5.2 的所有变化里我感到最为激动的就是引入了 <dialog> 元素,实现了浏览器原生的对话框。对话框在 web 开发中非常常见,但是现在每个实现都不太一样。另一方面,实现一个支持无障碍化的对话框很难,实际上,现在 web 上使用的大多数对话框对于视觉障碍人士来说都是难以使用的。

新引入的

首先,使用

  1. <dialog>  

  2.  <h2>对话框标题</h2>

  3.  <p>对话框的内容写在这里</p>

  4. </dialog>

默认情况下,对话框是不可见的,除非你设置了open属性。

  1. <dialog open>

open属性可以通过 HTMLDialogElement上的 show()和close()方法来改变。

  1. <button id="open">打开对话框</button>  

  2. <button id="close">关闭对话框</button>

  3. <dialog id="dialog">  

  4.  <h2>对话框标题</h2>

  5.  <p>对话框的内容写在这里</p>

  6. </dialog>

  7. <script>  

  8. const dialog = document.getElementById("dialog");

  9. document.getElementById("open").addEventListener("click", () => {  

  10.  dialog.show();

  11. });

  12. document.getElementById("close").addEventListener("click", () => {  

  13.  dialog.close();

  14. });

  15. </script>  

目前,Chrome 已经支持了 <dialog> 元素,而在 Firefox 中可以通过配置打开这一特性。具体情况可以查看 https://caniuse.com/#feat=dialog。

在 iframe 里使用支付请求 API

支付请求 API 是由浏览器原生提供支付方式,旨在为用户在 web 上进行支付提供一个标准而且一致的方法。它让浏览器提供统一一致的界面来搜集用户的支付信息,而不是让用户填写各个网站自己的支付表单。

在 HTML 5.2 之前,支付请求 API 不能在 iframe 中 使用。这使得那些第三方提供的嵌入式支付解决方案(例如 Stripe、Paystack)完全无法利用这个 API,因为它们的支付接口都是需要在一个 iframe 中进行处理的。

HTML 5.2 为 iframe 引入了一个 allowpaymentrequest 属性,设置这个属性就可以允许 iframe 中使用支付请求 API 了。

  1. <iframe allowpaymentrequest/>

为苹果设备定义不同尺寸的图标

通过在 HTML 文档的头部使用 <linkrel="icon">,我们可以定义网页的图标。同时,还可以使用 sizes属性来定义多个不同尺寸的图标。

  1. <link rel="icon" sizes="16x16" href="path/to/icon16.png">  

  2. <link rel="icon" sizes="32x32" href="path/to/icon32.png">

虽然这个定义完全是建议性的,但它允许浏览器来自主决定使用哪个图标。尤其是像现在大多数设备的最优图标尺寸都不一样,只有浏览器自己才知道怎样的图标尺寸更为合适。

在 HTML 5.2 以前, sizes 属性仅仅当 link 标签的 rel 属性为 icon 时才视为有效。可是,苹果的 iOS 设备并不支持这种 sizes 属性,它引入了一个私有的 rel 值 apple-touch-icon,用于定义网页在苹果设备上的图标。

在 HTML 5.2 中,规范的这一限制被去除,当 reliconapple-touch-icon 时都可以使用 sizes 属性。

新的有效写法

除了引入一些新特性,HTML 5.2 中也把一些之前被规范认为无效的 HTML 写法变成有效。

多个 <main> 元素

<main>元素用于表达网页的主体内容。对于在多个网页中会反复出现的内容,我们可以把它们放在 header、section 或者别的元素中,但 <main>元素是被设计用于专门放置页面上特定且唯一的内容的。因此,在 HTML 5.2 之前,规范要求

元素在页面的 DOM 结构中只能出现一次。

可是随着单页应用的流行,我们难以再去坚持这一准则。可以设想会有这样一种情况:DOM 中有需要有多个 <main> 元素,但在同一时间用户只会看到其中一个。

在 HTML 5.2 中,现在只要能保证用户同时只能看到一个 <main> 元素,我们就可以在页面中多次使用这个标签。其它不显示的 <main>元素必须通过 hidden 属性设置为隐藏。

  1. <main>...</main>  

  2. <main hidden>...</main>  

  3. <main hidden>...</main>  

我们都很清楚利用 CSS 有多种办法可以隐藏元素。可是对于页面上的多个 <main> 元素,我们必须用 hidden 属性将目前不需要显示的元素进行隐藏。任何别的方法,比如 display:none; 或者 visibility:hidden;,都会被规范认为是无效的。

在 <body> 中定义样式

一般情况下,我们都会使用 <style> 标签来定义内联 CSS,并将其放置在 HTML 文档的 <head> 中。但随着组件化开发的兴起,开发者们开始逐渐倾向于把样式定义和与之相关的 HTML 元素放在一起。

在 HTML 5.2 中,在 <body> 中的任何地方都可以定义 <style> 块,规范现在将其也视为有效。也就是说我们现在可以让样式定义就出现在样式被使用的地方。

  1. <body>  

  2.    <p>I’m cornflowerblue!</p>

  3.    <style>

  4.        p { color: cornflowerblue; }

  5.    </style>

  6.    <p>I’m cornflowerblue!</p>

  7. </body>  

可是仍然需要注意的是,从性能角度考虑,样式定义最好还是放在 <head> 中。规范中也提到:

在文档的头部使用样式元素是一种更为可取的做法。在文档体内使用样式可能会导致页面样式重排、触发重新布局或(和)重绘,因此应该谨慎使用这一方式。

还应当注意的是,像在上面这个例子中,样式定义仍然是作用于全局的。在 HTML 文档内出现的样式定义仍然会应用于在其前面的元素之上,这也是它会造成重绘的原因。

在 <Legend> 内使用 h# 标签

<legend> 用于在表单中表示一个 <fieldset> 的标题。在 HTML 5.2 之前, <legend> 中的内容只能使用纯文本,现在我们可以在其中使用 h# 标签。

  1. <fieldset>  

  2.    <legend><h2>基本信息</h2></legend>

  3.    <!-- 基本信息的表单域 -->

  4. </fieldset>  

  5. <fieldset>  

  6.    <legend><h2>联系方式</h2></legend>

  7.    <!-- 联系方式的表单域 -->

  8. </fieldset>

当我们想使用 <fieldset> 来为表单中不同部分进行分组时,这一用法非常有用。就像上面这个例子,使用 h# 标签可以让那些依赖于文档大纲视图进行导航的用户更为方便地跳转到这些表单分组区域。

被移除的特性

在 HTML 5.2 中,有些特性被移除了,包括:

  • keygen:用于为表单生成公钥

  • menu 和 menuitem:用于创建导航或菜单

新的视为无效的写法

最后,还有一些开发实践被规范认为是无效的。

<p> 元素中不允许包含行内、浮动或者块级元素

在 HTML 5.2 中, <p> 元素只能包含短语内容(译者注:phrasing content,具体解释可参见这里)。下列元素类型不能再被嵌套在一个段落中:

  • 行内块

  • 行内表格

  • 浮动或者定位的块

不再需要严格的 Doctype 声明

我们终于可以和下面这种严格的文档类型说明说再见了:

  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">

    1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"

HTML 5.2 新特性介绍的更多相关文章

  1. dubbox新特性介绍

    dubbx是当当网对原阿里dubbo2.x的升级,并且兼容原有的dubbox.其中升级了zookeeper和spring版本,并且支持restfull风格的远程调用. dubbox git地址:  h ...

  2. Hadoop3.0新特性介绍,比Spark快10倍的Hadoop3.0新特性

    Hadoop3.0新特性介绍,比Spark快10倍的Hadoop3.0新特性 Apache hadoop 项目组最新消息,hadoop3.x以后将会调整方案架构,将Mapreduce 基于内存+io+ ...

  3. jdk7和8的一些新特性介绍

    jdk7和8的一些新特性介绍 本文是我学习了解了jdk7和jdk8的一些新特性的一些资料,有兴趣的大家可以浏览下下面的内容. 官方文档:http://www.oracle.com/technetwor ...

  4. ArcGIS 10.3 for Desktop新特性介绍

    ArcGIS 10.3是一个完整公布的ArcGIS平台,它包含新的产品(ArcGIS Pro),针对10.2版本号产品进行了功能增强和稳定性的改进. ArcGIS 10.3 for Server新特性 ...

  5. Xcode9新特性介绍-中文篇

    背景: Xcode 9 新特性介绍: 1.官方原文介绍链接 2.Xcode9 be ta 2 官方下载链接 本文为官方介绍翻译而来,布局排版等都是按照官方布局来的. 与原文相比,排版上基本还是熟悉的配 ...

  6. php7函数,声明,返回值等新特性介绍

    使用 ... 运算符定义变长参数函数 (PHP 5 >= 5.6.0, PHP 7) 现在可以不依赖 func_get_args(), 使用 ... 运算符 来实现 变长参数函数. functi ...

  7. webpack 4.0.0-beta.0 新特性介绍

    webpack 可以看做是模块打包机.它做的事情是:分析你的项目结构,找到JavaScript模块以及其它的一些浏览器不能直接运行的拓展语言(Scss,TypeScript等),并将其打包为合适的格式 ...

  8. MyBatis 3.5.2 新特性介绍

    1.MyBatis 最新版本 3.5.2 发布 MyBatis最新版本是:3.5.2,发布时间是:2019年7月15日 2.MyBatis 3.5.2 新特征介绍 我们知道,MyBatis 是支持定制 ...

  9. Java 11 新特性介绍

    Java 11 已于 2018 年 9 月 25 日正式发布,之前在Java 10 新特性介绍中介绍过,为了加快的版本迭代.跟进社区反馈,Java 的版本发布周期调整为每六个月一次——即每半年发布一个 ...

  10. Pivotal Greenplum 6.0 新特性介绍

    Pivotal Greenplum 6.0 新特性介绍   在1月12日举办的Greenplum开源有道智数未来技术研讨会上,Pivotal中国研发中心Greenplum 产品经理李阳向大家介绍了Pi ...

随机推荐

  1. 腾讯云中ssL证书的配置安装

    https://cloud.tencent.com/document/product/619/12797 配置 Nginx 和 HTTPS 完成以上准备工作,就要开始配置 Nginx 和 HTTPS ...

  2. 如何用SVN版本控制器将提交的文件还原到以前的版本

    工具/原料 SVN乌龟软件和相关的文件 方法/步骤 在相关的文件中右击鼠标,按右图进行选择 在弹出框的地方点击我标记的地方,查看下曾经提交过的版本文件 在弹出框的地方,上面就是有版本号,下面就是我们文 ...

  3. PHP条件语句if的使用

    方法/步骤 if(条件){是否执行的代码...}:这样的用法常用于判断单一条件,当然,可以可以用逻辑符号将多个条件组合成同一条件. if else语句:如果条件不成立,就会执行else后面{}里的代码 ...

  4. CSS3 [attribute^=value] 选择器

    设置 class 属性值以 "test" 开头的所有 div 元素的背景色: div[class^="test"] { background:#ffff00; ...

  5. MYSQL GROUP BY Optimization

    GROUP BY Optimization 常规的匹配group by(分组)操作子句是扫整表并且创建包含连续的分组行的临时表, 利用临时表得到group数据,运用appregate function ...

  6. RocketMQ-消费重试机制

    介绍: RocketMQ的消息重试及时分为两种,一种是Producer端重试,一种是Consume端重试. 1.Producer端重试 : 1.1消息发没发成功,默认情况下是3次重试. 2.Consu ...

  7. linkin大话设计模式--代理模式

    代理模式是一种应用非常广泛的设计模式,当客户端代码需要调用某个对象的时候,客户端并不关心是否可以准确的得到这个对象,他只要一个能够提供该功能的对象而已,此时我们就可以返回该对象的代理.总而言之,客户端 ...

  8. 2018-02-03-jekyll框架下的post如何显示图片

    layout: post title: 2018-02-03-jekyll框架下的post如何显示图片 key: 20180203 tags: blog post modify_date: 2018- ...

  9. TCP连接之未连接队列的理解[转]

    tcp服务器在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接. 第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认 ...

  10. 面向对象_03【关键字:final使用】

    final关键字:可修饰类.变量名和方法1,final修饰的类不能被继承2,final修饰的变量(成员.局部)是常量,只能赋值一次.3,final修饰的方法不能被子类重写Example:一:修饰类 / ...