有了基础知识,我们现在更详细地了解了用于为表单的不同部分提供结构和意义的元素。

前提条件: 基本的计算机能力, 和基本的 对HTML的理解
目标: 要理解如何构造HTML表单并赋予它们语义,以便它们是可用的和可访问的。

HTML表单的灵活性使它们成为HTML中最复杂的结构之一;您可以使用专用的表单元素和属性构建任何类型的基本表单。在构建HTML表单时使用正确的结构将有助于确保表单可用性和可访问性。

<form> 元素

<form> 元素按照一定的格式定义了表单和确定表单行为的属性。

当您想要创建一个HTML表单时,都必须从这个元素开始,然后把所有内容都放在里面。

许多辅助技术或浏览器插件可以发现<form>元素并实现特殊的钩子,使它们更易于使用。

我们早在之前的文章中就遇见过它了。

注意: 
  严格禁止在一个表单内嵌套另一个表单。
  嵌套会使表单的行为不可预知,而这取决于正在使用的浏览器。

  请注意,在<form>元素之外使用表单小部件是可以的,但是如果您这样做了,那么表单小部件与任何表单都没有任何关系。

  这样的小部件可以在表单之外使用,但是您应该对于这些小部件有特别的计划,因为它们自己什么也不做。

  您将不得不使用JavaScript定制他们的行为。

注意:

  HTML5在HTML表单元素中引入form属性。

  它让您显式地将元素与表单绑定在一起,即使元素不在<form>中。

  不幸的是,就目前而言,跨浏览器对这个特性的实现还不足以使用。


<fieldset> 和 <legend> 元素

<fieldset>元素是一种方便的用于创建具有相同目的的小部件组的方式,出于样式和语义目的。

你可以在<fieldset>开口标签后加上一个 <legend>元素来给<fieldset> 标上标签。

<legend>的文本内容正式地描述了<fieldset>里所含有部件的用途。

许多辅助技术将使用<legend> 元素,就好像它是相应的 <fieldset> 元素里每个部件的标签的一部分。

例如,在说出每个小部件的标签之前,像JawsNVDA这样的屏幕阅读器会朗读出legend的内容。

这里有一个小例子:

<form>
<fieldset>
<legend>Fruit juice size</legend>
<p>
<input type="radio" name="size" id="size_1" value="small">
<label for="size_1">Small</label>
</p>
<p>
<input type="radio" name="size" id="size_2" value="medium">
<label for="size_2">Medium</label>
</p>
<p>
<input type="radio" name="size" id="size_3" value="large">
<label for="size_3">Large</label>
</p>
</fieldset>
</form>

注意: 你可以在 fieldset-legend.html (你也可以看预览版) 看到该例。

当阅读上述表格时,屏幕阅读器将会读第一个小部件“Fruit juice size small”,“Fruit juice size medium”为第二个,“Fruit juice size large”为第三个。

本例中的用例是最重要的。每当您有一组单选按钮时,您应该将它们嵌套在<fieldset>元素中。还有其他用例,一般来说,<fieldset>元素也可以用来对表单进行分段。

理想情况下,长表单应该在拆分为多个页面,但是如果表单很长,却必须在单个页面上,那么将以不同的关联关系划分的分段,分别放在不同的fieldset里,可以提高可用性。

因为它对辅助技术的影响, <fieldset> 元素是构建可访问表单的关键元素之一。

无论如何,你有责任不去滥用它。如果可能,每次构建表单时,尝试侦听屏幕阅读器如何解释它。

如果听起来很奇怪,试着改进表单结构。

<label> 元素

正如我们在前一篇文章中看到的, <label> 元素是为HTML表单小部件定义标签的正式方法。

如果你想构建可访问的表单,这是最重要的元素——当实现的恰当时,屏幕阅读器会连同有关的说明和表单元素的标签一起朗读。

以我们在上一篇文章中看到的例子为例:

<label for="name">Name:</label> <input type="text" id="name" name="user_name">

<label> 标签与 <input> 通过他们各自的for 属性和 id 属性正确相关联(label的for属性和它对应的小部件的id属性),这样,屏幕阅读器会读出诸如“Name, edit text”之类的东西。

如果标签没有正确设置,屏幕阅读器只会读出“Edit text blank”之类的东西,这样会没什么帮助。

注意,一个小部件可以嵌套在它的<label>元素中,就像这样:

