表单是 HTML 中用于收集用户输入的重要元素。
<form action="/submit" method="POST">
<!-- 表单控件 -->
<input type="text" name="username">
<button type="submit">提交</button>
</form>
<form> - 表单容器定义表单及其提交行为。
<form action="/api/submit" method="POST" enctype="application/x-www-form-urlencoded" target="_blank" novalidate>
<!-- 表单内容 -->
</form>
主要属性:
<input> - 输入控件最常用的表单元素,通过 type 属性定义不同类型。
<!-- 文本输入 -->
<input type="text" name="username" placeholder="请输入用户名">
<!-- 密码输入 -->
<input type="password" name="password" placeholder="请输入密码">
<!-- 邮箱输入 -->
<input type="email" name="email" required>
<!-- 数字输入 -->
<input type="number" name="age" min="0" max="120" step="1">
<!-- 日期选择 -->
<input type="date" name="birthday">
<input type="time" name="time">
<input type="week" name="week">
<input type="month" name="month">
<input type="datetime-local" name="datetime-local"><!-- 本地时间 -->
<!-- 文件上传 -->
<input type="file" name="avatar" accept="image/*">
<!-- 隐藏字段 -->
<input type="hidden" name="user_id" value="123">
<!-- 单选按钮 -->
<label>性别:</label>
<input type="radio" id="male" name="gender" value="male" checked>
<label for="male">男</label>
<input type="radio" id="female" name="gender" value="female">
<label for="female">女</label>
<!-- 复选框 -->
<input type="checkbox" id="book" name="book" checked>
<label for="book">书</label>
<input type="checkbox" id="pen" name="pen" checked>
<label for="pen">笔</label>
<!-- URL 输入 -->
<input type="email" id="email" name="email" multiple><!-- multiple 属性允许输入多个邮箱,用逗号分隔 -->
<!-- 电话号码 -->
<input type="tel" id="phone" name="phone" pattern="[0-9]{3}-[0-9]{4}-[0-9]{4}">
<!-- 数字输入 -->
<input type="number" id="quantity" name="quantity" min="1" max="100" step="1" value="1">
<input type="number" id="price" name="price" min="0" max="1000" step="0.01">
<!-- 范围选择 -->
<label for="volume">音量:</label>
<input type="range" id="volume" name="volume" min="0" max="100" step="5" value="50">
<span id="volume-value">50</span>
<script>
document.getElementById('volume').addEventListener('input', function() {
document.getElementById('volume-value').textContent = this.value;
});
</script>
<!-- 颜色选择 -->
<input type="color" id="color-picker" name="color" value="#ff0000">
<!-- 搜索框 -->
<input type="search" id="search" name="search" results="5">
<label> - 标签为表单控件提供标签,提高可访问性。
<!-- 隐式关联 -->
<label>
用户名:
<input type="text" name="username">
</label>
<!-- 显式关联 -->
<label for="email">邮箱地址:</label>
<input type="email" id="email" name="email">
<textarea> - 多行文本用于输入多行文本内容。
<label for="message">留言:</label>
<textarea id="message" name="message" rows="4" cols="50" placeholder="请输入您的留言..."></textarea>
<!-- 可调整大小 -->
<textarea name="content" style="resize: both;"></textarea>
<select> - 下拉选择创建下拉选择列表。
<label for="city">选择城市:</label>
<select id="city" name="city">
<option value="">请选择</option>
<option value="beijing">北京</option>
<option value="shanghai">上海</option>
<option value="guangzhou">广州</option>
</select>
<!-- 多选 -->
<select name="hobbies" multiple size="4">
<option value="reading">阅读</option>
<option value="sports">运动</option>
<option value="music">音乐</option>
</select>
<!-- 分组 -->
<select name="car">
<optgroup label="德系车">
<option value="bmw">宝马</option>
<option value="benz">奔驰</option>
</optgroup>
<optgroup label="日系车">
<option value="toyota">丰田</option>
<option value="honda">本田</option>
</optgroup>
</select>
<button> - 按钮创建可点击的按钮。
<button type="submit">提交表单</button>
<button type="reset">重置表单</button>
<button type="button">普通按钮</button>
<!-- 带图标的按钮 -->
<button type="submit">
<img src="submit-icon.png" alt=""> 提交
</button>
<fieldset> 和 <legend> - 分组将相关控件分组。
<fieldset>
<legend>个人信息</legend>
<label>
姓名:
<input type="text" name="name">
</label>
<label>
年龄:
<input type="number" name="age">
</label>
</fieldset>
<fieldset disabled>
<legend>只读信息</legend>
<!-- 禁用的表单控件 -->
</fieldset>
<datalist> - 数据列表<label for="browser">选择浏览器:</label>
<input type="text" id="browser" name="browser" list="browsers">
<datalist id="browsers">
<option value="Chrome">
<option value="Firefox">
<option value="Safari">
<option value="Edge">
<option value="Opera">
</datalist>
<output> - 输出结果<form oninput="result.value = parseInt(a.value) + parseInt(b.value)">
<input type="number" id="a" name="a" value="10"> +
<input type="number" id="b" name="b" value="20"> =
<output name="result" for="a b">30</output>
</form>
<progress> - 进度条<label for="file">文件上传进度:</label>
<progress id="file" value="70" max="100">70%</progress>
<!-- 不确定进度 -->
<progress id="loading">加载中...</progress>
<meter> - 度量衡<label for="disk-usage">磁盘使用量:</label>
<meter id="disk-usage" value="0.6" min="0" max="1" low="0.2" high="0.8" optimum="0.5">60%</meter>
<!-- 实际应用 -->
<label>存储空间:</label>
<meter value="75" min="0" max="100" low="25" high="85" optimum="50">75%</meter>
<!-- 表单名称 -->
<input type="text" name="username">
<!-- 占位符文本 -->
<input type="text" name="username" placeholder="请输入用户名(3-20个字符)">
<!-- 必填字段 -->
<input type="text" required>
<!-- 自动获取焦点 -->
<input type="text" name="search" autofocus>
<!-- 长度限制 -->
<input type="text" minlength="2" maxlength="50">
<!-- 数值范围 -->
<input type="number" min="0" max="100" step="1">
<!-- 模式匹配 -->
<input type="text" pattern="[A-Za-z]{3,}">
<!-- 禁用验证 -->
<form novalidate>
<input type="email" name="email" required>
<button type="submit">提交(不验证)</button>
</form>
<!-- 自定义验证 -->
<input type="text" oninvalid="this.setCustomValidity('请输入有效值')" oninput="setCustomValidity('')">
<!-- 表单关联 -->
<!-- 使用 form 属性关联表单 -->
<input type="text" name="extra" form="main-form">
<form id="main-form">
<input type="text" name="username">
<button type="submit">提交</button>
</form>
<form action="/register" method="POST" novalidate>
<fieldset>
<legend>用户注册</legend>
<div class="form-group">
<label for="username">用户名:</label>
<input type="text" id="username" name="username" required minlength="3" maxlength="20" placeholder="3-20个字符">
</div>
<div class="form-group">
<label for="email">邮箱地址:</label>
<input type="email" id="email" name="email" required placeholder="example@email.com">
</div>
<div class="form-group">
<label for="password">密码:</label>
<input type="password" id="password" name="password" required minlength="6" placeholder="至少6位字符">
</div>
<div class="form-group">
<label for="gender">性别:</label>
<select id="gender" name="gender">
<option value="">请选择</option>
<option value="male">男</option>
<option value="female">女</option>
<option value="other">其他</option>
</select>
</div>
<div class="form-group">
<label>兴趣爱好:</label>
<div>
<label>
<input type="checkbox" name="hobbies" value="sports"> 运动
</label>
<label>
<input type="checkbox" name="hobbies" value="reading"> 阅读
</label>
<label>
<input type="checkbox" name="hobbies" value="music"> 音乐
</label>
</div>
</div>
<div class="form-group">
<label>订阅通知:</label>
<label>
<input type="radio" name="newsletter" value="yes" checked> 是
</label>
<label>
<input type="radio" name="newsletter" value="no"> 否
</label>
</div>
<div class="form-group">
<label for="bio">个人简介:</label>
<textarea id="bio" name="bio" rows="4" placeholder="介绍一下你自己..."></textarea>
</div>
<div class="form-group">
<label for="avatar">头像上传:</label>
<input type="file" id="avatar" name="avatar" accept="image/png, image/jpeg">
</div>
<div class="form-actions">
<button type="submit">注册</button>
<button type="reset">重置</button>
</div>
</fieldset>
</form>