Skip to content

性能优化

概述

本文档描述了对 BiggerPicture lightbox 组件的优化改进,主要解决移动端关闭动画卡顿、闪烁和用户体验不一致的问题。

问题背景

原有问题

  1. 移动端关闭动画不一致:点击关闭按钮与滑动关闭使用不同的动画逻辑,导致体验不统一
  2. 动画卡顿:关闭时出现白屏/黑屏闪烁,动画不够流畅
  3. 文件结构复杂:样式文件分散在多个文件中,维护困难
  4. 时序问题:自定义动画与 BiggerPicture 内置动画冲突

影响范围

  • 移动端用户体验
  • Lightbox 关闭流畅度
  • 代码维护性

解决方案

1. 文件结构优化

之前的结构:

assets/scss/components/
├── _bigger-picture-custom.scss     # 主要自定义样式
└── _bigger-picture-close-fix.scss  # 关闭动画修复补丁

优化后的结构:

assets/scss/components/
└── _bigger-picture-custom.scss     # 统一的自定义样式文件

变更说明:

  • 删除了 _bigger-picture-close-fix.scss 文件
  • 将关闭动画优化代码合并到主文件中
  • 更新了 style.scss 中的导入声明

2. JavaScript 配置优化

关键改进:

// 优化动画时长,确保统一性
animationDuration: 280,  // 从 420ms 缩短到 280ms

// 使用更平滑的缓动函数
easing: 'cubic-bezier(0.25, 0.46, 0.45, 0.94)',

// 简化关闭处理 - 完全依赖 BiggerPicture 内置动画
onPreClose: () => {
  // 移除所有自定义动画处理,让 BiggerPicture 使用其内置的关闭动画
  // 这样可以确保点击关闭和滑动关闭使用相同的动画逻辑
},

// 移除关闭按钮的自定义事件处理
// 让 BiggerPicture 完全控制关闭行为

3. CSS 动画优化

主要改进:

  1. 统一关闭动画时序:
&.bp-closing {
  opacity: 0 !important;
  transform: scale(0.96) !important;
  -webkit-backdrop-filter: blur(0px) !important;
  backdrop-filter: blur(0px) !important;
  transition: opacity 0.18s cubic-bezier(0.25, 0.46, 0.45, 0.94),
              transform 0.18s cubic-bezier(0.25, 0.46, 0.45, 0.94),
              -webkit-backdrop-filter 0.15s ease-out,
              backdrop-filter 0.15s ease-out !important;
}
  1. 避免背景闪烁:
&:not(.bp-closing) {
  background: var(--lightbox-bg, rgba(255, 255, 255, 0.92)) !important;
}
  1. 移动端优化:
@media (max-width: 768px) {
  .bp-wrap {
    // 移动设备上减少模糊效果以提升性能
    &.bp-opened {
      -webkit-backdrop-filter: blur(4px);
      backdrop-filter: blur(4px);
    }
  }
}

技术实现细节

1. 动画时序统一

  • 所有关闭方式(点击关闭按钮、ESC 键、背景点击、滑动)现在都使用相同的动画逻辑
  • 移除了自定义的关闭事件处理,完全依赖 BiggerPicture 内置机制

2. 性能优化

  • 缩短动画时长:420ms → 280ms
  • 移动端减少模糊效果:8px → 4px
  • 使用硬件加速的 transform 属性

3. 响应式适配

  • 移动端隐藏导航箭头
  • 调整按钮大小和触摸区域
  • 优化图片说明文字位置

4. 主题支持

.dark-mode {
  :root {
    --lightbox-bg: rgba(0, 0, 0, 0.92);
  }

  .bp-wrap {
    &:not(.bp-closing) {
      background: rgba(0, 0, 0, 0.92) !important;
    }
  }
}

浏览器兼容性

支持的浏览器

  • Chrome 51+
  • Firefox 47+
  • Safari 9.1+
  • Edge 79+
  • iOS Safari 9.3+
  • Android Chrome 51+

兼容性处理

  1. Backdrop Filter:
  2. 使用 -webkit-backdrop-filter 前缀
  3. 提供 fallback 背景色

  4. CSS Variables:

  5. 所有现代浏览器都支持
  6. 提供 fallback 值

  7. Transform 3D:

  8. 启用硬件加速
  9. 广泛支持的属性

文件清单

修改的文件

  1. assets/scss/components/_bigger-picture-custom.scss
  2. 合并了关闭动画优化代码
  3. 添加了完整的注释和文档
  4. 优化了动画时序和缓动函数

  5. assets/scss/style.scss

  6. 移除了 _bigger-picture-close-fix 的导入

  7. assets/js/bigger-picture-manager.js

  8. 优化了动画配置参数
  9. 简化了关闭事件处理
  10. 移除了冲突的自定义动画逻辑

删除的文件

  1. assets/scss/components/_bigger-picture-close-fix.scss
  2. 内容已合并到主文件中
  3. 避免样式冲突和重复维护

测试建议

功能测试

  1. 关闭动画测试:
  2. 点击关闭按钮
  3. 按 ESC 键
  4. 点击背景
  5. 移动端向上滑动

  6. 响应式测试:

  7. 桌面端 (>768px)
  8. 平板端 (768px)
  9. 移动端 (<768px)

  10. 主题测试:

  11. Light mode
  12. Dark mode
  13. 主题切换时的动画

  14. 性能测试:

  15. 动画流畅度
  16. CPU 使用率
  17. 内存占用

浏览器测试

  • Chrome (最新版本)
  • Firefox (最新版本)
  • Safari (最新版本)
  • Edge (最新版本)
  • 移动端浏览器

维护注意事项

1. 样式修改

  • 所有 BiggerPicture 相关样式现在都在 _bigger-picture-custom.scss
  • 修改动画时要确保所有关闭方式的一致性
  • 注意 -webkit-backdrop-filterbackdrop-filter 的顺序

2. JavaScript 修改

  • 避免添加自定义的关闭事件处理
  • 保持与 BiggerPicture 内置机制的兼容性
  • 动画时长修改要同步更新 CSS

3. 性能考虑

  • 移动端减少复杂的模糊效果
  • 使用 transform 而不是改变 width/height
  • 避免在动画期间触发 reflow

版本历史

v2.0 (当前版本)

  • 合并样式文件
  • 优化关闭动画
  • 解决移动端卡顿问题
  • 统一用户体验

v1.0 (之前版本)

  • 基础 lightbox 功能
  • 分离的样式文件
  • 部分动画不一致问题