<label for="name">
Name: <input type="text" id="name" name="user_name">
</label>

尽管可以这样做,但人们认为设置for属性才是最好的做法,因为一些辅助技术不理解标签和小部件之间的隐式关系。

标签也可点击!

正确设置标签的另一个好处是可以在所有浏览器中单击标签来激活相应的小部件。

这对于像文本输入这样的例子很有用,这样你可以通过点击标签,和点击输入区效果一样,来聚焦于它,

这对于单选按钮和复选框尤其有用——这种控件的可点击区域可能非常小,设置标签来使它们可点击区域变大是非常有用的。

举个例子:

<form>
<p>
<label for="taste_1">I like cherry</label>
<input type="checkbox" id="taste_1" name="taste_cherry" value="1">
</p>
<p>
<label for="taste_2">I like banana</label>
<input type="checkbox" id="taste_2" name="taste_banana" value="2">
</p>
</form>

注意: 你可以在 checkbox-label.html (你也可以看预览版) 看到该例。

多个标签

严格地说,您可以在一个小部件上放置多个标签,但是这不是一个好主意,因为一些辅助技术可能难以处理它们。

在多个标签的情况下,您应该将一个小部件和它的标签嵌套在一个<label>元素中。

让我们考虑下面这个例子:

<p>Required fields are followed by <abbr title="required">*</abbr>.</p>

<!--这样写:-->
<div>
<label for="username">Name:</label>
<input type="text" name="username">
<label for="username"><abbr title="required">*</abbr></label>
</div> <!--但是这样写会更好:-->
<div>
<label for="username">
<span>Name:</span>
<input id="username" type="text" name="username">
<abbr title="required">*</abbr>
</label>
</div> <!--但最好的可能是这样:-->
<div>
<label for="username">Name: <abbr title="required">*</abbr></label>
<input id="username" type="text" name="username">
</div>

顶部的段落定义了所需元素的规则。它必须在开始时确保像屏幕阅读器这样的辅助技术在用户找到必需的元素之前显示或念出它们。

这样,他们就知道星号表达的是什么意思了。

根据屏幕阅读器的设置,屏幕阅读器会把星号读为“star”或“required”,取决于屏幕阅读器的设置——不管怎样,要念出来的都会在第一段清楚的呈现出来。

  • 在第一个例子中,标签根本没有和input一起被念出来——读出来的只是“edit the blank”,和单独被念出的标签。多个<label>元素会使屏幕阅读器迷惑。
  • 在第二个例子中,事情变得清晰一点了——标签和输入一起,读出的是“name star name edit text”,但标签仍然是单独读出的。这还是有点令人困惑,但这次还是稍微好一点了,因为inputlabel联系起来了。
  • 第三个例子是最好的——标签是一起读出的,标签和输入读出的是“name star edit text”。

注意:

  你可能会得到一些不同的结果,这取决于你的屏幕阅读器。

  这是在VoiceOver上测试的(NVDA的行为也类似)。我们也乐于听听你的试验结果。

注意:

  你可以在 GitHub 上看到 required-labels.html (你也可以看预览版)。

  不要运行2个或3个未注释版本的示例—— 如果您有多个标签和多个输入相同的ID,

  那么屏幕阅读器肯定会感到困惑!

用于表单的通用HTML结构

除了特定于HTML表单的结构之外,还应该记住表单同样是HTML。

这意味着您可以使用HTML的所有强大功能来构造一个HTML表单。

正如您在示例中可以看到的,用<div>元素包装标签和它的小部件是很常见的做法。

<p>元素也经常被使用,HTML列表也是如此(后者在构造多个复选框或单选按钮时最为常见)。

除了<fieldset>元素之外,使用HTML标题(例如,<h1><h2>)和分段(如<section>)来构造一个复杂的表单也是一种常见的做法。

最重要的是,你要找到一种你觉得很舒服的风格去码代码,而且它也能带来可访问的、可用的形式。

它包含了从功能上划分开并分别包含在<section>元素中的部分,以及一个<fieldset>来包含单选按钮。


自主学习:构建一个表单结构

