Skip to content

最佳实践

本指南汇总了使用 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 为您提供了强大的工具,但如何使用这些工具创造出色的产品,取决于您对这些最佳实践的理解和应用。

Released under the MIT License.