第12篇:表单基础控件
第12篇:表单基础控件
表单是网页与用户交互的桥梁——注册、登录、搜索、留言,都离不开表单。本篇从基础的
input控件开始,逐步掌握表单的核心构建块。
学习目标
- 掌握
form标签及常用属性(action、method) - 理解
input各种type的用法和差异 - 学会正确使用
label关联表单控件 - 掌握单选框和复选框的用法
- 了解
placeholder的正确使用方式
核心知识点
一、表单容器:form
所有表单控件都应该包裹在form标签中。
<formaction="/submit"method="POST"><!-- 表单控件放在这里 --><inputtype="text"name="username"><buttontype="submit">提交</button></form>form核心属性
| 属性 | 作用 | 示例 |
|---|---|---|
action | 数据提交的 URL 地址 | action="/register" |
method | 提交方式 | method="GET"/method="POST" |
enctype | 编码方式(上传文件时必需) | enctype="multipart/form-data" |
target | 提交后的页面打开方式 | target="_blank" |
GET vs POST
| GET | POST | |
|---|---|---|
| 数据位置 | URL 参数中(可见) | 请求体中(不可见) |
| 数据长度 | 有限制(约 2KB) | 无限制 |
| 安全性 | 低(数据暴露在 URL) | 较高 |
| 用途 | 搜索、筛选 | 注册、登录、提交数据 |
<!-- GET:搜索表单(数据在 URL 中可见)--><formaction="/search"method="GET"><inputtype="search"name="q"placeholder="搜索关键词"><buttontype="submit">搜索</button></form><!-- POST:注册表单(数据在请求体中)--><formaction="/register"method="POST"><inputtype="email"name="email"><inputtype="password"name="password"><buttontype="submit">注册</button></form>二、input类型大全
input是表单中最灵活的控件,通过type属性变换形态。
文本类输入
<!-- 单行文本(默认)--><inputtype="text"name="username"placeholder="请输入用户名"><!-- 密码(输入内容显示为圆点)--><inputtype="password"name="pwd"placeholder="请输入密码"><!-- 邮箱(移动端会显示 @ 符号快捷输入)--><inputtype="email"name="email"placeholder="example@email.com"><!-- 搜索(部分浏览器会显示搜索图标和清除按钮)--><inputtype="search"name="query"placeholder="搜索..."><!-- URL(移动端会显示 .com / .cn 快捷输入)--><inputtype="url"name="website"placeholder="https://example.com"><!-- 电话(移动端会显示数字键盘)--><inputtype="tel"name="phone"placeholder="138-0000-0000">数字类输入
<!-- 数字输入(带增减按钮)--><inputtype="number"name="age"min="1"max="120"value="18"><!-- 范围滑块 --><inputtype="range"name="volume"min="0"max="100"value="50">日期时间类输入
<!-- 日期选择器 --><inputtype="date"name="birthday"><!-- 时间选择器 --><inputtype="time"name="meeting-time"><!-- 日期+时间 --><inputtype="datetime-local"name="appointment"><!-- 月份选择器 --><inputtype="month"name="expiry-month"><!-- 星期选择器 --><inputtype="week"name="holiday-week">💡兼容性提示:日期时间类输入在桌面端 Safari 和部分旧浏览器中支持不佳。实际项目中通常会使用日期选择组件库。
选择类输入
<!-- 单选框(radio):一组中只能选一个 --><inputtype="radio"name="gender"value="male"id="male"><labelfor="male">男</label><inputtype="radio"name="gender"value="female"id="female"><labelfor="female">女</label><!-- 复选框(checkbox):可以同时选多个 --><inputtype="checkbox"name="hobby"value="reading"id="hobby-read"><labelfor="hobby-read">阅读</label><inputtype="checkbox"name="hobby"value="music"id="hobby-music"><labelfor="hobby-music">音乐</label><inputtype="checkbox"name="hobby"value="sports"id="hobby-sports"><labelfor="hobby-sports">运动</label>其他输入类型
<!-- 颜色选择器 --><inputtype="color"name="theme-color"value="#1976d2"><!-- 文件上传 --><inputtype="file"name="avatar"accept="image/*"><!-- 隐藏字段(用户不可见,提交时随表单发送)--><inputtype="hidden"name="user-id"value="12345">三、label标签:正确关联控件
label为表单控件提供说明文字,点击label可以聚焦/选中对应的控件。
两种关联方式
方式一:用for属性关联id(推荐)
<labelfor="username">用户名:</label><inputtype="text"id="username"name="username">方式二:直接包裹控件
<label>用户名:<inputtype="text"name="username"></label>为什么 label 很重要
| 场景 | 没有 label | 有 label |
|---|---|---|
| 点击文字 | 无反应 | 聚焦到输入框 |
| 点击单选框文字 | 无反应 | 选中单选框 |
| 屏幕阅读器 | 不知道这个输入框是干嘛的 | 朗读 label 内容 |
| 触控设备 | 点击区域只有小圆点 | 点击区域包含文字 |
<!-- ❌ 错误:没有 label,可访问性差 --><p>用户名</p><inputtype="text"name="username"><!-- ✅ 正确:label 与 input 关联 --><labelfor="username">用户名</label><inputtype="text"id="username"name="username">四、单选框与复选框详解
单选框radio:一组只能选一个
<fieldset><legend>性别</legend><inputtype="radio"name="gender"value="male"id="gender-male"><labelfor="gender-male">男</label><inputtype="radio"name="gender"value="female"id="gender-female"><labelfor="gender-female">女</label><inputtype="radio"name="gender"value="other"id="gender-other"><labelfor="gender-other">其他</label></fieldset>🔑关键点:同一组的
radio必须有相同的name,这样浏览器才知道它们是互斥的。
复选框checkbox:可以同时选多个
<fieldset><legend>兴趣爱好(可多选)</legend><inputtype="checkbox"name="hobby"value="reading"id="hobby-1"><labelfor="hobby-1">阅读</label><inputtype="checkbox"name="hobby"value="music"id="hobby-2"><labelfor="hobby-2">音乐</label><inputtype="checkbox"name="hobby"value="sports"id="hobby-3"checked><labelfor="hobby-3">运动(默认选中)</label></fieldset>| 属性 | 作用 |
|---|---|
checked | 默认选中 |
disabled | 禁用(灰色,不可交互) |
value | 提交时的值 |
五、placeholder的正确用法
placeholder提供输入提示,当用户开始输入时消失。
<!-- ✅ 好的 placeholder:提供输入示例或格式提示 --><inputtype="email"placeholder="yourname@example.com"><inputtype="tel"placeholder="138-0000-0000"><!-- ❌ 差的 placeholder:重复 label 的内容 --><labelfor="email">邮箱</label><inputtype="email"id="email"placeholder="请输入邮箱"><!-- "请输入邮箱"没有提供额外信息 -->placeholder 不是 label 的替代品
<!-- ❌ 错误:用 placeholder 代替 label --><inputtype="text"placeholder="用户名"><!-- placeholder 在输入后消失,用户会忘记这个字段是什么 --><!-- ✅ 正确:label + placeholder 配合使用 --><labelfor="username">用户名</label><inputtype="text"id="username"placeholder="请输入 4-20 位字母或数字">六、表单控件通用属性
以下属性适用于大多数表单控件:
| 属性 | 作用 | 示例 |
|---|---|---|
name | 提交时的字段名 | name="email" |
value | 默认值/提交值 | value="张三" |
placeholder | 输入提示 | placeholder="提示文字" |
required | 必填 | required |
disabled | 禁用 | disabled |
readonly | 只读 | readonly |
autofocus | 页面加载后自动聚焦 | autofocus |
autocomplete | 自动完成 | autocomplete="email" |
<inputtype="text"name="username"placeholder="请输入用户名"requiredautofocusautocomplete="username">动手练习
练习 1:表单控件辨析
为以下场景选择合适的input type:
| 场景 | 你的选择 |
|---|---|
| 用户年龄 | |
| 用户头像上传 | |
| 网站主题色选择 | |
| 搜索框 | |
| 出生日期 | |
| 音量调节 | |
| 协议同意(是/否) | |
| 性别选择(男/女) |
练习 2:注册表单
创建一个用户注册表单,要求包含:
- 用户名(
text,必填) - 邮箱(
email,必填) - 密码(
password,必填) - 确认密码(
password) - 性别(
radio,单选) - 兴趣爱好(
checkbox,多选,至少 3 项) - 出生日期(
date) - 所有控件都有正确的
label关联
练习 3:搜索表单优化
创建一个搜索表单,要求:
- 使用
type="search"而非type="text" - 添加
placeholder提示搜索语法 - 表单使用
GET方法 - 添加一个隐藏字段
source=web - 提交按钮使用
type="submit"
常见误区 ⚠️
| 误区 | 真相 |
|---|---|
“placeholder可以代替label” | ❌ 不能!placeholder 输入后就消失,而 label 始终可见 |
“radio不需要相同的name” | ❌ 必须相同!否则浏览器不知道它们是同一组 |
“type="email"会验证邮箱格式” | ✅ 是的,但验证很宽松。生产环境还需要服务器端验证 |
“disabled和readonly一样” | ❌ 不同!disabled 的值不会提交,readonly 的值会提交 |
“所有表单都需要form标签” | ✅ 强烈建议。没有 form 的控件无法提交数据 |
“name属性不重要” | ❌ 很重要!没有 name,表单提交时不会包含这个字段 |
“checkbox的value可以不写” | 可以,但提交时只会收到 “on”,无法区分选了哪个 |
“autocomplete="off"总是有效” | 现代浏览器会忽略某些字段的 autocomplete=“off”(如密码) |
速查卡片 📋
input类型速查表
| type | 用途 | 移动端键盘 |
|---|---|---|
text | 普通文本 | 默认 |
password | 密码(隐藏) | 默认 |
email | 邮箱 | 带 @ 和 . |
tel | 电话 | 数字键盘 |
url | URL | 带 .com |
search | 搜索 | 带搜索按钮 |
number | 数字 | 数字键盘 |
range | 滑块 | - |
date | 日期 | 日期选择器 |
time | 时间 | 时间选择器 |
color | 颜色 | - |
file | 文件上传 | - |
radio | 单选 | - |
checkbox | 多选 | - |
hidden | 隐藏字段 | - |
单选框 vs 复选框
| radio | checkbox | |
|---|---|---|
| 选择数量 | 一组只能选 1 个 | 可以同时选多个 |
| name 规则 | 同组必须相同 | 同组通常相同 |
| 默认选中 | checked | checked |
| 形状 | 圆形 | 方形 |
label 关联模板
<!-- 推荐:for + id --><labelfor="input-id">标签文字</label><inputid="input-id"name="field-name"><!-- 备选:直接包裹 --><label>标签文字<inputname="field-name"></label>表单提交数据格式
GET 请求: /search?q=HTML&category=tutorial POST 请求: 请求体:q=HTML&category=tutorial表单编写 checklist
- 所有表单控件包裹在
form中 - 每个控件都有对应的
label radio同组使用相同的namecheckbox设置了有意义的value- 使用了合适的
input type - 必填字段标记了
required placeholder提供格式示例,不重复 label 内容
扩展阅读
- MDN: 元素
- MDN: 类型
- MDN:
- MDN: 表单基础
- MDN: radio 和 checkbox
📌下一步:掌握了基础控件后,进入第13篇:表单进阶控件,学习下拉菜单、多行文本和表单分组。