让我们把这些想法付诸实践,建立一个稍微复杂一点的表单结构——一个支付表单。这个表单将包含许多您可能还不了解的小部件类型—现在不要担心这个;在下一篇文章(原生表单小部件)中,您将了解它们是如何工作的。现在,当您遵循下面的指令时,请仔细阅读这些描述,并开始理解我们使用的包装器元素是如何构造表单的,以及为什么这么做。

  1. 在开始之前,在计算机上的一个新目录中,创建一个空白模板文件我们的支付表单的CSS样式的本地副本。
  2. 首先,通过添加下面这行代码到你的HTML<head>使你的HTML应用CSS。
    <link href="payment-form.css" rel="stylesheet">
  3. 接下来,通过添加外部<form>元素来开始一张表单:
    <form>
    
    </form>
  4. 在 <form> 标签内,以添加一个标题和段落开始,告诉用户必需的字段是如何标记的:
    <h1>Payment form</h1>
    <p>Required fields are followed by <strong><abbr title="required">*</abbr></strong>.</p>
  5. 接下来,我们将在表单中添加一个更大的代码段,在我们之前的代码下面。在这里,您将看到,我们正在将联系人信息字段包装在一个单独的<section>元素中。此外,我们有一组两个单选按钮,每个单选按钮都放在自己的列表中(<li>))元素。最后,我们有两个标准文本<input>和它们相关的<label>元素,每个元素包含在<p>中,加上输入密码的密码输入。现在将这些代码添加到您的表单中:
    <section>
    <h2>Contact information</h2>
    <fieldset>
    <legend>Title</legend>
    <ul>
    <li>
    <label for="title_1">
    <input type="radio" id="title_1" name="title" value="M." >
    Mister
    </label>
    </li>
    <li>
    <label for="title_2">
    <input type="radio" id="title_2" name="title" value="Ms.">
    Miss
    </label>
    </li>
    </ul>
    </fieldset>
    <p>
    <label for="name">
    <span>Name: </span>
    <strong><abbr title="required">*</abbr></strong>
    </label>
    <input type="text" id="name" name="username">
    </p>
    <p>
    <label for="mail">
    <span>E-mail: </span>
    <strong><abbr title="required">*</abbr></strong>
    </label>
    <input type="email" id="mail" name="usermail">
    </p>
    <p>
    <label for="pwd">
    <span>Password: </span>
    <strong><abbr title="required">*</abbr></strong>
    </label>
    <input type="password" id="pwd" name="password">
    </p>
    </section>
  6. 现在,我们将转到表单的第二个<section>——支付信息。在这里,我们有三个不同的小部件以及它们的标签,每个都包含在一个<p>中。第一个是选择信用卡类型的下拉菜单(<select>)。第二个是输入一个信用卡号的类型编号的 <input> 元素。最后一个是输入date类型的<input> 元素,用来输入卡片的过期日期(这将在支持的浏览器中出现一个日期选择器小部件,并在非支持的浏览器中回退到普通的文本输入)。同样,在之前的代码后面输入以下内容:
    <section>
    <h2>Payment information</h2>
    <p>
    <label for="card">
    <span>Card type:</span>
    </label>
    <select id="card" name="usercard">
    <option value="visa">Visa</option>
    <option value="mc">Mastercard</option>
    <option value="amex">American Express</option>
    </select>
    </p>
    <p>
    <label for="number">
    <span>Card number:</span>
    <strong><abbr title="required">*</abbr></strong>
    </label>
    <input type="number" id="number" name="cardnumber">
    </p>
    <p>
    <label for="date">
    <span>Expiration date:</span>
    <strong><abbr title="required">*</abbr></strong>
    <em>formatted as mm/yy</em>
    </label>
    <input type="date" id="date" name="expiration">
    </p>
    </section>
  7. 我们要添加的最后一个部分要简单得多,它只包含了一个submit类型的 <button> ,用于提交表单数据。现在把这个添加到你的表单的底部:
    <p> <button type="submit">Validate the payment</button> </p>

总结

现在,您已经具备了正确地构造HTML表单所需的所有知识;下一篇文章将深入介绍各种不同类型的表单小部件,您将希望从用户那里收集信息。

摘自: https://developer.mozilla.org/zh-CN/docs/Learn/HTML/Forms/How_to_structure_an_HTML_form

