const EPS = 1e-4 const BASE_DEVICE_WIDTH = 750 let isIOS = false let deviceWidth = 0 let deviceDPR = 0 function checkDeviceWidth () { const { platform, pixelRatio, windowWidth } = uni.getSystemInfoSync() deviceWidth = windowWidth deviceDPR = pixelRatio isIOS = platform === 'ios' } function checkValue (value, defaultValue) { value = Number(value) return isNaN(value) ? defaultValue : value } export function upx2px (number, newDeviceWidth) { if (deviceWidth === 0) { checkDeviceWidth() } number = Number(number) if (number === 0) { return 0 } const config = __uniConfig.globalStyle || __uniConfig.window || {} const maxWidth = checkValue(config.rpxCalcMaxDeviceWidth, 960) const baseWidth = checkValue(config.rpxCalcBaseDeviceWidth, 375) const includeWidth = checkValue(config.rpxCalcIncludeWidth, 750) let width = newDeviceWidth || deviceWidth width = number === includeWidth || width <= maxWidth ? width : baseWidth let result = (number / BASE_DEVICE_WIDTH) * width if (result < 0) { result = -result } result = Math.floor(result + EPS) if (result === 0) { if (deviceDPR === 1 || !isIOS) { result = 1 } else { result = 0.5 } } return number < 0 ? -result : result }