最佳实践
本指南汇总了使用 Liquid Glass UI 的最佳实践,帮助您创建优雅、高性能和用户友好的界面。
设计原则
1. 保持一致性
在整个应用中保持设计语言的一致性:
css
/* 统一的间距系统 */
:root {
--spacing-xs: 4px;
--spacing-sm: 8px;
--spacing-md: 16px;
--spacing-lg: 24px;
--spacing-xl: 32px;
}
/* 统一的字体大小 */
:root {
--text-xs: 12px;
--text-sm: 14px;
--text-base: 16px;
--text-lg: 18px;
--text-xl: 24px;
}
2. 重视层次结构
使用视觉层次来引导用户注意力:
html
<!-- 明确的信息层次 -->
<div class="glass-container">
<h1 class="primary-title">主标题</h1>
<h2 class="secondary-title">次级标题</h2>
<p class="body-text">正文内容</p>
<span class="caption-text">说明文字</span>
</div>
<style>
.primary-title {
color: rgba(255, 255, 255, 0.95);
font-size: var(--text-xl);
font-weight: 600;
}
.secondary-title {
color: rgba(255, 255, 255, 0.85);
font-size: var(--text-lg);
font-weight: 500;
}
.body-text {
color: rgba(255, 255, 255, 0.8);
font-size: var(--text-base);
}
.caption-text {
color: rgba(255, 255, 255, 0.6);
font-size: var(--text-sm);
}
</style>
3. 适度使用效果
避免过度使用玻璃效果,保持界面清晰:
html
<!-- 好的做法:主要元素使用玻璃效果 -->
<div class="glass-card main-content">
<h3>重要内容</h3>
<div class="content-section">
<!-- 次要元素使用简单背景 -->
<div class="simple-card">
<p>次要信息</p>
</div>
</div>
</div>
<style>
.simple-card {
background: rgba(255, 255, 255, 0.05);
border-radius: 8px;
padding: 16px;
/* 不使用 backdrop-filter */
}
</style>
性能优化
1. 条件性应用模糊效果
检测浏览器支持并优雅降级:
css
/* 基础样式(所有浏览器支持) */
.glass-element {
background: rgba(255, 255, 255, 0.15);
border: 1px solid rgba(255, 255, 255, 0.2);
border-radius: 12px;
}
/* 增强样式(现代浏览器) */
@supports (backdrop-filter: blur(10px)) {
.glass-element {
backdrop-filter: blur(15px);
-webkit-backdrop-filter: blur(15px);
}
}
/* 移动设备优化 */
@media (max-width: 768px) {
.glass-element {
backdrop-filter: blur(8px);
-webkit-backdrop-filter: blur(8px);
}
}
2. 减少不必要的重绘
优化动画性能:
css
/* 好的做法:使用 transform 和 opacity */
.glass-button {
transition: transform 0.3s ease, opacity 0.3s ease;
}
.glass-button:hover {
transform: translateY(-2px);
opacity: 0.9;
}
/* 避免:会导致重排的属性 */
.glass-button:hover {
/* 不推荐 */
width: calc(100% + 4px);
padding: 14px 26px;
margin: 2px;
}
3. 使用 will-change 属性
为频繁动画的元素提示浏览器:
css
.animated-element {
will-change: transform, opacity;
transition: transform 0.3s ease, opacity 0.3s ease;
}
/* 动画结束后移除 will-change */
.animated-element.animation-complete {
will-change: auto;
}
可访问性
1. 确保足够的颜色对比度
css
/* 确保文本可读性 */
.glass-text {
color: rgba(255, 255, 255, 0.9); /* 对比度 > 4.5:1 */
}
.glass-text-muted {
color: rgba(255, 255, 255, 0.7); /* 对比度 > 3:1 */
}
/* 深色背景时调整 */
.light-background .glass-text {
color: rgba(0, 0, 0, 0.85);
}
2. 提供键盘导航支持
css
/* 明确的焦点指示器 */
.glass-button:focus,
.glass-input:focus {
outline: 2px solid rgba(74, 144, 226, 0.8);
outline-offset: 2px;
}
/* 跳过链接 */
.skip-link {
position: absolute;
top: -40px;
left: 6px;
background: rgba(0, 0, 0, 0.9);
color: white;
padding: 8px;
text-decoration: none;
transition: top 0.3s;
}
.skip-link:focus {
top: 6px;
}
3. 使用语义化HTML
html
<!-- 正确的语义化结构 -->
<main class="glass-container">
<header>
<h1>页面标题</h1>
<nav aria-label="主导航">
<ul class="glass-nav">
<li><a href="#section1">第一部分</a></li>
<li><a href="#section2">第二部分</a></li>
</ul>
</nav>
</header>
<section id="section1" aria-labelledby="section1-title">
<h2 id="section1-title">第一部分</h2>
<p>内容...</p>
</section>
</main>
响应式设计
1. 移动优先原则
css
/* 移动端基础样式 */
.glass-card {
padding: 16px;
margin: 8px;
}
/* 平板样式 */
@media (min-width: 768px) {
.glass-card {
padding: 24px;
margin: 16px;
}
}
/* 桌面样式 */
@media (min-width: 1024px) {
.glass-card {
padding: 32px;
margin: 24px;
}
}
2. 灵活的网格系统
css
/* 响应式网格 */
.responsive-grid {
display: grid;
gap: var(--spacing-md);
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
}
/* 移动端调整 */
@media (max-width: 768px) {
.responsive-grid {
grid-template-columns: 1fr;
gap: var(--spacing-sm);
}
}
3. 触摸友好的设计
css
/* 增大移动端触摸目标 */
@media (max-width: 768px) {
.glass-button {
min-height: 44px;
padding: 12px 20px;
}
.touch-target {
min-width: 44px;
min-height: 44px;
}
}
表单最佳实践
1. 清晰的标签和提示
html
<form class="glass-form">
<div class="form-group">
<label for="email" class="form-label required">
邮箱地址
<span class="required-indicator" aria-label="必填项">*</span>
</label>
<input
type="email"
id="email"
class="glass-input"
placeholder="example@email.com"
aria-describedby="email-help email-error"
required
>
<div id="email-help" class="help-text">
我们不会与第三方分享您的邮箱
</div>
<div id="email-error" class="error-text" aria-live="polite">
<!-- 错误信息将在这里显示 -->
</div>
</div>
</form>
2. 实时验证反馈
javascript
class FormValidator {
constructor(form) {
this.form = form;
this.initValidation();
}
initValidation() {
const inputs = this.form.querySelectorAll('.glass-input');
inputs.forEach(input => {
input.addEventListener('blur', (e) => this.validateField(e.target));
input.addEventListener('input', (e) => this.clearErrors(e.target));
});
}
validateField(field) {
const errorElement = document.getElementById(field.getAttribute('aria-describedby').split(' ')[1]);
if (!field.validity.valid) {
field.classList.add('error');
errorElement.textContent = this.getErrorMessage(field);
} else {
field.classList.remove('error');
errorElement.textContent = '';
}
}
clearErrors(field) {
field.classList.remove('error');
}
getErrorMessage(field) {
if (field.validity.valueMissing) {
return '此字段为必填项';
}
if (field.validity.typeMismatch) {
return '请输入有效的格式';
}
if (field.validity.tooShort) {
return `至少需要 ${field.minLength} 个字符`;
}
return '输入格式不正确';
}
}
// 使用
document.addEventListener('DOMContentLoaded', () => {
const forms = document.querySelectorAll('.glass-form');
forms.forEach(form => new FormValidator(form));
});
动画和交互
1. 有意义的微交互
css
/* 按钮点击反馈 */
.glass-button {
transition: all 0.2s ease;
}
.glass-button:active {
transform: translateY(1px) scale(0.98);
}
/* 输入框聚焦动画 */
.glass-input {
transition: all 0.3s ease;
}
.glass-input:focus {
transform: translateY(-1px);
box-shadow:
0 0 0 3px rgba(74, 144, 226, 0.2),
0 8px 25px rgba(0, 0, 0, 0.15);
}
2. 过渡状态指示
html
<!-- 加载状态 -->
<button class="glass-button primary loading" disabled>
<span class="glass-loader spinner small">
<div class="spinner-ring"></div>
</span>
处理中...
</button>
<!-- 成功状态 -->
<button class="glass-button success">
✓ 已保存
</button>
3. 尊重用户偏好
css
/* 尊重用户的动画偏好 */
@media (prefers-reduced-motion: reduce) {
*,
*::before,
*::after {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
scroll-behavior: auto !important;
}
}
错误处理
1. 优雅的错误状态
html
<div class="error-container glass-container">
<div class="error-icon">⚠️</div>
<h3 class="error-title">出现了问题</h3>
<p class="error-message">
无法加载内容,请检查网络连接后重试。
</p>
<div class="error-actions">
<button class="glass-button" onclick="window.location.reload()">
重新加载
</button>
<button class="glass-button primary" onclick="history.back()">
返回上一页
</button>
</div>
</div>
2. 空状态设计
html
<div class="empty-state glass-container">
<div class="empty-icon">📭</div>
<h3 class="empty-title">暂无内容</h3>
<p class="empty-message">
您还没有添加任何项目。点击下方按钮开始吧!
</p>
<button class="glass-button primary">
添加第一个项目
</button>
</div>
测试策略
1. 跨浏览器测试
javascript
// 检测浏览器支持
function checkBrowserSupport() {
const features = {
backdropFilter: CSS.supports('backdrop-filter', 'blur(10px)'),
cssGrid: CSS.supports('display', 'grid'),
flexbox: CSS.supports('display', 'flex'),
customProperties: CSS.supports('color', 'var(--test)')
};
return features;
}
// 根据支持情况应用样式
const support = checkBrowserSupport();
if (!support.backdropFilter) {
document.body.classList.add('no-backdrop-filter');
}
2. 性能监控
javascript
// 监控渲染性能
function monitorPerformance() {
if ('PerformanceObserver' in window) {
const observer = new PerformanceObserver((list) => {
for (const entry of list.getEntries()) {
if (entry.duration > 16) { // 超过一帧的时间
console.warn('Long task detected:', entry);
}
}
});
observer.observe({ entryTypes: ['longtask'] });
}
}
部署和维护
1. CSS优化
bash
# 使用构建工具优化CSS
npx postcss liquid-glass-ui.css --use autoprefixer cssnano --output liquid-glass-ui.min.css
2. 版本管理
html
<!-- 使用特定版本以确保稳定性 -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@1ing/liquid-glass-ui@1.0.1/liquid-glass-ui.min.css">
3. 监控使用情况
javascript
// 跟踪组件使用情况
function trackComponentUsage() {
const components = document.querySelectorAll('[class*="glass-"]');
const usage = {};
components.forEach(element => {
const classes = element.className.split(' ');
classes.forEach(className => {
if (className.startsWith('glass-')) {
usage[className] = (usage[className] || 0) + 1;
}
});
});
console.log('Component usage:', usage);
}
总结
遵循这些最佳实践将帮助您:
- 创建一致且专业的用户界面
- 确保良好的性能和可访问性
- 提供优秀的用户体验
- 简化维护和更新过程
记住,好的设计不仅仅是视觉上的美观,更重要的是功能性和用户体验。Liquid Glass UI 为您提供了强大的工具,但如何使用这些工具创造出色的产品,取决于您对这些最佳实践的理解和应用。