# MixVideo UI/UX 设计规范 ## 设计理念 ### 核心原则 1. **用户至上**: 以用户体验为中心的设计 2. **简洁高效**: 简洁的界面,高效的操作流程 3. **一致性**: 统一的视觉语言和交互模式 4. **可访问性**: 支持无障碍访问和多设备适配 5. **现代化**: 符合现代设计趋势的视觉风格 ### 设计目标 - **专业性**: 体现专业视频创作工具的品质 - **易用性**: 降低学习成本,提升操作效率 - **美观性**: 现代化的视觉设计,愉悦的用户体验 - **功能性**: 功能导向的界面布局和交互设计 ## 视觉设计系统 ### 颜色系统 ```css /* 主色调 - 现代蓝色系 */ :root { --primary-50: #eff6ff; --primary-100: #dbeafe; --primary-200: #bfdbfe; --primary-300: #93c5fd; --primary-400: #60a5fa; --primary-500: #3b82f6; /* 主品牌色 */ --primary-600: #2563eb; --primary-700: #1d4ed8; --primary-800: #1e40af; --primary-900: #1e3a8a; /* 中性色系 */ --gray-50: #f9fafb; --gray-100: #f3f4f6; --gray-200: #e5e7eb; --gray-300: #d1d5db; --gray-400: #9ca3af; --gray-500: #6b7280; --gray-600: #4b5563; --gray-700: #374151; --gray-800: #1f2937; --gray-900: #111827; /* 语义色彩 */ --success-500: #10b981; --warning-500: #f59e0b; --error-500: #ef4444; --info-500: #3b82f6; } ``` ### 颜色使用规范 - **主色**: 用于主要操作按钮、链接、重要状态指示 - **中性色**: 用于文本、边框、背景、次要元素 - **语义色**: 用于状态反馈、警告、错误、成功提示 ### 字体系统 ```css /* 字体族 */ font-family: { sans: ['Inter', '-apple-system', 'BlinkMacSystemFont', 'Segoe UI', 'Roboto', 'sans-serif'], mono: ['JetBrains Mono', 'Fira Code', 'Monaco', 'Consolas', 'monospace'] } /* 字体大小 */ fontSize: { xs: ['0.75rem', { lineHeight: '1rem' }], /* 12px */ sm: ['0.875rem', { lineHeight: '1.25rem' }], /* 14px */ base: ['1rem', { lineHeight: '1.5rem' }], /* 16px */ lg: ['1.125rem', { lineHeight: '1.75rem' }], /* 18px */ xl: ['1.25rem', { lineHeight: '1.75rem' }], /* 20px */ '2xl': ['1.5rem', { lineHeight: '2rem' }], /* 24px */ '3xl': ['1.875rem', { lineHeight: '2.25rem' }], /* 30px */ '4xl': ['2.25rem', { lineHeight: '2.5rem' }], /* 36px */ } ``` ### 字体使用规范 - **标题**: 使用较大字号,font-weight: 600-700 - **正文**: 使用base字号,font-weight: 400 - **说明文字**: 使用sm字号,颜色为gray-600 - **代码**: 使用mono字体族 ### 间距系统 ```css /* 基于8px网格的间距系统 */ spacing: { 0: '0px', 1: '0.25rem', /* 4px */ 2: '0.5rem', /* 8px */ 3: '0.75rem', /* 12px */ 4: '1rem', /* 16px */ 5: '1.25rem', /* 20px */ 6: '1.5rem', /* 24px */ 8: '2rem', /* 32px */ 10: '2.5rem', /* 40px */ 12: '3rem', /* 48px */ 16: '4rem', /* 64px */ 20: '5rem', /* 80px */ 24: '6rem', /* 96px */ } ``` ### 圆角系统 ```css borderRadius: { none: '0', sm: '0.125rem', /* 2px */ DEFAULT: '0.25rem', /* 4px */ md: '0.375rem', /* 6px */ lg: '0.5rem', /* 8px */ xl: '0.75rem', /* 12px */ '2xl': '1rem', /* 16px */ '3xl': '1.5rem', /* 24px */ full: '9999px', } ``` ### 阴影系统 ```css boxShadow: { xs: '0 1px 2px 0 rgb(0 0 0 / 0.05)', sm: '0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1)', DEFAULT: '0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1)', md: '0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1)', lg: '0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1)', xl: '0 25px 50px -12px rgb(0 0 0 / 0.25)', glow: '0 0 20px rgb(59 130 246 / 0.15)', } ``` ## 组件设计规范 ### 按钮设计 ```typescript // 按钮变体 const buttonVariants = { primary: 'bg-primary-600 text-white hover:bg-primary-700 focus:ring-primary-500', secondary: 'bg-gray-200 text-gray-900 hover:bg-gray-300 focus:ring-gray-500', outline: 'border border-gray-300 text-gray-700 hover:bg-gray-50 focus:ring-primary-500', ghost: 'text-gray-700 hover:bg-gray-100 focus:ring-gray-500', danger: 'bg-red-600 text-white hover:bg-red-700 focus:ring-red-500', }; // 按钮尺寸 const buttonSizes = { sm: 'px-3 py-1.5 text-sm', md: 'px-4 py-2 text-base', lg: 'px-6 py-3 text-lg', }; // 按钮状态 const buttonStates = { default: '', loading: 'opacity-75 cursor-not-allowed', disabled: 'opacity-50 cursor-not-allowed', }; ``` ### 输入框设计 ```typescript const inputStyles = { base: 'block w-full rounded-md border-gray-300 shadow-sm focus:border-primary-500 focus:ring-primary-500', error: 'border-red-300 text-red-900 placeholder-red-300 focus:border-red-500 focus:ring-red-500', disabled: 'bg-gray-50 text-gray-500 cursor-not-allowed', }; const inputSizes = { sm: 'px-3 py-1.5 text-sm', md: 'px-3 py-2 text-base', lg: 'px-4 py-3 text-lg', }; ``` ### 卡片设计 ```typescript const cardStyles = { base: 'bg-white rounded-lg shadow-sm border border-gray-200', hover: 'hover:shadow-md transition-shadow duration-200', interactive: 'cursor-pointer hover:shadow-lg transform hover:-translate-y-1 transition-all duration-200', selected: 'ring-2 ring-primary-500 border-primary-500', }; ``` ### 模态框设计 ```typescript const modalStyles = { overlay: 'fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center p-4 z-50', container: 'bg-white rounded-lg shadow-xl max-w-md w-full max-h-screen overflow-y-auto', header: 'px-6 py-4 border-b border-gray-200', body: 'px-6 py-4', footer: 'px-6 py-4 border-t border-gray-200 flex justify-end space-x-3', }; ``` ## 布局设计规范 ### 网格系统 ```css /* 12列网格系统 */ .grid-cols-12 { grid-template-columns: repeat(12, minmax(0, 1fr)); } .col-span-1 { grid-column: span 1 / span 1; } .col-span-2 { grid-column: span 2 / span 2; } /* ... */ .col-span-12 { grid-column: span 12 / span 12; } /* 响应式断点 */ @media (min-width: 640px) { /* sm */ } @media (min-width: 768px) { /* md */ } @media (min-width: 1024px) { /* lg */ } @media (min-width: 1280px) { /* xl */ } @media (min-width: 1536px) { /* 2xl */ } ``` ### 页面布局 ```typescript // 主布局结构 const layoutStructure = { header: 'h-16 bg-white border-b border-gray-200', sidebar: 'w-64 bg-gray-50 border-r border-gray-200', main: 'flex-1 overflow-auto', content: 'max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-6', }; // 侧边栏导航 const sidebarStyles = { nav: 'space-y-1 px-3 py-4', item: 'flex items-center px-3 py-2 text-sm font-medium rounded-md', active: 'bg-primary-100 text-primary-700', inactive: 'text-gray-600 hover:bg-gray-100 hover:text-gray-900', }; ``` ### 内容区域 ```typescript const contentStyles = { section: 'mb-8', sectionHeader: 'mb-4', sectionTitle: 'text-2xl font-bold text-gray-900', sectionDescription: 'text-gray-600 mt-1', card: 'bg-white rounded-lg shadow-sm border border-gray-200 p-6', }; ``` ## 交互设计规范 ### 动画系统 ```css /* 过渡动画 */ .transition-all { transition: all 0.2s ease-in-out; } .transition-colors { transition: color, background-color, border-color 0.2s ease-in-out; } .transition-transform { transition: transform 0.2s ease-in-out; } /* 进入动画 */ @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } } @keyframes slideUp { from { transform: translateY(10px); opacity: 0; } to { transform: translateY(0); opacity: 1; } } @keyframes scaleIn { from { transform: scale(0.95); opacity: 0; } to { transform: scale(1); opacity: 1; } } /* 加载动画 */ @keyframes spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } } @keyframes pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.5; } } ``` ### 交互状态 ```typescript const interactionStates = { hover: { button: 'hover:bg-opacity-90 hover:shadow-md', card: 'hover:shadow-lg hover:-translate-y-1', link: 'hover:text-primary-600 hover:underline', }, focus: { input: 'focus:ring-2 focus:ring-primary-500 focus:border-primary-500', button: 'focus:outline-none focus:ring-2 focus:ring-primary-500 focus:ring-offset-2', }, active: { button: 'active:transform active:scale-95', tab: 'bg-primary-100 text-primary-700 border-primary-500', }, disabled: { button: 'opacity-50 cursor-not-allowed', input: 'bg-gray-50 text-gray-500 cursor-not-allowed', }, }; ``` ### 反馈机制 ```typescript // 加载状态 const loadingStates = { spinner: 'animate-spin h-5 w-5 text-primary-600', skeleton: 'animate-pulse bg-gray-200 rounded', progress: 'bg-primary-600 h-2 rounded-full transition-all duration-300', }; // 状态指示 const statusIndicators = { success: 'bg-green-100 text-green-800 border border-green-200', warning: 'bg-yellow-100 text-yellow-800 border border-yellow-200', error: 'bg-red-100 text-red-800 border border-red-200', info: 'bg-blue-100 text-blue-800 border border-blue-200', }; // 通知样式 const notificationStyles = { container: 'fixed top-4 right-4 z-50 space-y-2', item: 'bg-white rounded-lg shadow-lg border p-4 max-w-sm', success: 'border-l-4 border-green-500', error: 'border-l-4 border-red-500', warning: 'border-l-4 border-yellow-500', info: 'border-l-4 border-blue-500', }; ``` ## 响应式设计规范 ### 断点系统 ```typescript const breakpoints = { sm: '640px', // 小屏幕手机 md: '768px', // 平板 lg: '1024px', // 小型桌面 xl: '1280px', // 桌面 '2xl': '1536px', // 大屏桌面 }; // 响应式设计原则 const responsiveRules = { mobile: { // 移动端优先 padding: 'px-4', fontSize: 'text-sm', spacing: 'space-y-4', }, tablet: { // 平板适配 padding: 'md:px-6', fontSize: 'md:text-base', spacing: 'md:space-y-6', }, desktop: { // 桌面适配 padding: 'lg:px-8', fontSize: 'lg:text-lg', spacing: 'lg:space-y-8', }, }; ``` ### 自适应布局 ```typescript // 网格自适应 const responsiveGrid = { mobile: 'grid-cols-1', tablet: 'md:grid-cols-2', desktop: 'lg:grid-cols-3 xl:grid-cols-4', }; // 侧边栏响应式 const responsiveSidebar = { mobile: 'hidden', // 移动端隐藏 tablet: 'md:block md:w-64', // 平板显示 desktop: 'lg:w-72', // 桌面加宽 }; ``` ## 无障碍设计规范 ### 键盘导航 ```typescript const keyboardNavigation = { focusable: 'focus:outline-none focus:ring-2 focus:ring-primary-500', skipLink: 'sr-only focus:not-sr-only focus:absolute focus:top-4 focus:left-4', tabIndex: { interactive: '0', nonInteractive: '-1', }, }; ``` ### 屏幕阅读器支持 ```typescript const screenReaderSupport = { srOnly: 'sr-only', // 仅屏幕阅读器可见 ariaLabel: 'aria-label', // 无障碍标签 ariaDescribedBy: 'aria-describedby', // 描述关联 role: 'role', // 元素角色 }; ``` ### 颜色对比度 ```typescript // 确保足够的颜色对比度 const contrastRatios = { normalText: '4.5:1', // 普通文本最小对比度 largeText: '3:1', // 大文本最小对比度 uiComponents: '3:1', // UI组件最小对比度 }; ``` ## 性能优化规范 ### 图片优化 ```typescript const imageOptimization = { formats: ['webp', 'avif', 'jpg', 'png'], sizes: { thumbnail: '150x150', small: '300x300', medium: '600x600', large: '1200x1200', }, lazy: 'loading="lazy"', responsive: 'sizes="(max-width: 768px) 100vw, (max-width: 1200px) 50vw, 33vw"', }; ``` ### 动画性能 ```css /* 使用transform和opacity进行动画 */ .animate-optimized { will-change: transform, opacity; transform: translateZ(0); /* 启用硬件加速 */ } /* 避免动画布局属性 */ .avoid-layout-animation { /* 避免动画这些属性:width, height, padding, margin, top, left */ } ``` ### 虚拟化列表 ```typescript // 大列表虚拟化 const virtualizationConfig = { itemHeight: 80, containerHeight: 600, overscan: 5, // 预渲染项目数 threshold: 100, // 启用虚拟化的最小项目数 }; ``` ## 设计审查清单 ### 视觉设计 - [ ] 是否符合品牌色彩规范 - [ ] 字体大小和层次是否清晰 - [ ] 间距是否遵循8px网格系统 - [ ] 阴影和圆角是否一致 - [ ] 图标风格是否统一 ### 交互设计 - [ ] 交互反馈是否及时明确 - [ ] 加载状态是否友好 - [ ] 错误提示是否清晰 - [ ] 操作流程是否简洁 - [ ] 快捷键是否合理 ### 响应式设计 - [ ] 移动端适配是否完整 - [ ] 平板端布局是否合理 - [ ] 桌面端是否充分利用空间 - [ ] 断点切换是否平滑 - [ ] 触摸目标是否足够大 ### 无障碍设计 - [ ] 颜色对比度是否符合标准 - [ ] 键盘导航是否完整 - [ ] 屏幕阅读器支持是否充分 - [ ] 焦点指示是否清晰 - [ ] 语义化标签是否正确 ### 性能优化 - [ ] 图片是否优化 - [ ] 动画是否流畅 - [ ] 大列表是否虚拟化 - [ ] 资源是否懒加载 - [ ] 关键渲染路径是否优化