【H5】13 表单 其二 如何构造的更多相关文章

  1. H5学习之旅-H5的表单(11)

    H5的表单元素 form:表单 input:输入域,type属性可以设置text,password,button等不同的属性 textarea:文本域 lable:控制标签 fieldset:定义域 ...

  2. html5--3.13 表单的新增属性

    html5--3.13 表单的新增属性 学习要点 掌握表单新增属性的使用 HTML5新增表单属性 之前课程中已经接触过的新增属性:autocomplete属性/autofocus属性/list属性/m ...

  3. H5智能表单

    表单 keygen元素的作用是提供一种验证用户的可靠方法 datalist 元素规定输入域的选项列表 output元素用于不同类型的输出,比如计算或脚本输出 智能表单 input 新增type值 em ...

  4. H5 新增表单属性和事件

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. 移动端H5通用表单验证插件

    将表单验证的通用部分提炼出来,做成一个简易插件,方便调用. 已将源码放到GitHub上,名字叫zValidate. 手机可扫描下图查看示例,PC端可点击此处查看: 一.原理 1)需要引入zepto.j ...

  6. H5新增表单属性

    一.form属性 <form id="test"> <input type="text" placeholder="请输入合适的信息 ...

  7. H5 表单

    伴随着互联网富应用以及移动开发的兴起,传统的Web表单已经越来越不能满足开发的需求,HTML5在Web表单方向也做了很大的改进,如拾色器.日期/时间组件等,使表单处理更加高效. 1.1新增表单类型 - ...

  8. H5利用pattern属性和oninvalid属性验证表单

    HTML代码 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <ti ...

  9. HTML5 十大新特性(二)——表单新特性

    H5的表单新特性可以分为两大类. 一.10个input的type值 1.email:邮件输入域,在表单提交时提供简单的邮箱格式验证,并弹出一个提示窗口. 2.url:地址输入域,在表单提交时提供简单的 ...

  10. 从零开始学习前端开发 — 10、HTML5新标签及表单控件属性和属性值

    一.html5新增标签 1.结构性标签 header 定义网页的头部 nav 定义网页的导航 footer 定义网页的底部 section 定义网页的某个区域 article 定义网页中的一篇文章 a ...

随机推荐

  1. testArticle

    Test Article This is a test article for ArticleSync. Test Edit...... test Edit

  2. 夜莺项目发布 v6.4.0 版本,新增全局宏变量功能

    大家好,夜莺项目发布 v6.4.0 版本,新增全局宏变量功能,本文为大家简要介绍一下相关更新内容. 全局宏变量功能 像 SMTP 的配置中密码类型的信息,之前都是以明文的方式在页面展示,夜莺支持全局宏 ...

  3. 增补博客 第七篇 python 比较不同Python图形处理库或图像处理库的异同点

    OpenCV.Pillow 和 scikit image OpenCV(OpenCV 是一个强大的计算机视觉库,它提供了各种图像处理和计算机视觉算法的实现,可以处理各种图像和视频数据. 异同点 跨平台 ...

  4. Java对称加解密算法AES

    Java对称加解密算法AES import org.apache.commons.codec.binary.Base64; import org.apache.commons.lang3.String ...

  5. ps top命令查看内存空间

    [root@VM-4-3-centos local]# ps aux --sort -rss | head USER PID %CPU %MEM VSZ RSS TTY STAT START TIME ...

  6. 同时开启firewall和iptables

    使用向导 With the iptables service, every single change means flushing all the old rules and reading all ...

  7. CLR via C# 笔记 -- 线程基础(26)

    1. Microsoft 设计这个OS内核时,决定在一个进程中运行应用程序的每个实例.进程实际是应用程序的实例要使用的资源的集合.每个进程都被赋予了一个虚拟地址空间,确保在一个进程中使用的代码和数据无 ...

  8. Kubernetes(三)实战入门

    实战入门 本章介绍如何在kubernetes集群中部署一个nginx服务,并能够对其进行访问. 1. Namespace Namespace主要作用是实现多套环境的资源隔离或者多租户的资源隔离. 默认 ...

  9. Linux创建新用户时遇到的问题记录

    创建新用户命令: useradd -d "/home/guest" -m -s "/bin/bash" guest 报错: useradd: cannot op ...

  10. P3731 题解

    简要题意是找到一条边连接使得最大团大小增加. 在补图上最大团等于最大独立集. 所以问题转化为删掉一条边使得最大独立集增加,又因为团不超过两个,所以原图是二分图,也就是使得最大匹配减少. 考虑什么样的匹 ...