表单元素是一系列元素,主要用户收集用户数据。
<input>元素
input表示输入框,输入的不一定是文本。
<input>的几个常见属性
type
表示输入框的类型。有很多取值,详见这里。
比如text
表示普通文本输入框。不同浏览器显示出的样式可能不太一样。
value
表示输入框的值,对于text
就是初始时输入框存在的内容。
<input type="text" value="请输入内容">
placeholder
通常输入框是这样的情况:没有文字时有一些提示,有文字后就显示文字。
这个效果以前要用js实现,现在可以用html属性实现。
<input type="text" placeholder="请输入内容">
像新浪的搜索框,它的效果是:用鼠标点击输入框,提示文字就消失。
它这个其实是用js做的。这种方式有一个小bug:
当我们输入“请输入关键字”,然后鼠标点出输入框再点回来,刚才输入的“请输入关键字”就没了。
虽然这个小bug无关痛痒,但有bug存在就让人不舒服,所以还是建议使用placeholder
属性。
<type>的常见取值
type
属性有很多取值,详见这里,下面演示几个常见的:
text
默认值。单行的文本区域,输入中的换行会被自动去除。
上面已经演示过了。
password
密码框,会把你输入的文字替换为某个符号。password
和value
一起用可以实现自动填充密码。
插曲小tip:在VScode中输入input:password
按Tab键可以快速扩展。
date
日期选择框。
日期选择框的样式是改不了的,它是调用的浏览器或操作系统的日期选择框。
另外日期选择框有兼容性问题,一些旧浏览器不支持。
search
:搜索框。
这个框长得和文本输入框一样。
这个功能在手机上有用到,有时点击搜索框后,键盘键盘的右下角不再是换行,而是变为了“搜索”,如QQ:
它也有兼容性问题,可能有的手机不支持。
range
滑块。
滑块选中的值要靠js来读取。
使用range
属性时可以结合一些其他的属性,如min
、max
,分别表示最小值和最大值:
<input type="range" min="0" max="5">
color
颜色选择框。
这个也经常配合js来使用。
number
数字输入框,只能输入数字。
也可以结合min
和max
属性使用。
另外还有个属性step
,表示数字调整时的步长。
checkbox
多选框。
<body>
爱好:
<input type="checkbox"> 电影
<input type="checkbox"> 围棋
<input type="checkbox"> 登山
<input type="checkbox"> 绘画
<input type="checkbox"> 陶笛
</body>
页面上可能有好几组多选框,所以需要加上name
属性,在逻辑上把它们分开:
<body>
爱好:
<input name="loves" type="checkbox"> 电影
<input name="loves" type="checkbox"> 围棋
<input name="loves" type="checkbox"> 登山
<input name="loves" type="checkbox"> 绘画
<input name="loves" type="checkbox"> 陶笛
</body>
另外可以加上布尔属性checked
,表示默认选中。
radio
单选框。
性别:
<input type="radio" name="gender">
男
<input type="radio" name="gender">
女
使用时一定要和name
属性一起用,以区分不同组的单选框。
如果不加name
的话,就默认是不同组的,就不是“单选”了:
性别:
<input type="radio">
男
<input type="radio">
女
也可以加上布尔属性checked
,表示默认选中。
file
选择文件。
目前是没什么用,等学了js就有用了。
按钮
input元素还可以用来制作按钮,不过这种做法有点过时了。如果是想兼容很古老的浏览器,可以使用input元素制作按钮。
当<input>的取值为以下几个时,都是按钮:reset
:重置按钮。submit
:提交按钮。button
:普通按钮。
按钮上显示的文字可以通过value
属性修改。
<input type="reset" value="这是一个重置按钮">
<input type="submit" value="这是一个提交按钮">
<input type="button" value="这是一个普通按钮">
按钮需要配合其他技术使用。
<select>元素
下拉列表选择框,通常和<option>元素配合使用。
简单使用
<p>
请选择城市:
<select>
<option>北京</option>
<option>上海</option>
<option>广州</option>
<option selected>深圳</option>
</select>
</p>
布尔属性selected
表示下拉列表中默认选中的选项。
下拉列表的分组
用<optgroup>
表示分组。
<p>
请选择你的所在地:
<select>
<optgroup label="亚洲">
<option>中国</option>
<option>亚美尼亚</option>
<option>东帝汶</option>
</optgroup>
<optgroup label="欧洲">
<option>立陶宛</option>
<option>列支敦士登</option>
<option>圣马力诺</option>
</optgroup>
<optgroup label="北美洲">
<option>特立尼达和多巴哥</option>
<option>美属维尔京群岛</option>
<option>安提瓜和巴布达</option>
</optgroup>
</select>
</p>
在<select>
中加上multiple
属性可以变为多选:
<select multiple>
……
</select>
按住Ctrl多选:
<textarea>元素
文本域,也叫多行文本框。
<p>
请填写简介:
<textarea cols="30" rows="10">默认存在的文字</textarea>
</p>
cols
表示组多有多少列(一行最多有多少个字母),rows
表示最多有多少行。不过建议使用CSS来控制<textarea>
的大小。<textarea>
和</textarea>
之间的文字是默认存在的文字,而不是value
属性的取值。
<button>元素
<button>这个元素是HTML4.01版本出来的,已经有10多年的历史了。所以兼容性上问题不大。type
属性表示按钮的类型,可以取值reset
、submit
(默认值)、button
,和<input>
的一样。
<button>里可以放很多元素,甚至放个<video>
都行,所以可以实现丰富的效果。<input>
也能加图片,不过不够灵活,加了图片就加不了别的了。而<button>
随便加多少都行。
<input type="image" src="./img/button.webp" style="width:50px;">
<button type="button">
<img src="./img/button.webp" style="width:50px;">
<span>点击进入</span>
</button>
一些常用来配合表单元素的元素
<label>
这是一个普通元素,经常配合多选单选框使用。
例:
性别:
<input name="gender" type="radio">男
<input name="gender" type="radio">女
这样的情况,点击文字是无法选中单选框的:
而我们熟悉的情况是点击文字也能选中单选框,可以使用<label>
元素实现这个效果:
性别:
<input id="radio-Male" name="gender" type="radio">
<label for="radio-Male">男</label>
<input id="radio-Female" name="gender" type="radio">
<label for="radio-Female">女</label>
这时点文字也可以选中了。
通过<label>
的for
属性关联对应id
的表单元素,这种关联叫做显式关联。
相应地也有隐式关联,意思是<label>
里套着表单元素:
性别:
<label>
<input name="gender" type="radio">男
</label>
<label>
<input name="gender" type="radio">女
</label>
<datalist>
数据列表。该元素本身不会显示到页面,通常和普通文本框配合使用。
例:
<p>
请输入你常用的浏览器:
<input list="brwoser" type="text">
</p>
<datalist id="brwoser">
<option value="Edge">Edge浏览器</option>
<option value="Chrome">谷歌浏览器</option>
<option value="Firefox">火狐浏览器</option>
<option value="Opera">欧鹏浏览器</option>
</datalist>
在<input>
中通过list
属性关联到<datalist>
的id
。
看着像百度的搜索建议,但实际上不是用这个做的。因为这种是静态的,满足不了用户需求。百度是动态的,实时更新的。而且这种写法兼容性不太好。
<form>
通常将整个表单元素放置到<form>
的内部,也就是说它是用来包含其他表单元素的。
作用是当提交表单时,将form元素的表达内容以合适的方式提交到服务器。
form元素对开发静态页面没什么意义,在动态页面上很重要。
例:
<form action="https://www.baidu.com/" method="get">
<p>
账号:
<input type="text" name="login-id">
</p>
<p>
密码:
<input type="password" name="login-passwd">
</p>
<button type="submit">提交</button>
</form>
action
表示提交给谁,填链接地址,这里我们填百度。(当然百度是不会理我们的数据的)method
表示提交方式,通常有两个取值:get
和post
。<form>
内的表单元素必须写上name
属性,
点击提交后:
跳转到了百度,并且地址栏为:
https://www.baidu.com/?login-id=123456&login-passwd=654321
如果action
的链接地址设置了相应的数据处理,就可以做出一些响应。
<fieldset>
field表示字段,set表示集合,可以认为是将表单分组。
<form action="">
<h1>修改用户信息</h1>
<fieldset>
<p>
账号
<input type="text">
</p>
<p>
密码
<input type="password">
</p>
</fieldset>
<fieldset>
<p>
姓名
<input type="text">
</p>
<p>
城市:
<select name="" id="">
<option value="">Lorem.</option>
<option value="">Omnis?</option>
<option value="">Provident?</option>
<option value="">Sapiente!</option>
</select>
</p>
</fieldset>
<p>
<button>提交修改</button>
</p>
</form>
可以看到表单被框框隔开了,在逻辑上分了组。
当然这样的形式通过CSS也能实现,不过语义上<fieldset>更胜一筹。
表单状态
有两种布尔属性:
readonly
:表示是否只读。一般的网络账号就是只读的,不能随便修改。
disabled
:是否禁用。会改变表单显示样式。
账号
<input type="text" value="123456" readonly disabled>
<br>
密码
<input type="text">