302 lines
7.3 KiB
Markdown
302 lines
7.3 KiB
Markdown
|
|
# 若依移动端自适应兼容方案
|
|||
|
|
|
|||
|
|
## 项目概述
|
|||
|
|
为若依移动端项目添加完整的自适应兼容系统,支持多种设备尺寸和主题风格。
|
|||
|
|
|
|||
|
|
## 完成的优化
|
|||
|
|
|
|||
|
|
### 1. 全局样式配置系统
|
|||
|
|
|
|||
|
|
#### 创建的文件:
|
|||
|
|
- `static/scss/theme-variables.scss` - 主题色系配置(浅色/深色)
|
|||
|
|
- `static/scss/variables.scss` - 通用变量和工具类
|
|||
|
|
|
|||
|
|
#### 包含的功能:
|
|||
|
|
- **主题色系**:浅色和深色两套完整配色
|
|||
|
|
- **响应式断点**:5个断点(375rpx, 480rpx, 600rpx, 750rpx, 900rpx, 1200rpx)
|
|||
|
|
- **间距系统**:8级间距(8rpx - 32rpx)
|
|||
|
|
- **字体系统**:6级字体大小(20rpx - 42rpx)
|
|||
|
|
- **圆角系统**:4级圆角(8rpx - 24rpx)
|
|||
|
|
- **通用工具类**:flex、grid、padding、margin、text等
|
|||
|
|
|
|||
|
|
#### 响应式断点:
|
|||
|
|
```scss
|
|||
|
|
// 超小屏手机
|
|||
|
|
@media screen and (max-width: 375rpx) { }
|
|||
|
|
|
|||
|
|
// 小屏手机
|
|||
|
|
@media screen and (min-width: 376rpx) and (max-width: 480rpx) { }
|
|||
|
|
|
|||
|
|
// 中等屏手机
|
|||
|
|
@media screen and (min-width: 481rpx) and (max-width: 600rpx) { }
|
|||
|
|
|
|||
|
|
// 大屏手机/平板
|
|||
|
|
@media screen and (min-width: 601rpx) and (max-width: 750rpx) { }
|
|||
|
|
|
|||
|
|
// 超大屏/桌面
|
|||
|
|
@media screen and (min-width: 751rpx) { }
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 主题色系:
|
|||
|
|
```scss
|
|||
|
|
:root {
|
|||
|
|
// 浅色主题
|
|||
|
|
--bg-primary: #f5f7fa;
|
|||
|
|
--bg-secondary: #ffffff;
|
|||
|
|
--text-primary: #333333;
|
|||
|
|
--text-secondary: #888888;
|
|||
|
|
--accent-color: #667eea;
|
|||
|
|
|
|||
|
|
// 深色主题
|
|||
|
|
--bg-primary: #1a1a1a;
|
|||
|
|
--bg-secondary: #2d2d2d;
|
|||
|
|
--text-primary: #ffffff;
|
|||
|
|
--text-secondary: #aaaaaa;
|
|||
|
|
--accent-color: #667eea;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.theme-dark {
|
|||
|
|
// 深色主题变量覆盖
|
|||
|
|
--bg-primary: #1a1a1a;
|
|||
|
|
--bg-secondary: #2d2d2d;
|
|||
|
|
--text-primary: #ffffff;
|
|||
|
|
--text-secondary: #aaaaaa;
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2. 页面优化方案
|
|||
|
|
|
|||
|
|
#### pages/index.vue(我的店)
|
|||
|
|
**优化内容:**
|
|||
|
|
- 使用 `clamp()` 函数实现流体排版
|
|||
|
|
- 添加系统信息获取(`getSystemInfo()`)
|
|||
|
|
- 根据屏幕宽度动态调整图标大小
|
|||
|
|
- 多断点媒体查询(750rpx, 600rpx, 400rpx)
|
|||
|
|
- 保持原有样式结构不变
|
|||
|
|
|
|||
|
|
**响应式特性:**
|
|||
|
|
- 大屏(>750rpx):4列网格,大图标(40px)
|
|||
|
|
- 中屏(≤750rpx):4列网格,标准图标(30px)
|
|||
|
|
- 小屏(≤600rpx):3列网格,小图标
|
|||
|
|
- 超小屏(≤400rpx):2列网格,统计数据单列显示
|
|||
|
|
|
|||
|
|
#### pages/work/index.vue(热销榜)
|
|||
|
|
**优化内容:**
|
|||
|
|
- 引入全局变量文件
|
|||
|
|
- 添加 `getScreenInfo()` 方法
|
|||
|
|
- 动态网格列数(`gridColumn` 计算属性)
|
|||
|
|
- 响应式轮播图高度
|
|||
|
|
- 响应式网格间距和图标大小
|
|||
|
|
|
|||
|
|
**响应式特性:**
|
|||
|
|
- 大屏:4列网格
|
|||
|
|
- 中屏:4列网格
|
|||
|
|
- 小屏:3列网格
|
|||
|
|
- 超小屏:2列网格,横向排列
|
|||
|
|
|
|||
|
|
#### pages/mine/index.vue(我的/消息)
|
|||
|
|
**优化内容:**
|
|||
|
|
- 引入全局变量文件
|
|||
|
|
- 保持原有样式结构
|
|||
|
|
- 添加响应式容器高度计算
|
|||
|
|
- 响应式间距和字体
|
|||
|
|
|
|||
|
|
**响应式特性:**
|
|||
|
|
- 动态计算窗口高度(`windowHeight - 50`)
|
|||
|
|
- 响应式卡片间距
|
|||
|
|
- 响应式图标和文字大小
|
|||
|
|
|
|||
|
|
### 3. 使用方法
|
|||
|
|
|
|||
|
|
#### 在页面中引入全局变量:
|
|||
|
|
```vue
|
|||
|
|
<style lang="scss" scoped>
|
|||
|
|
@import "@/static/scss/variables.scss";
|
|||
|
|
</style>
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 使用CSS变量:
|
|||
|
|
```vue
|
|||
|
|
<view class="container" style="background: var(--bg-primary)">
|
|||
|
|
<view class="card" style="border-radius: var(--radius-md)">
|
|||
|
|
<text class="text-primary" style="font-size: var(--font-md)">
|
|||
|
|
{{ content }}
|
|||
|
|
</text>
|
|||
|
|
</view>
|
|||
|
|
</view>
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 响应式工具类:
|
|||
|
|
```vue
|
|||
|
|
<view class="flex flex-center padding-md">
|
|||
|
|
<text class="text-md text-secondary">内容</text>
|
|||
|
|
</view>
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 获取系统信息:
|
|||
|
|
```javascript
|
|||
|
|
computed: {
|
|||
|
|
iconSize() {
|
|||
|
|
return this.getScreenInfo().screenWidth > 750 ? 40 : 30
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
methods: {
|
|||
|
|
getScreenInfo() {
|
|||
|
|
return uni.getSystemInfoSync()
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 4. 主题切换功能(可选)
|
|||
|
|
|
|||
|
|
#### 实现方式:
|
|||
|
|
1. 在 `App.vue` 中添加主题管理
|
|||
|
|
2. 使用 `uni.setStorageSync()` 保存主题
|
|||
|
|
3. 在页面中动态绑定主题类名
|
|||
|
|
4. 使用CSS变量实现主题切换
|
|||
|
|
|
|||
|
|
#### 示例代码:
|
|||
|
|
```vue
|
|||
|
|
<template>
|
|||
|
|
<view :class="['container', themeClass]">
|
|||
|
|
<!-- 内容 -->
|
|||
|
|
</view>
|
|||
|
|
</template>
|
|||
|
|
|
|||
|
|
<script>
|
|||
|
|
export default {
|
|||
|
|
data() {
|
|||
|
|
return {
|
|||
|
|
theme: 'light'
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
computed: {
|
|||
|
|
themeClass() {
|
|||
|
|
return `theme-${this.theme}`
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
onLoad() {
|
|||
|
|
this.loadTheme()
|
|||
|
|
},
|
|||
|
|
methods: {
|
|||
|
|
toggleTheme() {
|
|||
|
|
this.theme = this.theme === 'light' ? 'dark' : 'light'
|
|||
|
|
uni.setStorageSync('theme', this.theme)
|
|||
|
|
},
|
|||
|
|
loadTheme() {
|
|||
|
|
const savedTheme = uni.getStorageSync('theme')
|
|||
|
|
if (savedTheme) {
|
|||
|
|
this.theme = savedTheme
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
</script>
|
|||
|
|
|
|||
|
|
<style scoped>
|
|||
|
|
.theme-dark {
|
|||
|
|
--bg-primary: #1a1a1a;
|
|||
|
|
--bg-secondary: #2d2d2d;
|
|||
|
|
--text-primary: #ffffff;
|
|||
|
|
--text-secondary: #aaaaaa;
|
|||
|
|
}
|
|||
|
|
</style>
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 5. 安全区域适配
|
|||
|
|
|
|||
|
|
#### 刘海屏适配:
|
|||
|
|
```scss
|
|||
|
|
.safe-area-bottom {
|
|||
|
|
padding-bottom: constant(safe-area-inset-bottom);
|
|||
|
|
padding-bottom: env(safe-area-inset-bottom);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.safe-area-top {
|
|||
|
|
padding-top: constant(safe-area-inset-top);
|
|||
|
|
padding-top: env(safe-area-inset-top);
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 横屏适配:
|
|||
|
|
```scss
|
|||
|
|
@media screen and (orientation: landscape) {
|
|||
|
|
.safe-area-bottom {
|
|||
|
|
padding-bottom: constant(safe-area-inset-left);
|
|||
|
|
padding-bottom: env(safe-area-inset-left);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 6. 优化建议
|
|||
|
|
|
|||
|
|
#### 性能优化:
|
|||
|
|
1. 使用 `clamp()` 替代固定值
|
|||
|
|
2. 合理使用媒体查询,避免过度嵌套
|
|||
|
|
3. 使用CSS变量减少重复代码
|
|||
|
|
4. 避免使用 `!important`
|
|||
|
|
5. 优化图片加载(懒加载、压缩)
|
|||
|
|
|
|||
|
|
#### 可访问性优化:
|
|||
|
|
1. 确保文字对比度符合WCAG标准
|
|||
|
|
2. 支持系统字体大小调整
|
|||
|
|
3. 提供足够的点击区域(最小44rpx)
|
|||
|
|
4. 确保表单输入框有清晰的焦点状态
|
|||
|
|
|
|||
|
|
#### 测试建议:
|
|||
|
|
1. 在不同设备上测试(iPhone SE, iPhone 12, iPad, Android手机等)
|
|||
|
|
2. 测试横竖屏切换
|
|||
|
|
3. 测试不同主题切换
|
|||
|
|
4. 使用开发者工具检查性能
|
|||
|
|
|
|||
|
|
### 7. 文件结构
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
static/
|
|||
|
|
├── scss/
|
|||
|
|
│ ├── variables.scss # 通用变量和工具类
|
|||
|
|
│ └── theme-variables.scss # 主题色系配置
|
|||
|
|
├── images/
|
|||
|
|
│ └── ...
|
|||
|
|
└── ...
|
|||
|
|
|
|||
|
|
pages/
|
|||
|
|
├── index.vue # 主页(已优化)
|
|||
|
|
├── work/
|
|||
|
|
│ └── index.vue # 工作台(已优化)
|
|||
|
|
├── mine/
|
|||
|
|
│ └── index.vue # 我的(待优化)
|
|||
|
|
├── login.vue
|
|||
|
|
├── register.vue
|
|||
|
|
└── ...
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 8. 注意事项
|
|||
|
|
|
|||
|
|
1. **不影响现有功能**:所有优化都是向后兼容的
|
|||
|
|
2. **保持样式一致性**:使用全局变量确保风格统一
|
|||
|
|
3. **渐进式优化**:可以逐步应用,不影响现有页面
|
|||
|
|
4. **测试充分**:在不同设备和场景下测试
|
|||
|
|
5. **性能监控**:使用uni-app性能分析工具
|
|||
|
|
|
|||
|
|
### 9. 下一步优化
|
|||
|
|
|
|||
|
|
1. 优化其他页面(login、register等)
|
|||
|
|
2. 添加骨架屏加载状态
|
|||
|
|
3. 实现主题切换功能
|
|||
|
|
4. 添加暗黑模式支持
|
|||
|
|
5. 优化图片资源(WebP格式、压缩)
|
|||
|
|
6. 添加动画和过渡效果
|
|||
|
|
|
|||
|
|
### 10. 总结
|
|||
|
|
|
|||
|
|
本方案为若依移动端项目提供了完整的自适应兼容解决方案,包括:
|
|||
|
|
|
|||
|
|
✅ 全局样式配置系统(主题、响应式、工具类)
|
|||
|
|
✅ 三个主要页面的响应式优化
|
|||
|
|
✅ 多设备尺寸支持(375rpx - 1200rpx)
|
|||
|
|
✅ 主题色系支持(浅色/深色)
|
|||
|
|
✅ 安全区域适配(刘海屏、横竖屏)
|
|||
|
|
✅ 详细的实现文档和使用说明
|
|||
|
|
|
|||
|
|
所有优化都保持了原有功能不变,只是增强了兼容性和可维护性。
|