一 跨平台样式通用原则
使用 UniApp 推荐的样式方案
- 优先使用
rpx
单位(自动适配不同屏幕宽度,1rpx = 屏幕宽度 / 750),避免直接使用px
(固定像素,适配性差)。 - 推荐使用 Flex 布局(
display: flex
),各平台对 Flex 的支持最一致,尽量避免复杂的float
或position
布局。 - 样式文件统一使用
.vue
单文件中的<style>
标签或独立.css
文件,通过@import
导入(避免使用小程序的@import
路径限制)。
- 优先使用
2.避免平台不兼容的 CSS 特性
兼容特性 | 替代方案 |
---|---|
* 通配符选择器 |
用类选择器(.class )替代 |
伪元素(::before ) |
用额外的 view 标签模拟 |
复杂属性选择器([attr] ) |
改用类选择器 |
calc() 复杂计算 |
简化计算或通过 JS 动态设置样式 |
二、平台差异化样式处理
不同平台对 CSS 的支持存在差异,需通过 条件编译 或 平台专属目录 隔离样式
1. 条件编译隔离样式(推荐)
在同一个样式文件中,使用 UniApp 的条件编译语法(/* #ifdef */
)为不同平台编写专属样
/* 通用样式(所有平台生效) */
.container {
display: flex;
flex-direction: column;
padding: 20rpx;
}
/* 仅微信小程序生效 */
#ifdef MP-WEIXIN
.container {
background-color: #f5f5f5; /* 微信风格浅灰背景 */
}
.button {
border-radius: 8rpx; /* 微信按钮圆角较小 */
}
#endif
/* 仅支付宝小程序生效 */
#ifdef MP-ALIPAY
.container {
background-color: #fff; /* 支付宝风格纯白背景 */
}
.button {
border-radius: 16rpx; /* 支付宝按钮圆角较大 */
}
#endif
/* 仅 H5 生效(如微信公众号) */
#ifdef H5
.container {
max-width: 750px; /* H5 限制最大宽度,避免大屏拉伸 */
margin: 0 auto;
}
.button {
cursor: pointer; /* H5 显示鼠标指针 */
}
#endif
/* 仅 App 生效 */
#ifdef APP-PLUS
.container {
padding-top: 40rpx; /* App 状态栏适配 */
}
#endif
2. 平台专属目录(适合复杂样式)
当平台样式差异较大时,可在项目中创建 平台专属样式目录,存放对应平台的样式文件,打包时会自动优先加载。
src/
styles/
common.css // 通用样式
mp-weixin/ // 微信小程序专属样式
index.css
mp-alipay/ // 支付宝小程序专属样式
index.css
h5/ // H5 专属样式
index.css
在页面中导入时,通过条件编译加载对应平台的样式:
/* 导入通用样式 */
@import "@/styles/common.css";
/* 导入平台专属样式 */
#ifdef MP-WEIXIN
@import "@/styles/mp-weixin/index.css";
#elif MP-ALIPAY
@import "@/styles/mp-alipay/index.css";
#elif H5
@import "@/styles/h5/index.css";
#endif
三、常见平台样式差异及解决方案
平台 | 主要样式差异 | 解决方案 |
---|---|---|
微信小程序 | 不支持 * 通配符、部分伪类 |
用类选择器替代,避免复杂选择器 |
支付宝小程序 | 样式默认值不同(如按钮背景色) | 显式定义样式属性,覆盖默认值 |
H5 | 支持完整 CSS,但需适配浏览器兼容性 | 使用 autoprefixer 自动添加浏览器前缀 |
App(nvue) | 仅支持有限 CSS(如不支持 float ) |
使用 Flex 布局,遵循 weex 样式规范 |
抖音 / 小红书 | 对 rpx 计算方式略有差异 |
关键尺寸通过 uni.getSystemInfo 动态计算 |
四、样式优化技巧
减少样式冗余
- 提取通用样式到
common.css
,避免重复编写。 - 使用工具(如 PurgeCSS)移除未使用的样式,减小包体积。
- 提取通用样式到
动态样式适配
对于复杂的平台差异(如不同屏幕尺寸的字体大小),可通过 JS 动态计算并设置样式:onLoad() { // 获取设备信息 uni.getSystemInfo({ success: (res) => { // 根据平台设置不同字体大小 #ifdef MP-WEIXIN const fontSize = res.screenWidth > 375 ? '32rpx' : '28rpx'; #elif H5 const fontSize = res.screenWidth > 750 ? '18px' : '16px'; #endif this.setData({ dynamicFontSize: fontSize }); } }); }
在模板中使用:
<view :style="{ fontSize: dynamicFontSize }">动态字体</view>
3.使用 CSS 变量(H5/App 推荐)
在 H5 和 App 端,可通过 CSS 变量统一管理样式,方便动态修改:/* 定义变量 */ :root { --primary-color: #007aff; --font-size: 32rpx; } .text { color: var(--primary-color); font-size: var(--font-size); }
在 JS 中动态修改:
document.documentElement.style.setProperty('--primary-color', '#ff0000');
五、工具辅助
HBuilderX 样式提示
开启 HBuilderX 的 “样式自动补全” 功能,减少语法错误。
PostCSS 配置
在
postcss.config.js
中配置 autoprefixer,自动添加浏览器前缀(主要用于 H5 端):
module.exports = {
plugins: {
autoprefixer: {
overrideBrowserslist: ['last 2 versions', 'iOS >= 8', 'Android >= 4.4']
}
}
}
小程序样式校验
使用对应平台的开发者工具(如微信开发者工具)的 “样式检查” 功能,排查不兼容样式。
总结
UniApp 多端 CSS 处理的核心是:通用样式优先,差异样式通过条件编译隔离。开发时需熟悉各平台的样式限制,优先使用跨平台兼容的语法(如 Flex + rpx),并通过工具和动态计算弥补平台差异,确保各端样式表现一致。