表单(form)是用户输入信息与网页互动的一种形式。大多数情况下,用户提交的信息会发给服务器,比如网站的搜索栏就是表单。
表单由一种或多种的小部件组成,比如输入框、按钮、单选框或复选框。这些小部件称为控件(controls)。
<form>
<form>标签用来定义一个表单,所有表单内容放到这个容器元素之中。
<form> <!-- 各种表单控件--> </form>
上面代码就是表单的基本形式。
下面是一个比较常见的例子。
<form action="https://example.com/api" method="post"> <label for="POST-name">用户名:</label> <input id="POST-name" type="text" name="user"> <input type="submit" value="提交"> </form>
上面代码就是一个表单,一共包含三个控件:一个<label>标签,一个文本输入框,一个提交按钮。其中,文本输入框的name属性是user,表示将向服务器发送一个键名为user的键值对,键值就是这个控件的value属性,等于用户输入的值。
<label>
name
user
value
用户在文本输入框里面,输入用户名,比如foobar,然后点击提交按钮,浏览器就会向服务器https://example.com/api发送一个 POST 请求,发送user=foobar这样一段数据。
foobar
https://example.com/api
user=foobar
<form>有以下属性。
accept-charset
action
autocomplete
off
on
method
post
get
dialog
<dialog>
enctype
application/x-www-form-urlencoded
multipart/form-data
text/plain
novalidate
target
_self
_blank
_parent
_top
<iframe>
<form>表单的encrypt属性,指定了采用 POST 方法提交数据时,浏览器给出的数据的 MIMI 类型。该属性可以取以下值。
encrypt
(1)application/x-www-form-urlencoded
application/x-www-form-urlencoded是默认类型,控件名和控件值都要转义(空格转为+号,非数字和非字母转为%HH的形式,换行转为CR LF),控件名和控件值之间用=分隔。控件按照出现顺序排列,控件之间用&分隔。
+
%HH
=
&
(2)multipart/form-data
multipart/form-data主要用于文件上传。这个类型上传大文件时,会将文件分成多块传送,每一块的 HTTP 头信息都有Content-Disposition属性,值为form-data,以及一个name属性,值为控件名。
Content-Disposition
form-data
Content-Disposition: form-data; name="mycontrol"
下面是上传文件的表单。
<form action="https://example.com/api" enctype="multipart/form-data" method="post"> 用户名:<input type="text" name="submit-name"><br> 文件:<input type="file" name="files"><br> <input type="submit" value="上传"> <input type="reset" value="清除"> </form>
上面代码中,输入用户名Larry,选中一个file1.txt文件,然后点击“上传”。浏览器发送的实际数据如下。
Larry
file1.txt
Content-Type: multipart/form-data; boundary=--AaB03x --AaB03x Content-Disposition: form-data; name="submit-name" Larry --AaB03x Content-Disposition: form-data; name="files"; filename="file1.txt" Content-Type: text/plain ... contents of file1.txt ... --AaB03x--
上面代码中,浏览器将这个表单发成多个数据块。最上面使用Content-Type字段告诉服务器,数据格式是multipart/form-data(即多个数据块),每个数据块的分隔标志是--AaB03x。每个数据块的第一行是Content-Disposition,其中的name字段表示这个数据块的控件名,数据体则是该控件的数据值,比如第一个数据块的name属性是submit-name控件,数据体是该控件的值Larry。第二个数据块是控件files,由于该控件是上传文件,所以还要用filename属性给出文件名file1.txt,数据体是file1.txt的内容。
Content-Type
--AaB03x
submit-name
files
filename
<fieldset>
<legend>
<fieldset>标签是一个块级容器标签,表示控件的集合,用于将一组相关控件组合成一组。
<form> <fieldset> <p>年龄:<input type="text" name="age"></p> <p>性别:<input type="text" name="gender"></p> </fieldset> </form>
上面代码中,两个输入框是一组,它们的外面会显示一个方框。
<fieldset>有以下属性。
disabled
form
id
<legend>标签用来设置<fieldset>控件组的标题,通常是<fieldset>内部的第一个元素,会嵌入显示在控件组的上边框里面。
<fieldset> <legend>学生情况登记</legend> <p>年龄:<input type="text" name="age"></p> <p>性别:<input type="text" name="gender"></p> </fieldset>
上面代码中,这个控件组的标题会,嵌入显示在<fieldset>的上边框。
<label>标签是一个行内元素,提供控件的文字说明,帮助用户理解控件的目的。
<label for="user">用户名:</label> <input type="text" name="user" id="user">
上面代码中,输入框前面会有文字说明“用户名:”。
<label>的一大优势是增加了控件的可用性。有些控件比较小(比如单选框),不容易点击,那么点击对应的<label>标签,也能选中该控件。点击<label>,就相当于控件本身的click事件。
click
<label>的for属性关联相对应的控件,它的值是对应控件的id属性。所以,控件最好设置id属性。
for
控件也可以放在<label>之中,这时不需要for属性和id属性。
<label>用户名: <input type="text" name="user"> </label>
<label>的属性如下。
一个控件可以有多个关联的<label>标签。
<label for="username">用户名:</label> <input type="text" id="username" name="username"> <label for="username"><abbr title="required">*</abbr></label>
上面代码中,<input>有两个关联的<label>。
<input>
<input>标签是一个行内元素,用来接收用户的输入。它是一个单独使用的标签,没有结束标志。
它有多种类型,取决于type属性的值,默认值是text,表示一个输入框。
type
text
<input> <!-- 等同于 --> <input type="text">
上面代码会生成一个单行的输入框,用户可以在里面输入文本。
<input>的属性非常多,有些属性是某个类型专用的,放在下文的“类型”部分介绍。这里介绍一些所有类型的共同属性。
autofocus
list
<datalist>
readonly
required
type属性决定了<input>的形式。该属性可以取以下值。
(1)text
type="text"是普通的文本输入框,用来输入单行文本。如果用户输入换行符,换行符会自动从输入中删除。
type="text"
<input type="text" id="name" name="name" required minlength="4" maxlength="8" size="10">
text输入框有以下配套属性。
maxlength
minlength
pattern
pattern="[a-z]{4,8}"
placeholder
size
spellcheck
true
false
(2)search
type="search"是一个用于搜索的文本输入框,基本等同于type="text"。某些浏览器会在输入的时候,在输入框的尾部显示一个删除按钮,点击就会删除所有输入,让用户从头开始输入。
type="search"
下面是一个例子。
<form> <input type="search" id="mySearch" name="q" placeholder="输入搜索词……" required> <input type="submit" value="搜索"> </form>
(3)button
type="button"是没有默认行为的按钮,通常脚本指定click事件的监听函数来使用。
type="button"
<input type="button" value="点击">
建议尽量不使用这个类型,而使用<button>标签代替,一则语义更清晰,二则<button>标签内部可以插入图片或其他 HTML 代码。
<button>
(4)submit
type="submit"是表单的提交按钮。用户点击这个按钮,就会把表单提交给服务器。
type="submit"
<input type="submit" value="提交">
如果不指定value属性,浏览器会在提交按钮上显示默认的文字,通常是Submit。
Submit
该类型有以下配套属性,用来覆盖<form>标签的相应设置。
formaction
formenctype
formmethod
formnovalidate
formtarget
(5)image
type="image"表示将一个图像文件作为提交按钮,行为和用法与type="submit"完全一致。
type="image"
<input type="image" alt="登陆" src="login-button.png">
上面代码中,图像文件是一个可以点击的按钮,点击后会提交数据到服务器。
该类型有以下配套属性。
alt
src
height
width
用户点击图像按钮提交时,会额外提交两个参数x和y到服务器,表示鼠标的点击位置,比如x=52&y=55。x是横坐标,y是纵坐标,都以图像左上角作为原点(0, 0)。如果图像按钮设置了name属性,比如name="position",那么将以该值作为坐标的前缀,比如position.x=52&position.y=55。这个功能通常用来地图类型的操作,让服务器知道用户点击了地图的哪个部分。
x
y
x=52&y=55
(0, 0)
name="position"
position.x=52&position.y=55
(6)reset
type="reset"是一个重置按钮,用户点击以后,所有表格控件重置为初始值。
type="reset"
<input type="reset" value="重置">
如果不设置value属性,浏览器会在按钮上面加上默认文字,通常是Reset。
Reset
这个控件用处不大,用户点错了还会使得所有已经输入的值都被重置,建议不要使用。
(7)checkbox
type="checkbox"是复选框,允许选择或取消选择该选项。
type="checkbox"
<input type="checkbox" id="agreement" name="agreement" checked> <label for="agreement">是否同意</label>
上面代码会在文字前面,显示一个可以点击的选择框,点击可以选中,再次点击可以取消。上面代码中,checked属性表示默认选中。
checked
value属性的默认值是on。也就是说,如果没有设置value属性,以上例来说,选中复选框时,会提交agreement=on。如果没有选中,提交时不会有该项。
agreement=on
多个相关的复选框,可以放在<fieldset>里面。
<fieldset> <legend>你的兴趣</legend> <div> <input type="checkbox" id="coding" name="interest" value="coding"> <label for="coding">编码</label> </div> <div> <input type="checkbox" id="music" name="interest" value="music"> <label for="music">音乐</label> </div> </fieldset>
上面代码中,如果用户同时选中两个复选框,提交的时候就会有两个name属性,比如interest=coding&interest=music。
interest=coding&interest=music
(8)radio
type="radio"是单选框,表示一组选择之中,只能选中一项。单选框通常为一个小圆圈,选中时会被填充或突出显示。
type="radio"
<fieldset> <legend>性别</legend> <div> <input type="radio" id="male" name="gender" value="male"> <label for="male">男</label> </div> <div> <input type="radio" id="female" name="gender" value="female"> <label for="female">女</label> </div> </fieldset>
上面代码中,性别只能在两个选项之中,选择一项。
注意,多个单选框的name属性的值,应该都是一致的。提交到服务器的就是选中的那个值。
该类型的配套属性如下。
on'
(9)email
type="email"是一个只能输入电子邮箱的文本输入框。表单提交之前,浏览器会自动验证是否符合电子邮箱的格式,如果不符合就会显示提示,无法提交到服务器。
type="email"
<input type="email" pattern=".+@foobar.com" size="30" required>
上面代码会生成一个必填的文本框,只能输入后缀为foobar.com的邮箱地址。
foobar.com
该类型有一个multiple的布尔属性,一旦设置,就表示该输入框可以输入多个逗号分隔的电子邮箱。
multiple
<input id="emailAddress" type="email" multiple required>
注意,如果同时设置了multiple属性和required属性,零个电子邮箱是允许的,也就是该输入框允许为空。
该类型还可以搭配<datalist>标签,提供输入的备选项。
<input type="email" size="40" list="defaultEmails"> <datalist id="defaultEmails"> <option value="jbond007@mi6.defence.gov.uk"> <option value="jbourne@unknown.net"> <option value="nfury@shield.org"> <option value="tony@starkindustries.com"> <option value="hulk@grrrrrrrr.arg"> </datalist>
上面代码中,输入焦点进入输入框以后,会显示一个下拉列表,里面有五个参考项,供用户参考。
(10)password
type="password"是一个密码输入框。用户的输入会被遮挡,字符通常显示星号(*)或点(·)。
type="password"
*
·
<input type="password" id="pass" name="password" minlength="8" required>
浏览器对该类型输入框的显示,会有所差异。一种常见的处理方法是,用户每输入一个字符,先在输入框里面显示一秒钟,然后再遮挡该字符。
如果用户输入内容包含换行符(U+000A)和回车符(U+000D),浏览器会自动将这两个字符过滤掉。
U+000A
U+000D
current-password
new-password
inputmode
none
decimal
numeric
(11)file
type="file"是一个文件选择框,允许用户选择一个或多个文件,常用于文件上传功能。
type="file"
<input type="file" id="avatar" name="avatar" accept="image/png, image/jpeg">
该类型有以下属性。
accept
image/jpeg
.doc
audio/*
video/*
image/*
capture
environment
(12)hidden
type="hidden"是一个不显示在页面的控件,用户无法输入它的值,主要用来向服务器传递一些隐藏信息。比如,CSRF 攻击会伪造表单数据,那么使用这个控件,可以为每个表单生成一个独一无二的隐藏编号,防止伪造表单提交。
type="hidden"
<input id="prodId" name="prodId" type="hidden" value="xm234jq">
上面这个控件,页面上是看不见的。用户提交表单的时候,浏览器会将prodId=xm234jq发给服务器。
prodId=xm234jq
(13)number
type="number"是一个数字输入框,只能输入数字。浏览器通常会在输入框的最右侧,显示一个可以点击的上下箭头,点击向上箭头,数字会递增,点击向下箭头,数字会递减。
type="number"
<input type="number" id="tentacles" name="tentacles" min="10" max="100">
上面代码指定数字输入框,最小可以输入10,最大可以输入100。
该类型可以接受任何数值,包括小数和整数。可以通过step属性,限定只接受整数。
step
max
min
1
1.5
2.5
0.5
(14)range
type="range"是一个滑块,用户拖动滑块,选择给定范围之中的一个数值。因为拖动产生的值是不精确的,如果需要精确数值,不建议使用这个控件。常见的例子是调节音量。
type="range"
<input type="range" id="start" name="volume" min="0" max="11">
上面代码会产生一个最小值为0、最大值为11的滑块区域。用户拖动滑块,选择想要的音量。
0
11
该类型的配套属性如下,用法与type="number"一致。
value属性的初始值就是滑块的默认位置。如果没有设置value属性,滑块默认就会停在最大值和最小值中间。如果max属性、min属性、value属性都没有设置,那么value属性为50。
该类型与<datalist>标签配合使用,可以在滑动区域产生刻度。
<input type="range" list="tickmarks"> <datalist id="tickmarks"> <option value="0" label="0%"> <option value="10"> <option value="20"> <option value="30"> <option value="40"> <option value="50" label="50%"> <option value="60"> <option value="70"> <option value="80"> <option value="90"> <option value="100" label="100%"> </datalist>
上面代码会在0~100之间产生11个刻度。其中,0%、50%和100%三个位置会有文字提示,不过浏览器很可能不支持。
0%
50%
100%
注意,浏览器生成的都是水平滑块。如果想要生成垂直滑块,可以使用 CSS 改变滑块区域的方向。
(15)url
type="url"是一个只能输入网址的文本框。提交表单之前,浏览器会自动检查网址格式是否正确,如果不正确,就会无法提交。
type="url"
<input type="url" name="url" id="url" placeholder="https://example.com" pattern="https://.*" size="30" required>
上面代码的pattern属性指定输入的网址只能使用 HTTPS 协议。
注意,该类型规定,不带有协议的网址是无效的,比如foo.com是无效的,http://foo.com是有效的。
foo.com
http://foo.com
该类型与<datalist>标签搭配使用,可以形成下拉列表供用户选择。随着用户不断键入,会缩小显示范围,只显示匹配的备选项。
<input id="myURL" name="myURL" type="url" list="defaultURLs"> <datalist id="defaultURLs"> <option value="https://developer.mozilla.org/" label="MDN Web Docs"> <option value="http://www.google.com/" label="Google"> <option value="http://www.microsoft.com/" label="Microsoft"> <option value="https://www.mozilla.org/" label="Mozilla"> <option value="http://w3.org/" label="W3C"> </datalist>
上面代码中,<option>的label属性表示文本标签,显示在备选下拉框的右侧,网址显示在左侧。
<option>
label
(16)tel
type="tel"是一个只能输入电话号码的输入框。由于全世界的电话号码格式都不相同,因此浏览器没有默认的验证模式,大多数时候需要自定义验证。
type="tel"
<input type="tel" id="phone" name="phone" pattern="[0-9]{3}-[0-9]{3}-[0-9]{4}" required> <small>Format: 123-456-7890</small>
上面代码定义了一个只能输入10位电话号码的输入框。
(17)color
type="color"是一个选择颜色的控件,它的值一律都是#rrggbb格式。
type="color"
#rrggbb
<input type="color" id="background" name="background" value="#e66465">
上面代码在 Chrome 浏览器中,会显示一个#e66465的色块。点击色块,就会出现一个拾色器,供用户选择颜色。
#e66465
如果没有指定value属性的初始值,默认值为#000000(黑色)。
#000000
(18)date
type="date"是一个只能输入日期的输入框,用户可以输入年月日,但是不能输入时分秒。输入格式是YYYY-MM-DD。
type="date"
YYYY-MM-DD
<input type="date" id="start" name="start" value="2018-07-22" min="2018-01-01" max="2018-12-31">
上面代码会显示一个输入框,默认日期是2018年7月22日。用户点击以后,会日期选择器,供用户选择新的日期。
yyyy-MM-dd
(19)time
type="time"是一个只能输入时间的输入框,可以输入时分秒,不能输入年月日。日期格式是24小时制的hh:mm,如果包括秒数,格式则是hh:mm:ss。日期选择器的形式则随浏览器不同而不同。
type="time"
hh:mm
hh:mm:ss
<input type="time" id="appt" name="appt" min="9:00" max="18:00" required> <small>营业时间上午9点到下午6点</small>
<input id="appt" type="time" name="appt" step="2">
上面代码中,调节控件的话,时间每次改变的幅度是2秒钟。
(20)month
type="month"是一个只能输入年份和月份的输入框,格式为YYYY-MM。
type="month"
YYYY-MM
<input type="month" id="start" name="start" min="2018-03" value="2018-05">
yyyy-MM
(21)week
type="week"是一个输入一年中第几周的输入框。格式为yyyy-Www,比如2018-W18表示2018年第18周。
type="week"
yyyy-Www
2018-W18
<input type="week" name="week" id="camp-week" min="2018-W18" max="2018-W26" required>
(22)datetime-local
type="datetime-local"是一个时间输入框,让用户输入年月日和时分,格式为yyyy-MM-ddThh:mm。注意,该控件不支持秒。
type="datetime-local"
yyyy-MM-ddThh:mm
<input type="datetime-local" id="meeting-time" name="meeting-time" value="2018-06-12T19:30" min="2018-06-07T00:00" max="2018-06-14T00:00">
<button>标签会生成一个可以点击的按钮,没有默认行为,通常需要用type属性或脚本指定按钮的功能。
<button>点击</button>
上面代码会产生一个按钮,上面的文字就是“点击”。
<button>内部不仅放置文字,还可以放置图像,这可以形成图像按钮。
<button name="search" type="submit"> <img src="search.gif">搜索 </button>
<button>具有以下属性。
name=value
submit
reset
button
<select>
<select>标签用于生成一个下拉菜单。
<label for="pet-select">宠物:</label> <select id="pet-select" name="pet-select"> <option value="">--请选择一项--</option> <option value="dog">狗</option> <option value="cat">猫</option> <option value="others">其他</option> </select>
上面代码中,<select>生成一个下拉菜单,菜单标题是“--请选择一项--”,最右侧有一个下拉箭头。点击下拉箭头,会显示三个菜单项,供用户点击选择。
下拉菜单的菜单项由<option>标签给出,每个<option>代表可以选择的一个值。选中的<option>的value属性,就是<select>控件发送的服务器的值。
<option>有一个布尔属性selected,一旦设置,就表示该项是默认选中的菜单项。
selected
<select name="choice"> <option value="first">First Value</option> <option value="second" selected>Second Value</option> <option value="third">Third Value</option> </select>
上面代码中,第二项Second Value是默认选中的。页面加载的时候,会直接显示在下拉菜单上。
Second Value
<select>有如下属性。
Shift
<optgroup>
<option>标签用在<select>、<optgroup>、<datalist>里面,表示一个菜单项,参见<select>的示例。
它有如下属性。
<optgroup>表示菜单项的分组,通常用在<select>内部。
<label>宠物: <select name="pets" multiple size="4"> <optgroup label="四条腿的宠物"> <option value="dog">狗</option> <option value="cat">猫</option> </optgroup> <optgroup label="鸟类"> <option value="parrot">鹦鹉</option> <option value="thrush">画眉</option> </optgroup> </select> </label>
上面代码中,<select>是一个下拉菜单,它的内部使用<optgroup>将菜单项分成两组。每组有自己的标题,会加粗显示,但是用户无法选中。
它的属性如下。
<datalist>标签是一个容器标签,用于为指定控件提供一组相关数据,通常用于生成输入提示。它的内部使用<option>,生成每个菜单项。
<label for="ice-cream-choice">冰淇淋:</label> <input type="text" list="ice-cream-flavors" id="ice-cream-choice" name="ice-cream-choice"> <datalist id="ice-cream-flavors"> <option value="巧克力"> <option value="椰子"> <option value="薄荷"> <option value="草莓"> <option value="香草"> </datalist>
上面代码中,<input>生成一个文本输入框,用户可以输入文本。<input>的list属性指定关联的<datalist>的id属性。<datalist>的数据列表用于输入建议,用户点击输入框的时候,会显示一个下拉菜单,里面是建议的输入项。并且还会自动匹配用户已经输入的字符,缩小可选的范围,比如用户输入“香”,则只会显示“香草”这一项。
注意,<option>在这里可以不需要闭合标签。
<option>标签还可以加入label属性,作为说明文字。Chrome 浏览器会将其显示在value的下一行。
<datalist id="ide"> <option value="Brackets" label="by Adobe"> <option value="Coda" label="by Panic"> </datalist>
上面代码的渲染结果是,Chrome 浏览器会在下拉列表显示value值(比如Brackets),然后在其下方以小字显示label值(比如by Adobe)。
Brackets
by Adobe
<textarea>
<textarea>是一个块级元素,用来生成多行的文本框。
<textarea id="story" name="story" rows="5" cols="33"> 这是一个很长的故事。 </textarea>
上面代码会生成一个长度为5行,宽度为33个字符的文本框。
该标签有如下属性。
cols
rows
default
wrap
hard
CR + LF
soft
CR + LR
<output>
<output>标签是一个行内元素,用于显示用户操作的结果。
<input type="number" name="a" value="10"> + <input type="number" name="b" value="10"> = <output name="result">20</output>
<progress>
<progress>标签是一个行内元素,表示任务的完成进度。浏览器通常会将显示为进度条。
<progress id="file" max="100" value="70"> 70% </progress>
<meter>
<meter>标签是一个行内元素,表示指示器,用来显示已知范围内的一个值,很适合用于任务的当前进度、磁盘已用空间、充电量等带有比例性质的场合。浏览器通常会将其显示为一个不会滚动的指示条。
<p>烤箱的当前温度是<meter min="200" max="500" value="350"> 350 度</meter>。</p>
上面代码会显示一个指示条,左侧表示200,右侧表示500,当前位置停留在350。
200
500
350
注意,<meter>元素的子元素,正常情况下不会显示。只有在浏览器不支持<meter>时才会显示。
low
high
optimum
Chrome 浏览器使用三种颜色,表示指示条所处的位置。较好情况时,当前位置为绿色;一般情况时,当前位置为黄色;较差情况时,当前位置为红色。
<meter id="fuel" name="fuel" min="0" max="100" low="33" high="66" optimum="80" value="50"> at 50/100 </meter>
上面代码中,指示条可以分成三段:0 ~ 32,33 ~ 65,66 ~ 100。由于optimum属性是80,因此66 ~ 100是较好情况,33 ~ 65是一般情况,0 ~ 32是较差情况。浏览器因此会根据value属性,将当前位置显示为不同颜色,小于33时显示红色,大于65时显示绿色,两者之间显示黄色。
80
66 ~ 100
33 ~ 65
0 ~ 32
33
65
Copyright© 2013-2020
All Rights Reserved 京ICP备2023019179号-8