关于 daisy-ui
daisy-ui 是一项为编码 Agent 提供 DaisyUI 组件使用指导的技能,面向构建 Williamstown SC 网站的开发工作。它说明主题配置、组件选择、响应式布局与无障碍实践,并结合 Tailwind 自定义样式。
主要功能
- 01配置 Williamstown SC 品牌主题
- 02按用途选择 DaisyUI 组件
- 03Tailwind 自定义样式指导
- 04提供无障碍与响应式模式
- 05说明组件组合和性能注意事项
适用场景
- 01构建球队新闻和赛程页面
- 02实现导航、表单及反馈界面
- 03为移动端适配页面布局
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ dejanvasic85/ williamstownsc --skill daisy-ui安装后在 Claude Code 中输入/daisy-ui确认已加载。
附带文件llms.txt
详细介绍
daisy-ui
说明
请遵循 ./llms.txt 中的文档,按照主 CLAUDE.md 文件中说明的项目技术栈和编码规范,编写使用 DaisyUI 组件和主题的代码。
主题自定义
在 tailwind.config.js 中配置 DaisyUI 主题,以体现 Williamstown SC 的品牌形象:
主色
primary:#062174(俱乐部蓝——传统、可信赖)secondary:#DEB100(俱乐部黄/金色——充满活力、醒目)accent:#10B981(绿色——营造足球场氛围)neutral:#1F2937(用于文本的深灰色)base-100:#FFFFFF(白色背景)base-200:#F3F4F6(浅灰色背景)base-300:#E5E7EB(中灰色边框)
排版指南
- 使用
font-sans,搭配系统字体或 Inter - 为保证无障碍性,确保基础字号至少为 16px
- 使用适当的行高(正文为 1.5+)
- 使用不同的字重:400(常规)、500(中等)、600(半粗体)、700(粗体)
主题配置示例
// tailwind.config.js
module.exports = {
plugins: [require('daisyui')],
daisyui: {
themes: [
{
williamstown: {
primary: '#062174', // Club blue
'primary-content': '#FFFFFF',
secondary: '#DEB100', // Club gold
'secondary-content': '#000000',
accent: '#10B981', // Soccer green
'accent-content': '#FFFFFF',
neutral: '#1F2937',
'neutral-content': '#FFFFFF',
'base-100': '#FFFFFF', // White
'base-200': '#F3F4F6', // Light gray
'base-300': '#E5E7EB', // Medium gray
'base-content': '#1F2937',
info: '#3ABFF8',
'info-content': '#000000',
success: '#36D399',
'success-content': '#000000',
warning: '#FBBD23',
'warning-content': '#000000',
error: '#F87272',
'error-content': '#000000'
}
}
]
}
};
组件选择
使用 DaisyUI 组件的场景
导航和菜单:
navbar- 顶部导航栏menu- 垂直/水平菜单列表dropdown- 下拉菜单drawer- 移动端滑出式导航breadcrumbs- 页面导航路径
操作:
btn- 带有不同变体的按钮(btn-primary、btn-secondary、btn-ghost、btn-outline)btn-group- 按钮组swap- 切换/交换图标(汉堡菜单)link- 样式化链接
数据显示:
card- 用于新闻、赛程、球员内容卡片badge- 标签avatar- 头像stat- 统计数据展示(进球、胜场等)table- 用于赛程/比赛结果的数据表格timeline- 比赛历史时间线
表单:
input- 带有验证状态的文本输入框textarea- 多行文本框select- 下拉选择框checkbox- 复选框radio- 单选按钮toggle- 切换开关range- 范围滑块file-input- 文件上传
反馈:
alert- 通知和消息modal- 模态对话框toast- Toast 通知loading- 加载旋转指示器skeleton- 加载骨架屏progress- 进度条
布局:
divider- 分节分隔线stack- 垂直堆叠join- 将元素组合在一起indicator- 通知指示器
使用自定义 Tailwind 的场景
- 带有玻璃拟态效果的 Hero 区块
- 复杂的非对称布局
- 自定义动画和过渡效果
- 来自 frontend-design skill 的突破网格设计
- 独特的间距模式
- 高级视觉效果(backdrop-blur、渐变)
无障碍设计模式
符合 WCAG AA 标准
-
颜色对比度:
- DaisyUI 会自动确保文本与背景组合的对比度
- 确认自定义颜色的普通文本对比度达到 4.5:1
- 确认自定义颜色的大号文本(18px+)对比度达到 3:1
-
触控目标:
- 主要 CTA 使用
btn-lg(确保最小尺寸为 44x44px) - 默认
btn高度为 48px(符合要求) - 尽量少用
btn-sm,仅用于次要操作
- 主要 CTA 使用
-
表单无障碍性:
<label className="form-control w-full"> <div className="label"> <span className="label-text">Email address</span> </div> <input type="email" placeholder="[email protected]" className="input input-bordered w-full" aria-required="true" /> <div className="label"> <span className="label-text-alt">We'll never share your email</span> </div> </label> -
焦点状态:
- DaisyUI 默认包含清晰可见的焦点指示器
- 使用键盘导航测试所有交互元素
- 使用
focus:变体进行自定义样式设置
-
语义化 HTML:
- DaisyUI 组件使用恰当的语义化 HTML
- 在需要时添加 ARIA 标签:
aria-label、aria-describedby - 为自定义组件使用
role属性
体育俱乐部常用模式
比赛/赛程卡片
<div className="card bg-base-100 shadow-xl">
<div className="card-body">
<div className="flex items-center justify-between">
<h3 className="card-title text-lg">Round 5</h3>
<div className="badge badge-primary">Home</div>
</div>
<div className="my-4 flex items-center justify-between">
<div className="flex-1 text-center">
<p className="text-xl font-bold">Williamstown SC</p>
</div>
<div className="px-4 text-center">
<p className="text-3xl font-bold">2 - 1</p>
</div>
<div className="flex-1 text-center">
<p className="text-xl font-bold">Opposition FC</p>
</div>
</div>
<div className="card-actions justify-end">
<button className="btn btn-ghost">Match Report</button>
</div>
</div>
</div>
新闻卡片
<div className="card bg-base-100 shadow-xl">
<figure>
<img src="/news-image.jpg" alt="News headline" />
</figure>
<div className="card-body">
<div className="flex gap-2">
<div className="badge badge-secondary">News</div>
<div className="badge badge-outline">Senior Men</div>
</div>
<h2 className="card-title">2026 Senior Men's Coaching Team</h2>
<p>Exciting announcement about our coaching lineup for the upcoming season...</p>
<div className="card-actions mt-4 items-center justify-between">
<span className="text-base-content/70 text-sm">2 days ago</span>
<button className="btn btn-primary">Read More</button>
</div>
</div>
</div>
导航页眉
<div className="navbar bg-primary text-primary-content">
<div className="navbar-start">
<div className="dropdown">
<button tabIndex={0} className="btn btn-ghost lg:hidden">
<svg className="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path
strokeLinecap="round"
strokeLinejoin="round"
strokeWidth={2}
d="M4 6h16M4 12h8m-8 6h16"
/>
</svg>
</button>
<ul
tabIndex={0}
className="menu menu-sm dropdown-content bg-base-100 rounded-box z-[1] mt-3 w-52 p-2 shadow"
>
<li>
<a>HOME</a>
</li>
<li>
<a>ABOUT</a>
</li>
<li>
<a>FIXTURES</a>
</li>
</ul>
</div>
<a className="btn btn-ghost text-xl">WILLIAMSTOWN SC</a>
</div>
<div className="navbar-center hidden lg:flex">
<ul className="menu menu-horizontal px-1">
<li>
<a>HOME</a>
</li>
<li>
<a>ABOUT</a>
</li>
<li>
<a>MEMBER INFO</a>
</li>
<li>
<a>FIXTURES</a>
</li>
<li>
<a>CALENDAR</a>
</li>
<li>
<a>CONTACT</a>
</li>
<li>
<a>SHOP</a>
</li>
</ul>
</div>
<div className="navbar-end">
<button className="btn btn-ghost btn-circle">
<svg className="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path
strokeLinecap="round"
strokeLinejoin="round"
strokeWidth={2}
d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z"
/>
</svg>
</button>
</div>
</div>
球员卡片
<div className="card card-compact bg-base-100 shadow-xl">
<figure>
<img src="/player-photo.jpg" alt="Player name" className="h-64 w-full object-cover" />
</figure>
<div className="card-body">
<div className="flex items-start justify-between">
<div>
<h3 className="card-title">John Smith</h3>
<p className="text-base-content/70 text-sm">Midfielder</p>
</div>
<div className="badge badge-lg badge-primary">15</div>
</div>
<div className="stats stats-vertical mt-2 shadow">
<div className="stat p-2">
<div className="stat-title text-xs">Appearances</div>
<div className="stat-value text-lg">24</div>
</div>
<div className="stat p-2">
<div className="stat-title text-xs">Goals</div>
<div className="stat-value text-lg">8</div>
</div>
</div>
</div>
</div>
活动卡片
<div className="card bg-base-100 shadow-xl">
<div className="card-body">
<div className="flex items-start gap-4">
<div className="text-center">
<div className="text-primary text-4xl font-bold">15</div>
<div className="text-base-content/70 text-sm">NOV</div>
</div>
<div className="flex-1">
<h3 className="card-title">Season Launch Event</h3>
<p className="text-base-content/70 mb-2 text-sm">6:00 PM - 9:00 PM</p>
<p>Join us for the official 2026 season launch with the new coaching team...</p>
<div className="card-actions mt-4 justify-end">
<button className="btn btn-primary">RSVP</button>
</div>
</div>
</div>
</div>
</div>
响应式工具类
断点类
将 DaisyUI 的响应式修饰符与 Tailwind 断点搭配使用:
// Button sizes
<button className="btn btn-sm md:btn-md lg:btn-lg">
Responsive Button
</button>
// Card layout
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
{/* Cards adapt to screen size */}
</div>
// Navigation drawer (mobile)
<div className="drawer lg:drawer-open">
<input id="drawer" type="checkbox" className="drawer-toggle" />
<div className="drawer-content">
{/* Page content */}
</div>
<div className="drawer-side">
{/* Sidebar menu */}
</div>
</div>
移动端优先模式
// Hide on mobile, show on desktop
<div className="hidden lg:block">Desktop Menu</div>
// Show on mobile, hide on desktop
<div className="lg:hidden">Mobile Menu</div>
// Collapse for accordion on mobile
<div className="collapse lg:collapse-open">
<input type="checkbox" />
<div className="collapse-title">Click to expand</div>
<div className="collapse-content">Content</div>
</div>
表单验证状态
// Success state
<input
type="text"
className="input input-bordered input-success w-full"
defaultValue="[email protected]"
/>
// Error state
<input
type="text"
className="input input-bordered input-error w-full"
aria-invalid="true"
aria-describedby="email-error"
/>
<span id="email-error" className="text-error text-sm">
Please enter a valid email address
</span>
// Warning state
<input
type="text"
className="input input-bordered input-warning w-full"
/>
// Disabled state
<input
type="text"
className="input input-bordered w-full"
disabled
/>
加载状态
// Button loading
<button className="btn btn-primary">
<span className="loading loading-spinner"></span>
Loading...
</button>
// Skeleton loader
<div className="flex flex-col gap-4">
<div className="skeleton h-32 w-full"></div>
<div className="skeleton h-4 w-28"></div>
<div className="skeleton h-4 w-full"></div>
<div className="skeleton h-4 w-full"></div>
</div>
// Card skeleton
<div className="card bg-base-100 shadow-xl">
<div className="skeleton h-48 w-full"></div>
<div className="card-body">
<div className="skeleton h-4 w-3/4"></div>
<div className="skeleton h-4 w-1/2"></div>
</div>
</div>
模态框模式
// Basic modal
<dialog id="my_modal" className="modal">
<div className="modal-box">
<h3 className="font-bold text-lg">Match Report</h3>
<p className="py-4">Detailed match information goes here...</p>
<div className="modal-action">
<form method="dialog">
<button className="btn">Close</button>
</form>
</div>
</div>
</dialog>
// Modal with backdrop
<dialog id="my_modal_2" className="modal modal-bottom sm:modal-middle">
<div className="modal-box">
<h3 className="font-bold text-lg">Confirm Action</h3>
<p className="py-4">Are you sure you want to proceed?</p>
<div className="modal-action">
<form method="dialog">
<button className="btn btn-ghost">Cancel</button>
<button className="btn btn-primary">Confirm</button>
</form>
</div>
</div>
<form method="dialog" className="modal-backdrop">
<button>close</button>
</form>
</dialog>
性能注意事项
打包体积
- DaisyUI 会为你的打包文件增加约 25KB 的 gzip 压缩体积
- 组件仅使用 CSS(无 JavaScript 开销)
- 使用 Tailwind 的 JIT 模式以获得最佳打包体积
- 在生产环境中清除未使用的样式
优化技巧
// tailwind.config.js - Limit DaisyUI themes for smaller bundle
daisyui: {
themes: ['williamstown'], // Only include what you need
darkTheme: false, // Disable if not using dark mode
base: true,
styled: true,
utils: true,
}
Tree Shaking
未使用的 DaisyUI 组件会自动进行 tree-shaking。只包含 HTML/JSX 中实际引用的组件。
将 DaisyUI 与自定义样式结合使用
何时混用
// DaisyUI component with custom Tailwind
<div className="card bg-base-100 shadow-xl backdrop-blur-xl bg-opacity-80">
<div className="card-body">
{/* Glassmorphism effect added to DaisyUI card */}
</div>
</div>
// DaisyUI with custom animations
<button className="btn btn-primary hover:scale-105 transition-transform duration-200">
Hover Me
</button>
扩展 DaisyUI 组件
// tailwind.config.js
module.exports = {
theme: {
extend: {
// Add custom animations
animation: {
'fade-in': 'fadeIn 0.3s ease-in'
},
keyframes: {
fadeIn: {
'0%': { opacity: '0', transform: 'translateY(10px)' },
'100%': { opacity: '1', transform: 'translateY(0)' }
}
}
}
}
};
组件组合
构建复杂组件
// Fixture list with stats
const FixtureList = () => (
<div className="overflow-x-auto">
<table className="table-zebra table">
<thead>
<tr>
<th>Date</th>
<th>Home</th>
<th>Score</th>
<th>Away</th>
<th>Status</th>
</tr>
</thead>
<tbody>
<tr>
<td>Nov 15</td>
<td className="font-bold">Williamstown SC</td>
<td className="text-center">2 - 1</td>
<td>Opposition FC</td>
<td>
<div className="badge badge-success">Win</div>
</td>
</tr>
</tbody>
</table>
</div>
);
最佳实践
- 始终使用语义化 HTML - DaisyUI 基于规范的语义化元素构建
- 测试键盘导航 - 确保所有交互元素都可通过键盘访问
- 检查颜色对比度 - 使用工具检查是否符合 WCAG 标准
- 使用一致的间距 - 遵循 Tailwind 的间距比例(p-4、gap-4 等)
- 利用 data-theme - 将主题应用到容器元素:
<div data-theme="williamstown"> - 移动端优先设计 - 从移动端样式开始,再添加响应式修饰符
- 避免 !important - 使用 Tailwind 的优先级机制
- 记录自定义变体 - 追踪自定义组件组合
常见陷阱
❌ 不要:
- 将内联样式与 DaisyUI 类混用
- 不了解系统就覆盖 DaisyUI CSS 变量
- DaisyUI 已有解决方案时仍创建自定义组件
- 忽略组件内置的无障碍功能
✅ 应该:
- 使用 DaisyUI 的主题系统进行自定义
- 需要时使用 Tailwind 工具类扩展
- 在不同断点下测试组件
- 保持间距和尺寸一致
- 遵循上述组件组合模式
快速参考
组件类模式
Button: btn btn-{variant} btn-{size}
Card: card card-{variant}
Input: input input-{variant} input-{size}
Badge: badge badge-{variant} badge-{size}
Alert: alert alert-{variant}
Modal: modal modal-{position}
颜色变体
primary, secondary, accent, neutral, info, success, warning, error, ghost
尺寸修饰符
xs, sm, md (default), lg, xl
状态修饰符
disabled, loading, active, focus
评论
支持 Markdown