Web技巧(07)

在这一期中咱们一起来聊聊HTML5中的表单。说到HTML,可能很多同学会说,HTML5有什么好聊的,不就是一些HTML的标签吗?事实上并非如此,就拿HTML中的表单中的input元素为例吧,input元素及其相关属性和类型的支持情况都会因为浏览器的不同而存在较大的差异。甚至在支持特定功能的各个浏览器之间,它们的行为也会有所不同。那这一期中,就来围绕着input说点事。

input的现状

有关于HTML5(或者说HTML)中关于input相关的规范在HTML规范的第4.10.5一节中有详细的描述。主要包括了五个部分:

  • input元素的type属性状态
  • 表单控件本地化实现的一些说明
  • input元素常见的一些属性(attributes)
  • input元素通用的一些API
  • input元素通用的一些事件行为

inputtype属性

inputtype属性决定了使用input元素的哪种类型,常见的type属性主要有:hiddentextpasswordcheckboxradiofilesubmitresetimagebutton(HTML4中提到的type属性)。在HTML5中除了具有前面提到的这些type类型之外还增加了**13**种新的type类型:

type类型 用途 备注
tel 用于输入电话号码 tel不执行特定语法,如果想确保特定格式,可以使用patternsetCustomValidity()执行额外的验证
search 用于提示用户输入要搜索的关键词 searchtext主要区别在于样式上。使用search输入类型可能会导致输入字段的样式与平台的搜索字段相一致
url 用于输入单个网址 url用于输入单个表示很大范围值的绝对网址
email 用于输入单个电子邮件地址或电子邮件址列表 如果指定了multiple属性就可以输入多个电子邮件地址,并且以逗号分隔
datetime 用于输入时区设置为UTC的日期和时间  
date 用于输入不含时区的日期  
month 用于输入含年份和月份但不含时区的日期  
week 用于输入含牛份和周数但不含时区的日期  
time 用于输入含时、分、秒和秒的小数部分,但不含时区的时间值  
datetime-local 用于输入不含时区的日期和时间  
number 用于输入数字 有效值为浮点数
range 用于输入数字 number的区别在于无需输入具体数字。在大部分支持该类型的浏览器中,范围控件的实施形式为滑块
color 用一起通过颜色池控制选择颜色 值必须为有效的小写简单颜色,比如#fffff

