Foundation 表单
Foundation 提供了丰富的表单样式和组件。本章将介绍 Foundation 表单的各种用法。
基本表单
html
<form>
<label>
用户名
<input type="text" placeholder="请输入用户名">
</label>
<label>
密码
<input type="password" placeholder="请输入密码">
</label>
<label>
邮箱
<input type="email" placeholder="请输入邮箱">
</label>
<label>
<input type="checkbox"> 记住我
</label>
<button class="button" type="submit">登录</button>
</form>表单布局
堆叠表单(默认)
html
<form>
<label>姓名</label>
<input type="text">
<label>邮箱</label>
<input type="email">
<button class="button" type="submit">提交</button>
</form>水平表单
html
<form>
<div class="grid-x grid-padding-x">
<div class="cell small-3">
<label for="name" class="text-right middle">姓名</label>
</div>
<div class="cell small-9">
<input type="text" id="name" placeholder="请输入姓名">
</div>
</div>
<div class="grid-x grid-padding-x">
<div class="cell small-3">
<label for="email" class="text-right middle">邮箱</label>
</div>
<div class="cell small-9">
<input type="email" id="email" placeholder="请输入邮箱">
</div>
</div>
</form>内联表单
html
<form class="grid-x grid-padding-x align-bottom">
<div class="cell auto">
<label>
邮箱
<input type="email" placeholder="输入邮箱">
</label>
</div>
<div class="cell shrink">
<button class="button" type="submit">订阅</button>
</div>
</form>输入框类型
文本输入
html
<input type="text" placeholder="文本输入">
<input type="email" placeholder="邮箱">
<input type="password" placeholder="密码">
<input type="number" placeholder="数字">
<input type="tel" placeholder="电话">
<input type="url" placeholder="网址">
<input type="date">
<input type="time">
<input type="datetime-local">文本域
html
<textarea placeholder="请输入内容..." rows="5"></textarea>选择框
html
<select>
<option value="">请选择...</option>
<option value="1">选项 1</option>
<option value="2">选项 2</option>
<option value="3">选项 3</option>
</select>
<!-- 多选 -->
<select multiple>
<option value="1">选项 1</option>
<option value="2">选项 2</option>
<option value="3">选项 3</option>
</select>复选框
html
<fieldset>
<legend>选择你的兴趣</legend>
<input type="checkbox" id="music" name="hobbies">
<label for="music">音乐</label>
<input type="checkbox" id="sports" name="hobbies">
<label for="sports">运动</label>
<input type="checkbox" id="reading" name="hobbies">
<label for="reading">阅读</label>
</fieldset>单选按钮
html
<fieldset>
<legend>选择性别</legend>
<input type="radio" id="male" name="gender" value="male">
<label for="male">男</label>
<input type="radio" id="female" name="gender" value="female">
<label for="female">女</label>
</fieldset>输入框组
html
<!-- 前置标签 -->
<div class="input-group">
<span class="input-group-label">@</span>
<input class="input-group-field" type="text" placeholder="用户名">
</div>
<!-- 后置按钮 -->
<div class="input-group">
<input class="input-group-field" type="search" placeholder="搜索...">
<div class="input-group-button">
<button class="button" type="button">搜索</button>
</div>
</div>
<!-- 前后都有 -->
<div class="input-group">
<span class="input-group-label">$</span>
<input class="input-group-field" type="number" placeholder="金额">
<span class="input-group-label">.00</span>
</div>表单验证样式
html
<!-- 错误状态 -->
<label class="is-invalid-label">
邮箱
<input type="email" class="is-invalid-input" value="invalid-email">
<span class="form-error is-visible">请输入有效的邮箱地址</span>
</label>
<!-- 正确状态(需自定义) -->
<style>
.is-valid-input {
border-color: #3adb76;
}
.is-valid-label {
color: #3adb76;
}
</style>Abide 表单验证
Foundation 的 Abide 插件提供表单验证功能:
html
<form data-abide novalidate>
<div data-abide-error class="alert callout" style="display: none;">
<p>表单中有错误,请检查后重新提交。</p>
</div>
<label>
用户名 <small>必填</small>
<input type="text" required placeholder="用户名">
<span class="form-error">请输入用户名</span>
</label>
<label>
邮箱 <small>必填</small>
<input type="email" required placeholder="邮箱">
<span class="form-error">请输入有效的邮箱地址</span>
</label>
<label>
密码 <small>必填</small>
<input type="password" id="password" required pattern="[a-zA-Z0-9]{8,}" placeholder="密码">
<span class="form-error">密码至少8位,包含字母和数字</span>
</label>
<label>
确认密码 <small>必填</small>
<input type="password" required data-equalto="password" placeholder="确认密码">
<span class="form-error">两次密码不一致</span>
</label>
<button class="button" type="submit">注册</button>
</form>验证模式
html
<!-- 自定义正则 -->
<input type="text" pattern="[0-9]{11}" placeholder="手机号码">
<!-- 使用内置模式 -->
<input type="text" pattern="url" placeholder="网址">
<input type="text" pattern="email" placeholder="邮箱">
<input type="text" pattern="integer" placeholder="整数">
<input type="text" pattern="number" placeholder="数字">
<input type="text" pattern="alpha" placeholder="字母">
<input type="text" pattern="alpha_numeric" placeholder="字母数字">禁用和只读
html
<!-- 禁用 -->
<input type="text" disabled placeholder="禁用的输入框">
<!-- 只读 -->
<input type="text" readonly value="只读内容">帮助文本
html
<label>
密码
<input type="password" placeholder="密码">
</label>
<p class="help-text">密码至少8位,包含字母和数字</p>完整示例
html
<!DOCTYPE html>
<html class="no-js" lang="zh-CN">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Foundation 表单示例</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/foundation-sites@6.7.5/dist/css/foundation.min.css">
<style>
.demo-section {
margin-bottom: 40px;
padding: 20px;
background: #f8f8f8;
border-radius: 4px;
}
.demo-section h3 {
margin-bottom: 20px;
border-bottom: 1px solid #ddd;
padding-bottom: 10px;
}
</style>
</head>
<body>
<div class="grid-container">
<h1>Foundation 表单展示</h1>
<div class="demo-section">
<h3>登录表单</h3>
<div class="grid-x grid-margin-x">
<div class="cell medium-6">
<form data-abide novalidate>
<label>
用户名
<input type="text" required placeholder="请输入用户名">
<span class="form-error">用户名不能为空</span>
</label>
<label>
密码
<input type="password" required placeholder="请输入密码">
<span class="form-error">密码不能为空</span>
</label>
<div class="grid-x">
<div class="cell auto">
<input type="checkbox" id="remember">
<label for="remember">记住我</label>
</div>
<div class="cell shrink">
<a href="#">忘记密码?</a>
</div>
</div>
<button class="button expanded" type="submit">登录</button>
</form>
</div>
</div>
</div>
<div class="demo-section">
<h3>注册表单</h3>
<form data-abide novalidate>
<div class="grid-x grid-margin-x">
<div class="cell medium-6">
<label>
姓名 <small>必填</small>
<input type="text" required placeholder="请输入姓名">
<span class="form-error">姓名不能为空</span>
</label>
</div>
<div class="cell medium-6">
<label>
邮箱 <small>必填</small>
<input type="email" required placeholder="请输入邮箱">
<span class="form-error">请输入有效的邮箱</span>
</label>
</div>
<div class="cell medium-6">
<label>
密码 <small>必填</small>
<input type="password" id="reg-password" required pattern=".{8,}" placeholder="至少8位">
<span class="form-error">密码至少8位</span>
</label>
</div>
<div class="cell medium-6">
<label>
确认密码 <small>必填</small>
<input type="password" required data-equalto="reg-password" placeholder="确认密码">
<span class="form-error">两次密码不一致</span>
</label>
</div>
<div class="cell">
<fieldset>
<legend>性别</legend>
<input type="radio" id="reg-male" name="gender" value="male" required>
<label for="reg-male">男</label>
<input type="radio" id="reg-female" name="gender" value="female">
<label for="reg-female">女</label>
</fieldset>
</div>
<div class="cell">
<input type="checkbox" id="agree" required>
<label for="agree">我已阅读并同意 <a href="#">服务条款</a></label>
</div>
<div class="cell">
<button class="button" type="submit">注册</button>
<button class="button secondary" type="reset">重置</button>
</div>
</div>
</form>
</div>
<div class="demo-section">
<h3>输入框组</h3>
<div class="grid-x grid-margin-x">
<div class="cell medium-6">
<label>带前置标签</label>
<div class="input-group">
<span class="input-group-label">@</span>
<input class="input-group-field" type="text" placeholder="用户名">
</div>
</div>
<div class="cell medium-6">
<label>带后置按钮</label>
<div class="input-group">
<input class="input-group-field" type="search" placeholder="搜索...">
<div class="input-group-button">
<button class="button" type="button">搜索</button>
</div>
</div>
</div>
<div class="cell medium-6">
<label>金额输入</label>
<div class="input-group">
<span class="input-group-label">¥</span>
<input class="input-group-field" type="number" placeholder="0">
<span class="input-group-label">.00</span>
</div>
</div>
<div class="cell medium-6">
<label>网址输入</label>
<div class="input-group">
<span class="input-group-label">https://</span>
<input class="input-group-field" type="text" placeholder="example.com">
</div>
</div>
</div>
</div>
<div class="demo-section">
<h3>选择框</h3>
<div class="grid-x grid-margin-x">
<div class="cell medium-4">
<label>
单选下拉
<select>
<option value="">请选择...</option>
<option value="1">选项 1</option>
<option value="2">选项 2</option>
<option value="3">选项 3</option>
</select>
</label>
</div>
<div class="cell medium-4">
<label>
多选下拉
<select multiple style="height: 100px;">
<option value="1">选项 1</option>
<option value="2">选项 2</option>
<option value="3">选项 3</option>
<option value="4">选项 4</option>
</select>
</label>
</div>
<div class="cell medium-4">
<label>
分组下拉
<select>
<optgroup label="水果">
<option>苹果</option>
<option>香蕉</option>
</optgroup>
<optgroup label="蔬菜">
<option>胡萝卜</option>
<option>西红柿</option>
</optgroup>
</select>
</label>
</div>
</div>
</div>
<div class="demo-section">
<h3>联系表单</h3>
<form>
<div class="grid-x grid-margin-x">
<div class="cell medium-6">
<label>
姓名
<input type="text" placeholder="您的姓名">
</label>
</div>
<div class="cell medium-6">
<label>
邮箱
<input type="email" placeholder="您的邮箱">
</label>
</div>
<div class="cell">
<label>
主题
<select>
<option>一般咨询</option>
<option>技术支持</option>
<option>商务合作</option>
<option>其他</option>
</select>
</label>
</div>
<div class="cell">
<label>
消息
<textarea rows="5" placeholder="请输入您的消息..."></textarea>
</label>
</div>
<div class="cell">
<button class="button" type="submit">发送消息</button>
</div>
</div>
</form>
</div>
</div>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/foundation-sites@6.7.5/dist/js/foundation.min.js"></script>
<script>$(document).foundation();</script>
</body>
</html>表单最佳实践
- 使用 label:始终为输入框关联 label
- 清晰的提示:提供占位符和帮助文本
- 验证反馈:实时显示验证状态
- 可访问性:确保表单可以通过键盘操作
- 响应式布局:使用网格系统适应不同屏幕
总结
本章我们学习了:
- 基本表单元素
- 表单布局(堆叠、水平、内联)
- 输入框组
- Abide 表单验证
- 各种输入类型和状态
下一章,我们将学习 Foundation 输入框尺寸。