Bootstrap 表单
概述
Bootstrap 提供了丰富的表单控件和样式,帮助你创建美观、一致且易于使用的表单。表单是用户与网站交互的重要方式。
基本表单
表单控件
Bootstrap 为所有原生表单控件提供了样式:
html
<form>
<div class="mb-3">
<label for="exampleInputEmail1" class="form-label">邮箱地址</label>
<input type="email" class="form-control" id="exampleInputEmail1" aria-describedby="emailHelp">
<div id="emailHelp" class="form-text">我们不会与任何人分享你的邮箱。</div>
</div>
<div class="mb-3">
<label for="exampleInputPassword1" class="form-label">密码</label>
<input type="password" class="form-control" id="exampleInputPassword1">
</div>
<div class="mb-3 form-check">
<input type="checkbox" class="form-check-input" id="exampleCheck1">
<label class="form-check-label" for="exampleCheck1">
记住我
</label>
</div>
<button type="submit" class="btn btn-primary">提交</button>
</form>表单控件
输入框
html
<div class="mb-3">
<label for="basicInput" class="form-label">基本输入框</label>
<input type="text" class="form-control" id="basicInput" placeholder="请输入文本">
</div>
<div class="mb-3">
<label for="emailInput" class="form-label">邮箱输入框</label>
<input type="email" class="form-control" id="emailInput" placeholder="name@example.com">
</div>
<div class="mb-3">
<label for="passwordInput" class="form-label">密码输入框</label>
<input type="password" class="form-control" id="passwordInput">
</div>文本域
html
<div class="mb-3">
<label for="exampleFormControlTextarea1" class="form-label">文本域</label>
<textarea class="form-control" id="exampleFormControlTextarea1" rows="3" placeholder="请输入多行文本"></textarea>
</div>选择框
html
<div class="mb-3">
<label for="exampleFormControlSelect1" class="form-label">单选下拉框</label>
<select class="form-select" id="exampleFormControlSelect1">
<option selected>选择一个选项</option>
<option value="1">选项 1</option>
<option value="2">选项 2</option>
<option value="3">选项 3</option>
</select>
</div>
<div class="mb-3">
<label for="exampleFormControlSelect2" class="form-label">多选下拉框</label>
<select class="form-select" id="exampleFormControlSelect2" multiple>
<option>选项 1</option>
<option>选项 2</option>
<option>选项 3</option>
<option>选项 4</option>
<option>选项 5</option>
</select>
</div>表单控件大小
大小变体
html
<!-- 大输入框 -->
<input class="form-control form-control-lg" type="text" placeholder="大输入框">
<!-- 默认输入框 -->
<input class="form-control" type="text" placeholder="默认输入框">
<!-- 小输入框 -->
<input class="form-control form-control-sm" type="text" placeholder="小输入框">选择框大小
html
<select class="form-select form-select-lg mb-3">
<option>大选择框</option>
</select>
<select class="form-select mb-3">
<option>默认选择框</option>
</select>
<select class="form-select form-select-sm">
<option>小选择框</option>
</select>表单布局
垂直表单(默认)
html
<form>
<div class="mb-3">
<label for="verticalEmail" class="form-label">邮箱</label>
<input type="email" class="form-control" id="verticalEmail">
</div>
<div class="mb-3">
<label for="verticalPassword" class="form-label">密码</label>
<input type="password" class="form-control" id="verticalPassword">
</div>
<button type="submit" class="btn btn-primary">登录</button>
</form>水平表单
html
<form>
<div class="row mb-3">
<label for="horizontalEmail" class="col-sm-2 col-form-label">邮箱</label>
<div class="col-sm-10">
<input type="email" class="form-control" id="horizontalEmail">
</div>
</div>
<div class="row mb-3">
<label for="horizontalPassword" class="col-sm-2 col-form-label">密码</label>
<div class="col-sm-10">
<input type="password" class="form-control" id="horizontalPassword">
</div>
</div>
<div class="row mb-3">
<div class="col-sm-10 offset-sm-2">
<div class="form-check">
<input class="form-check-input" type="checkbox" id="gridCheck1">
<label class="form-check-label" for="gridCheck1">
记住我
</label>
</div>
</div>
</div>
<button type="submit" class="btn btn-primary">登录</button>
</form>内联表单
html
<form class="row g-3">
<div class="col-auto">
<label for="staticEmail2" class="visually-hidden">邮箱</label>
<input type="text" readonly class="form-control-plaintext" id="staticEmail2" value="email@example.com">
</div>
<div class="col-auto">
<label for="inputPassword2" class="visually-hidden">密码</label>
<input type="password" class="form-control" id="inputPassword2" placeholder="密码">
</div>
<div class="col-auto">
<button type="submit" class="btn btn-primary mb-3">确认身份</button>
</div>
</form>表单验证
客户端验证
html
<form class="needs-validation" novalidate>
<div class="mb-3">
<label for="validationCustom01" class="form-label">姓名</label>
<input type="text" class="form-control" id="validationCustom01" required>
<div class="valid-feedback">
看起来不错!
</div>
<div class="invalid-feedback">
请提供有效的姓名。
</div>
</div>
<div class="mb-3">
<label for="validationCustom02" class="form-label">邮箱</label>
<input type="email" class="form-control" id="validationCustom02" required>
<div class="valid-feedback">
看起来不错!
</div>
<div class="invalid-feedback">
请提供有效的邮箱地址。
</div>
</div>
<div class="mb-3">
<div class="form-check">
<input class="form-check-input" type="checkbox" value="" id="invalidCheck" required>
<label class="form-check-label" for="invalidCheck">
同意条款和条件
</label>
<div class="invalid-feedback">
你必须同意才能提交。
</div>
</div>
</div>
<button class="btn btn-primary" type="submit">提交表单</button>
</form>服务器端验证样式
html
<form>
<div class="mb-3">
<label for="validationServer01" class="form-label">姓名</label>
<input type="text" class="form-control is-valid" id="validationServer01" value="张三" required>
<div class="valid-feedback">
看起来不错!
</div>
</div>
<div class="mb-3">
<label for="validationServer02" class="form-label">邮箱</label>
<input type="email" class="form-control is-invalid" id="validationServer02" value="test@" required>
<div class="invalid-feedback">
请提供有效的邮箱地址。
</div>
</div>
<button class="btn btn-primary" type="submit">提交表单</button>
</form>实际示例
html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Bootstrap 表单示例</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="container my-5">
<h1>Bootstrap 表单示例</h1>
<!-- 用户注册表单 -->
<div class="row">
<div class="col-md-8 mx-auto">
<div class="card">
<div class="card-header">
<h3 class="card-title mb-0">用户注册</h3>
</div>
<div class="card-body">
<form class="needs-validation" novalidate>
<div class="row">
<div class="col-md-6 mb-3">
<label for="firstName" class="form-label">姓</label>
<input type="text" class="form-control" id="firstName" required>
<div class="invalid-feedback">
请输入姓氏。
</div>
</div>
<div class="col-md-6 mb-3">
<label for="lastName" class="form-label">名</label>
<input type="text" class="form-control" id="lastName" required>
<div class="invalid-feedback">
请输入名字。
</div>
</div>
</div>
<div class="mb-3">
<label for="email" class="form-label">邮箱地址</label>
<input type="email" class="form-control" id="email" required>
<div class="invalid-feedback">
请输入有效的邮箱地址。
</div>
</div>
<div class="mb-3">
<label for="password" class="form-label">密码</label>
<input type="password" class="form-control" id="password" required>
<div class="form-text">密码至少包含 8 个字符。</div>
<div class="invalid-feedback">
请输入密码。
</div>
</div>
<div class="mb-3">
<label for="confirmPassword" class="form-label">确认密码</label>
<input type="password" class="form-control" id="confirmPassword" required>
<div class="invalid-feedback">
请确认密码。
</div>
</div>
<div class="mb-3">
<label for="phone" class="form-label">手机号码</label>
<input type="tel" class="form-control" id="phone">
</div>
<div class="mb-3">
<label for="birthDate" class="form-label">出生日期</label>
<input type="date" class="form-control" id="birthDate">
</div>
<div class="mb-3">
<label for="gender" class="form-label">性别</label>
<select class="form-select" id="gender">
<option value="">请选择</option>
<option value="male">男</option>
<option value="female">女</option>
<option value="other">其他</option>
</select>
</div>
<div class="mb-3">
<label for="bio" class="form-label">个人简介</label>
<textarea class="form-control" id="bio" rows="3" placeholder="简单介绍一下自己..."></textarea>
</div>
<div class="mb-3">
<div class="form-check">
<input class="form-check-input" type="checkbox" id="newsletter">
<label class="form-check-label" for="newsletter">
订阅我们的新闻通讯
</label>
</div>
</div>
<div class="mb-3">
<div class="form-check">
<input class="form-check-input" type="checkbox" id="terms" required>
<label class="form-check-label" for="terms">
我同意 <a href="#">服务条款</a> 和 <a href="#">隐私政策</a>
</label>
<div class="invalid-feedback">
你必须同意才能继续。
</div>
</div>
</div>
<div class="d-grid gap-2">
<button class="btn btn-primary" type="submit">注册账户</button>
<button class="btn btn-outline-secondary" type="reset">重置表单</button>
</div>
</form>
</div>
</div>
</div>
</div>
<!-- 联系表单 -->
<div class="row mt-5">
<div class="col-md-6 mx-auto">
<div class="card">
<div class="card-header">
<h3 class="card-title mb-0">联系我们</h3>
</div>
<div class="card-body">
<form>
<div class="mb-3">
<label for="contactName" class="form-label">姓名</label>
<input type="text" class="form-control" id="contactName" required>
</div>
<div class="mb-3">
<label for="contactEmail" class="form-label">邮箱</label>
<input type="email" class="form-control" id="contactEmail" required>
</div>
<div class="mb-3">
<label for="subject" class="form-label">主题</label>
<select class="form-select" id="subject" required>
<option value="">请选择主题</option>
<option value="general">一般咨询</option>
<option value="support">技术支持</option>
<option value="sales">销售咨询</option>
<option value="feedback">意见反馈</option>
</select>
</div>
<div class="mb-3">
<label for="priority" class="form-label">优先级</label>
<div>
<div class="form-check form-check-inline">
<input class="form-check-input" type="radio" name="priority" id="lowPriority" value="low">
<label class="form-check-label" for="lowPriority">低</label>
</div>
<div class="form-check form-check-inline">
<input class="form-check-input" type="radio" name="priority" id="mediumPriority" value="medium" checked>
<label class="form-check-label" for="mediumPriority">中</label>
</div>
<div class="form-check form-check-inline">
<input class="form-check-input" type="radio" name="priority" id="highPriority" value="high">
<label class="form-check-label" for="highPriority">高</label>
</div>
</div>
</div>
<div class="mb-3">
<label for="message" class="form-label">消息内容</label>
<textarea class="form-control" id="message" rows="5" placeholder="请详细描述你的问题或需求..." required></textarea>
</div>
<div class="mb-3">
<label for="attachment" class="form-label">附件</label>
<input class="form-control" type="file" id="attachment" multiple>
<div class="form-text">支持多个文件,每个文件不超过 10MB。</div>
</div>
<div class="d-grid">
<button type="submit" class="btn btn-primary">发送消息</button>
</div>
</form>
</div>
</div>
</div>
</div>
<!-- 搜索表单 -->
<div class="row mt-5">
<div class="col-md-8 mx-auto">
<div class="card">
<div class="card-header">
<h3 class="card-title mb-0">高级搜索</h3>
</div>
<div class="card-body">
<form class="row g-3">
<div class="col-md-6">
<label for="searchKeyword" class="form-label">关键词</label>
<input type="text" class="form-control" id="searchKeyword" placeholder="输入搜索关键词">
</div>
<div class="col-md-6">
<label for="searchCategory" class="form-label">分类</label>
<select class="form-select" id="searchCategory">
<option value="">所有分类</option>
<option value="electronics">电子产品</option>
<option value="clothing">服装</option>
<option value="books">图书</option>
<option value="home">家居</option>
</select>
</div>
<div class="col-md-6">
<label for="priceMin" class="form-label">最低价格</label>
<div class="input-group">
<span class="input-group-text">¥</span>
<input type="number" class="form-control" id="priceMin" placeholder="0">
</div>
</div>
<div class="col-md-6">
<label for="priceMax" class="form-label">最高价格</label>
<div class="input-group">
<span class="input-group-text">¥</span>
<input type="number" class="form-control" id="priceMax" placeholder="1000">
</div>
</div>
<div class="col-12">
<div class="form-check">
<input class="form-check-input" type="checkbox" id="inStock">
<label class="form-check-label" for="inStock">
仅显示有库存商品
</label>
</div>
</div>
<div class="col-12">
<div class="d-flex gap-2">
<button type="submit" class="btn btn-primary">搜索</button>
<button type="reset" class="btn btn-outline-secondary">重置</button>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
<script>
// 表单验证
(function() {
'use strict';
window.addEventListener('load', function() {
var forms = document.getElementsByClassName('needs-validation');
var validation = Array.prototype.filter.call(forms, function(form) {
form.addEventListener('submit', function(event) {
if (form.checkValidity() === false) {
event.preventDefault();
event.stopPropagation();
}
form.classList.add('was-validated');
}, false);
});
}, false);
})();
</script>
</body>
</html>表单最佳实践
- 使用语义化标签:正确使用
<label>、<fieldset>等标签 - 提供清晰的标签:每个表单控件都应该有描述性的标签
- 合理的验证:提供即时反馈和清晰的错误消息
- 可访问性:使用
aria-*属性和适当的role - 响应式设计:确保表单在所有设备上都能正常使用
下一步
现在你已经掌握了 Bootstrap 表单的基本使用方法,接下来我们将学习复选框与单选框的详细用法。