input的属性(attributes

这里所说的input属性是指**attributes**,它有一些通用属性:maxlenggthminlengthsizereadonlyrequiredmultiplepatternminmaxsteplistplaceholder。同样的,在HTML5中引入了一些新的属性:

属性 用途 备注
autofocus 用于在网页加载后对焦到相关元素上的输入 autofocus的目标可以是input、也可以是selecttextareabutton
placeholder 用于提示用户应输入的数据类型 在对焦到相关元素以及用户输入数据之前,系统会以浅色文字显示占位符值。可以在样式重新定义其颜色
form 用于指定输入元素所属的一个或多个表单 借助form属性,可以将输入元素放在页面的任何位置处,而不只是放在
元素中。同时,单个输入元素可马多个表单关联
required 用于表示必填元素的布尔值属性 required属性有助于在不使用自定义JavaScript的情况下执行基于浏览器的验证
autocomplete 用于指定浏览器不应该根据用户的历史记录自动填充或预先填充某个字段 autocomplete属性可用于信用卡号或一次性密码等不想自动填充的字段。autocomplete的默认值是on状态(开启状态),如果你想停用该属性,需要手动将其设置为off(关闭状态)
pattern 用于根据正则表达式验证元素的值 在使用pattern时,你也应该指定title值,以便向用户提供预期模式的说明
dirname 用于随表单提交控件的方向 如果用户从右到械的方向输入文本数据,且input元素包含dirname属性,那么系统就会将指明从右到左方向的内容随输入值一起提交
novalidate 在表单元素上指定该属性即可停用表单验证  
formaction 用于覆盖表单元素上的action属性  
formenctype 用于覆盖表单元素上的enctype属性  
formmethod 用于覆盖表单元素上的method属性  
formnovalidate 用于覆盖表单元素上的novalidate属性  
formtarget 用于覆盖表单元素上的target属性  

其中formactionformenctypeformmethodformnovalidateformtarget几个属性仅inputbutton元素支持。

其实,input的属性主要分为四大类:

  • 内容属性(Content Attributes)accept, alt, autocomplete, checked, dirname, formaction, formenctype, formmethod, formnovalidate, formtarget, height, list, max, maxlength, min, minlength, multiple, pattern, placeholder, readonly, required, size, src, stepwidth
  • IDL属性(IDL Attributes)checked, files, valuevalueAsDate, valueAsNumber, list , selectionStartselectionEndselectionDirection
  • 方法(Methods)select()setRanggeText()setSelectionRange()stepDown()stepUP()
  • 事件inputchange

不过上面三大类提到的属性还不是规范中内容,但下面表格中所描述的内容总结了内容属性、IDL属性、方法和事件适用于input元素中的哪种type

有关于这部分更详细的描述可以点击这里进行了解。

input给用户体验带来的变化

或许很多同学在使用表单元素时,不管是什么都只会使用text类型(除了复选框checkbox、单选按钮radiobutton按钮)。这也可能是在PC时代遗留下来的所谓“习惯”吧,而事实上,进入移动端时代之后,如果仅使用text这种type已经无法满足用户所需。所以在HTML5中追加了一些不同的type类型,而之些type类型在移动端上使用表单来输入内容时会带来更好的体验。比如:

正如上图所示,元素设置不同的type属性的值在移动端中获得焦点时会调出不同的键盘。这些不同的键盘会让用户会有一个更好的体验,可以更快速的输入所需内容。除type的不同值能给用户操作表单有更好的体验之外,还有一些**属性(Attributes)**也能让用户在操作表单时有一个更好的体验,比如readonlyrequiredminlengthmaxlengthpatterntitlestepminmaxnovalidate等属性。

上面说的是typeattributes相关值给用户在使用表单(特别是)时有一个较好的体验,这两部分都是HTML中的部分,而在CSS中也有一些伪元素选择器能让表单更具较好的体验,比如:placeholder-shown:required:optional:disabled:read-only:valid:invalid:in-range:out-of-range:checked等伪类选择器。下面这个就是一个很好的示例:

在使用表单时,不知道大家是否有留意过,元素在不同内核的浏览器下具有独特的伪元素,而这些伪元素也可以帮你去优化表单元素的UI风格,让用户具有一个更好的UI。比如,

  • type="checkbox"type="radio"在Trident内核中可以使用::-ms-check
  • type="color"在Webkit内核中可以使用::-webkit-color-swatch-wrapper::-webkit-color-swatch
  • type="date"在Webkit内核中可以使用::-webkit-datetime-edit::-webkit-datetime-edit-fields-wrapper::-webkit-datetime-edit-text::-webkit-datetime-edit-month-field::-webkit-datetime-edit-day-field::-webkit-datetime-edit-year-field::-webkit-inner-spin-button::-webkit-calendar-picker-indicator
  • type="file"在Trident内核中使用::-ms-browse,Webkit内核中使用::-webkit-file-upload-button
  • type="number"在Webkit中可以使用::-webkit-textfield-decoration-container, ::-webkit-inner-spin-button::-webkit-outer-spin-button
  • type="password"在Trident内核中使用::-ms-reveal

有关于不同内核下不同类型的input对应的伪元素可以查阅《伪元素控制表单样式》一文。

在使用表单时,都需要对表单进行验证,而上面提到的相关属性除了能让我们提高用户操作表单的体验之外也可以对表单做一些验证的操作。有关于表单验证的操作,更多的内容可以阅读下面这些文章:

  • Native form validation — part 1
  • Native form validation — part 2
  • Native form validation — part 3
  • 使用 HTML 和 CSS技巧对表单进行约束验证
  • 约束验证 API
  • 一个Validity State API Polyfill
  • MailChimp订阅表单中的验证
  • HTML5的表单验证属性:pattern

另外,有关于HTML5表单用户体验相关的更详细的介绍可以阅读:

  • 使用HTML和CSS提高表单验证用户体验
  • 利用 HTML5 美化表单
  • 美化表单的CSS高级技巧
  • HTML5 Input Types: Where Are They Now?
  • UX And HTML5: Let’s Help Users Fill In Your Mobile Form (Part 1)
  • UX And HTML5: Let’s Help Users Fill In Your Mobile Form (Part 2)

上面仅仅是表单体验中的一小部分而以,如果您对用户体验优化方面的内容感兴趣的话,不仿花点时间阅读uxmovement.com网站中有关于表单方面的内容。

inputinputmode属性

type类型可以让用户在移动端中获得焦点时显示相应的键盘类型。自2019年03月起,