TailwindCSS 提供了专门的 Forms 插件(@tailwindcss/forms),为表单元素提供了美观且一致的样式,大大简化了表单开发工作。
安装和配置
1. 安装插件
bash# 使用 npm npm install -D @tailwindcss/forms # 使用 yarn yarn add -D @tailwindcss/forms # 使用 pnpm pnpm add -D @tailwindcss/forms
2. 配置插件
javascript// tailwind.config.js module.exports = { plugins: [ require('@tailwindcss/forms'), ], }
基础表单样式
1. 输入框
html<!-- 文本输入框 --> <input type="text" placeholder="请输入用户名" class=" w-full px-4 py-2 border border-gray-300 rounded focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent "> <!-- 邮箱输入框 --> <input type="email" placeholder="请输入邮箱" class=" w-full px-4 py-2 border border-gray-300 rounded focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent "> <!-- 密码输入框 --> <input type="password" placeholder="请输入密码" class=" w-full px-4 py-2 border border-gray-300 rounded focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent "> <!-- 数字输入框 --> <input type="number" placeholder="请输入数字" class=" w-full px-4 py-2 border border-gray-300 rounded focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent ">
2. 文本域
html<!-- 文本域 --> <textarea placeholder="请输入内容" rows="4" class=" w-full px-4 py-2 border border-gray-300 rounded focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent resize-none " ></textarea>
3. 选择框
html<!-- 单选下拉框 --> <select class=" w-full px-4 py-2 border border-gray-300 rounded focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent "> <option value="">请选择</option> <option value="1">选项 1</option> <option value="2">选项 2</option> <option value="3">选项 3</option> </select> <!-- 多选下拉框 --> <select multiple class=" w-full px-4 py-2 border border-gray-300 rounded focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent "> <option value="1">选项 1</option> <option value="2">选项 2</option> <option value="3">选项 3</option> </select>
4. 复选框和单选按钮
html<!-- 复选框 --> <label class="flex items-center space-x-2"> <input type="checkbox" class=" w-4 h-4 text-blue-600 border-gray-300 rounded focus:ring-blue-500 "> <span>同意条款</span> </label> <!-- 单选按钮 --> <div class="space-y-2"> <label class="flex items-center space-x-2"> <input type="radio" name="gender" value="male" class=" w-4 h-4 text-blue-600 border-gray-300 focus:ring-blue-500 "> <span>男</span> </label> <label class="flex items-center space-x-2"> <input type="radio" name="gender" value="female" class=" w-4 h-4 text-blue-600 border-gray-300 focus:ring-blue-500 "> <span>女</span> </label> </div>
表单状态
1. 禁用状态
html<!-- 禁用的输入框 --> <input type="text" placeholder="禁用的输入框" disabled class=" w-full px-4 py-2 border border-gray-300 rounded bg-gray-100 text-gray-500 cursor-not-allowed " > <!-- 禁用的按钮 --> <button disabled class=" px-4 py-2 bg-blue-500 text-white rounded disabled:bg-gray-400 disabled:cursor-not-allowed " > 禁用的按钮 </button>
2. 只读状态
html<!-- 只读输入框 --> <input type="text" value="只读内容" readonly class=" w-full px-4 py-2 border border-gray-300 rounded bg-gray-100 " >
3. 错误状态
html<!-- 错误状态的输入框 --> <input type="text" placeholder="请输入用户名" class=" w-full px-4 py-2 border border-red-500 rounded focus:outline-none focus:ring-2 focus:ring-red-500 focus:border-transparent " > <p class="text-red-500 text-sm mt-1">用户名不能为空</p>
表单布局
1. 水平布局
html<!-- 水平表单 --> <form class="flex items-end space-x-4"> <div class="flex-1"> <label class="block text-sm font-medium text-gray-700 mb-1"> 用户名 </label> <input type="text" placeholder="请输入用户名" class=" w-full px-4 py-2 border border-gray-300 rounded focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent " > </div> <div class="flex-1"> <label class="block text-sm font-medium text-gray-700 mb-1"> 密码 </label> <input type="password" placeholder="请输入密码" class=" w-full px-4 py-2 border border-gray-300 rounded focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent " > </div> <button type="submit" class=" px-6 py-2 bg-blue-500 hover:bg-blue-600 text-white rounded font-medium " > 登录 </button> </form>
2. 垂直布局
html<!-- 垂直表单 --> <form class="space-y-4 max-w-md"> <div> <label class="block text-sm font-medium text-gray-700 mb-1"> 用户名 </label> <input type="text" placeholder="请输入用户名" class=" w-full px-4 py-2 border border-gray-300 rounded focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent " > </div> <div> <label class="block text-sm font-medium text-gray-700 mb-1"> 邮箱 </label> <input type="email" placeholder="请输入邮箱" class=" w-full px-4 py-2 border border-gray-300 rounded focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent " > </div> <div> <label class="block text-sm font-medium text-gray-700 mb-1"> 密码 </label> <input type="password" placeholder="请输入密码" class=" w-full px-4 py-2 border border-gray-300 rounded focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent " > </div> <button type="submit" class=" w-full px-4 py-2 bg-blue-500 hover:bg-blue-600 text-white rounded font-medium " > 注册 </button> </form>
3. 网格布局
html<!-- 网格表单 --> <form class="grid grid-cols-1 md:grid-cols-2 gap-4 max-w-2xl"> <div> <label class="block text-sm font-medium text-gray-700 mb-1"> 名字 </label> <input type="text" placeholder="请输入名字" class=" w-full px-4 py-2 border border-gray-300 rounded focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent " > </div> <div> <label class="block text-sm font-medium text-gray-700 mb-1"> 姓氏 </label> <input type="text" placeholder="请输入姓氏" class=" w-full px-4 py-2 border border-gray-300 rounded focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent " > </div> <div class="md:col-span-2"> <label class="block text-sm font-medium text-gray-700 mb-1"> 邮箱 </label> <input type="email" placeholder="请输入邮箱" class=" w-full px-4 py-2 border border-gray-300 rounded focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent " > </div> <div class="md:col-span-2"> <label class="block text-sm font-medium text-gray-700 mb-1"> 地址 </label> <textarea placeholder="请输入地址" rows="3" class=" w-full px-4 py-2 border border-gray-300 rounded focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent resize-none " ></textarea> </div> <div class="md:col-span-2"> <button type="submit" class=" w-full px-4 py-2 bg-blue-500 hover:bg-blue-600 text-white rounded font-medium " > 提交 </button> </div> </form>
自定义表单样式
1. 使用 @apply
css/* 在 CSS 文件中定义表单样式 */ .form-input { @apply w-full px-4 py-2 border border-gray-300 rounded focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent; } .form-input-error { @apply border-red-500 focus:ring-red-500; } .form-label { @apply block text-sm font-medium text-gray-700 mb-1; }
html<!-- 使用自定义样式 --> <form class="space-y-4"> <div> <label class="form-label">用户名</label> <input type="text" class="form-input" placeholder="请输入用户名"> </div> <div> <label class="form-label">密码</label> <input type="password" class="form-input form-input-error" placeholder="请输入密码"> </div> </form>
2. 配置插件选项
javascript// tailwind.config.js module.exports = { plugins: [ require('@tailwindcss/forms')({ strategy: 'class', // 或 'base' }), ], }
完整表单示例
html<!-- 注册表单 --> <form class="max-w-md mx-auto space-y-6 bg-white p-8 rounded-lg shadow-md"> <h2 class="text-2xl font-bold text-center text-gray-900"> 创建账户 </h2> <div> <label class="block text-sm font-medium text-gray-700 mb-1"> 用户名 </label> <input type="text" placeholder="请输入用户名" class=" w-full px-4 py-2 border border-gray-300 rounded focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent " > </div> <div> <label class="block text-sm font-medium text-gray-700 mb-1"> 邮箱 </label> <input type="email" placeholder="请输入邮箱" class=" w-full px-4 py-2 border border-gray-300 rounded focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent " > </div> <div> <label class="block text-sm font-medium text-gray-700 mb-1"> 密码 </label> <input type="password" placeholder="请输入密码" class=" w-full px-4 py-2 border border-gray-300 rounded focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent " > </div> <div> <label class="flex items-center space-x-2"> <input type="checkbox" class=" w-4 h-4 text-blue-600 border-gray-300 rounded focus:ring-blue-500 " > <span class="text-sm text-gray-700"> 我同意服务条款和隐私政策 </span> </label> </div> <button type="submit" class=" w-full px-4 py-2 bg-blue-500 hover:bg-blue-600 text-white rounded font-medium transition-colors " > 注册 </button> <p class="text-center text-sm text-gray-600"> 已有账户? <a href="#" class="text-blue-600 hover:text-blue-500"> 登录 </a> </p> </form>
最佳实践
1. 一致的焦点样式
html<!-- 所有表单元素使用一致的焦点样式 --> <input type="text" class=" border border-gray-300 rounded focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent " >
2. 清晰的标签
html<!-- 使用清晰的标签 --> <div> <label class="block text-sm font-medium text-gray-700 mb-1"> 用户名 <span class="text-red-500">*</span> </label> <input type="text" placeholder="请输入用户名" class="w-full px-4 py-2 border border-gray-300 rounded" > </div>
3. 错误提示
html<!-- 提供清晰的错误提示 --> <div> <label class="block text-sm font-medium text-gray-700 mb-1"> 邮箱 </label> <input type="email" class=" w-full px-4 py-2 border border-red-500 rounded focus:outline-none focus:ring-2 focus:ring-red-500 focus:border-transparent " > <p class="text-red-500 text-sm mt-1"> 请输入有效的邮箱地址 </p> </div>
注意事项
- 可访问性:确保表单元素有正确的标签和 ARIA 属性
- 移动端优化:考虑移动端的触摸目标和输入体验
- 验证反馈:提供即时的验证反馈
- 错误处理:清晰显示错误信息
- 提交状态:处理提交中的状态和禁用按钮
总结
TailwindCSS Forms 插件提供了:
- 美观的默认表单样式
- 一致的跨浏览器表现
- 灵活的自定义选项
- 简化的表单开发流程
通过合理使用 Forms 插件,可以快速创建美观、易用的表单界面。