表单元素是一系列元素,主要用户收集用户数据。

<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

密码框,会把你输入的文字替换为某个符号。

passwordvalue一起用可以实现自动填充密码。
插曲小tip:在VScode中输入input:password按Tab键可以快速扩展。

date

日期选择框。

日期选择框的样式是改不了的,它是调用的浏览器或操作系统的日期选择框。
另外日期选择框有兼容性问题,一些旧浏览器不支持。

search:搜索框。
这个框长得和文本输入框一样。
这个功能在手机上有用到,有时点击搜索框后,键盘键盘的右下角不再是换行,而是变为了“搜索”,如QQ:

它也有兼容性问题,可能有的手机不支持。

range

滑块。

滑块选中的值要靠js来读取。
使用range属性时可以结合一些其他的属性,如minmax,分别表示最小值和最大值:

<input type="range" min="0" max="5">

color

颜色选择框。

这个也经常配合js来使用。

number

数字输入框,只能输入数字。

也可以结合minmax属性使用。
另外还有个属性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属性表示按钮的类型,可以取值resetsubmit(默认值)、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表示提交方式,通常有两个取值:getpost
<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">