uni.upx2px()是uniapp官方唯一推荐的rpx→px动态转换方式,它实时读取screenwidth并按px=rpx×screenwidth/750计算,确保跨平台和横竖屏准确;px→rpx需手动用rpx=px×750/screenwidth,设计稿宽度仅影响标注换算而非运行时,1rpx边框不可见是android渲染限制而非转换问题。

uni.upx2px() 是唯一推荐的 rpx→px 转换方式
它不是“可选方案”,而是 UniApp 官方在运行时动态计算的唯一可靠入口。因为 rpx 的实际像素值取决于设备当前屏幕宽度(screenWidth),而这个值在不同平台(小程序/H5/App)甚至横竖屏切换时都可能变化。uni.upx2px() 内部会实时读取 uni.getSystemInfoSync().screenWidth,再套用公式 px = rpx × screenWidth / 750,确保结果始终准确。
常见错误现象:
– 手动硬编码比例(比如直接写 100 * 0.5)导致 H5 端错乱(H5 下 1rpx = 1px)
– 在 onLaunch 里缓存一次 screenWidth 后反复使用,横屏后尺寸崩坏
– 用 uni.getSystemInfo() 异步获取,却在回调外就调用转换,拿到 undefined
- 必须在 DOM 渲染前、样式计算逻辑中同步调用,例如
onLoad或computed中 - 参数只接受数字或字符串数字,不支持带单位的字符串(如
"100rpx"会报错) - 返回值是整数(四舍五入),若需小数精度,得自己封装:
Math.round(uni.upx2px(100) * 100) / 100
px→rpx 没有官方 API,但有稳定可行的手动公式
UniApp 没提供 uni.px2upx() 这类反向 API,这不是遗漏,而是设计使然:rpx 是为布局适配服务的,绝大多数场景你根本不需要把 px “转回去”。真要转,唯一可靠的公式就是 rpx = px × 750 / screenWidth,其中 screenWidth 必须来自 uni.getSystemInfoSync()。
使用场景有限但真实存在:
– 动态设置 canvas 绘图坐标(canvas API 只认 px,但你想让它占满 375rpx 宽度)
– 第三方 UI 库(如 ECharts)传入的 px 尺寸需映射回 rpx 做响应式缩放
– 自定义滚动区域的 scroll-left 值需从 px 计算出对应 rpx 偏移
- 别用
uni.upx2px(100)/100算缩放比再倒推——这在 H5 端会得到 1,但 Android 真机可能是 0.8,误差放大后明显 - 避免在
mounted阶段一次性计算并缓存,应封装成函数每次调用,尤其注意监听resize事件(H5)或onWindowResize(App) - 示例:
const toRpx = (px) => px * 750 / uni.getSystemInfoSync().screenWidth;
设计稿基准宽度 ≠ 设备 screenWidht,别混淆这两个概念
很多开发者卡在“为什么按设计稿量的 100px,转出来不是 200rpx?”——问题出在误把设计稿宽度当成了设备物理宽度。rpx 的换算只和运行时设备的 screenWidth 有关,和你用 Sketch 画的是 750px 还是 375px 设计稿完全无关。
常见错误现象:
– 设计稿是 375px 宽,就以为 “1px = 2rpx”,全局替换,结果 H5 端所有尺寸翻倍
– 在 HBuilderX 设置里填了错误的“设计稿宽度”,导致自动转 rpx 功能失效(该配置仅影响代码提示和 CSS 编辑器预览)
- 正确做法:以设计师给的标注为准,直接套公式
rpx = 标注px × 750 / 设计稿宽度。例如:设计稿宽 750px,按钮宽 120px →120rpx;设计稿宽 375px,同个按钮宽 60px → 仍是120rpx - HBuilderX 的「语言服务配置」里填的“设计稿宽度”,只用于编辑器内自动提示转换,不影响运行时,切勿当成运行逻辑依据
1rpx 边框在部分 Android 机型上不可见,这不是转换问题,是渲染限制
这是最常被误认为“rpx 转换不准”的问题,其实和换算完全无关。Android WebView 对 sub-pixel 渲染支持差,1rpx 在某些设备上最终算出来是 0.8px,直接被舍弃不绘制。这不是 bug,是底层限制。
解决方案不是调换算公式,而是绕过它:
– 改用 border: 2rpx solid #eee(最低保障可见)
– 或用背景色模拟:background: linear-gradient(to right, #eee 50%, transparent 50%) 配合 background-size: 2rpx 100%
– 更彻底的:对 Android 单独处理,用条件编译 /* #ifdef APP-ANDROID */ border: 1px solid #eee; /* #endif */
记住:rpx 转换本身永远精准,但像素最终能否显示,取决于设备渲染引擎。别在转换函数里加 hack,那只会让逻辑更脆弱。










