创建出色的表单
学习google的web基础的学习笔记,
from Create amazing forms。
表单中需要填写的内容应当尽量少。
每一项都要有一个label。label标签为input元素定义标注。此外,当用户选择该标签时,浏览器就会自动将焦点转到和标签相关的表单控件上。
<label>标签的 for 属性应当与相关元素的 id 属性相同。
- 使用placeholder来提示用户输入的内容。
当有输入时,提示内容会消失。
- autofocus 属性
在某些表单上,例如 Google 首页,需要用户做 的唯一操作是填写一个特定字段,就可以加上 autofocus 属性。 在设置了此属性时,桌面浏览器会立即将焦点移到输入 字段,使用户可以轻松快速地开始填写表单。 移动 浏览器会忽略 autofocus 属性,以防止键盘随机 显示。
要小心使用 autofocus 属性,因为它将侵占键盘焦点, 并且可能阻止使用退格符 来进行导航。
1 | <input type="text" autofocus...> |
- type属性可以帮助手机浏览器弹出正确的键盘:
- 使用 datalist 在输入时提供建议值
datalist 元素不是输入类型,而是与一个表单字段关联的 建议输入值的列表。 它允许浏览器在用户输入时 建议自动完成选项。 datalist 元素与 select 元素不同,它无需用户浏览长列表来 找出所需的值,也不限制用户只能选择 这些选项,此元素在用户输入时提供提示。
1 | <labelfor="frmFavChocolate">Favorite Type of Chocolate</label> |
- 使用元数据来实现自动完成
当网站自动填写一些常见字段(如姓名、电子邮件地址和其他常用字段) 为用户节省时间时,用户会很喜欢,并且还能 帮助减少潜在的输入错误,尤其是在使用虚拟键盘和 很小的设备时。
浏览器使用许多启发方法,根据 用户之前指定的数据 来确定可以 自动填充哪些字段,并且您可以为每个 输入元素提供 name 属性和 autocomplete 属性来提示浏览器。
例如,要提示浏览器应给表单自动填写 用户名、电子邮件地址和电话号码,应当使用:
1 | <label for="frmNameA">Name</label> |
- 实时反馈用户的输入,不要在整个表单填写完成以后才反馈输入错误的地方。
使用input标签的pattern属性来检查输入,属性值是正则表达式。
使用title属性来描述模式,title属性会在用户输入错误时显示。
pattern属性可用于以下type类型的输入:text, search, url, telephone, email 以及 password 。
1 | <input type="text" pattern="^/d{5,6}(?:[-\s]\d{4})?$"...> |
使用required属性,使得表单才提交时该项必须有值。
对于数字类型的输入,例如numbers, ranges, dates, times。可以使用 min和max属性来确定最大最小值,这会使得输入框出现箭头来调整大小:
并且还可以使用step来设定点击箭头进行调整的步长。
- maxlength属性用于限制最长输入:
1 | <inputtype="text"id="83filename"maxlength="12"...> |
同理还有minlength
1 | <inputtype="text"id="83filename"minlength="8"...> |
- novalidate 属性
在某些情况下,即使表单包含无效的输入,您也可能想允许 用户提交表单。 为此,可给表单元素或单独的输入字段加上 novalidate 属性。 在这种情况下,所有伪类和 JavaScript API 仍将允许您检查表单是否通过验证。
1 | <form role="form"novalidate> |
- 使用 JavaScript 实现更复杂的实时验证
当内置验证加上正则表达式还不够时,可以使用 约束验证 API, 这是一个用于处理自定义验证的强大工具。
此 API 使您能够进行各种验证, 例如设置自定义错误,检查一个元素是否有效,并确定 元素无效的原因:
| API | 描述 |
|---|---|
| setCustomValidity() | 设置自定义验证消息,并将 ValidityState 对象的 customError 属性设置为true。 |
| validationMessage | 返回一个字符串,说明输入值未通过验证测试的原因。 |
| checkValidity() | 如果所有元素满足其所有约束条件,则返回 true,否则返回false。 由开发者决定在检查返回 false 时页面如何响应。 |
| reportValidity() | 如果所有元素满足其所有约束条件,则返回 true,否则返回false。 当页面响应 false 时,向用户报告约束问题。 |
| validity | 返回一个表示元素有效状态的 ValidityState 对象。 |
例如,添加listener在表单提交之前使用checkValidity()函数来检查表单的有效性
如果检查不通过,拒绝提交,然后通知用户错误的原因。
还可以设置自定义验证消息
如果字段未通过验证,可使用 setCustomValidity() 来将字段标记为无效 并解释字段未通过验证的原因。
例如,注册表单可能 要求用户通过输入两次来确认其电子邮件地址。 对第二个输入使用 blur 事件,
以验证两个输入值,并设置相应的 响应。 例如:
1 | if(input.value!=primaryEmail){// the provided value doesn't match the primary email addressinput. |
- 实时显示反馈
在用户提交表单之前,就在每个字段提供可视指示,提示 用户是否已正确填写表单,这样做很有帮助。
HTML5 也引入了很多新的伪类,可以用于根据输入值或属性来设置 输入的样式。
| 伪类 | 用途 |
|---|---|
| :valid | 明确地设置当输入值符合所有验证要求时,要使用的输入值样式。 |
| :invalid | 明确地设置在输入值不符合所有验证要求时,要使用的输入值样式。 |
| :required | 明确地设置已设定 required 属性的输入元素的样式。 |
| :optional | 明确地设置未设定 required 属性的输入元素的样式。 |
| :in-range | 明确地设置在输入值处于范围内时 number 输入元素的样式。 |
| :out-of-range | 明确地设置在输入值超出范围时 number 输入元素的样式。 |
验证是立即进行的,意味着当页面加载时,即使用户 尚未填写各字段,就可以将字段标记为 无效。
它还意味着,用户正在输入时就可能看到 提示样式无效。 为防止此问题,可以将 CSS 与 JavaScript 结合,
只在用户已访问此字段时才显示无效的样式。
1 | input.dirty:not(:focus):invalid{ |
1 | var inputs=document.getElementsByTagName("input"); |
总结一下:
- fewest inputs.
- easy to understand.
- have large tap targets.
- use the right keyboards.
- give users lots of feedback.