/** * 顶部状态栏高度。 * * 全局 navigationStyle 为 custom,页面需自行避让状态栏。这里不能用 CSS 方案: * - env(safe-area-inset-top) 在 Android WebView 恒为 0(该值本是 iOS 刘海概念, * Chromium 仅在配置 display-cutout 时才上报); * - uni-app 注入的 --status-bar-height 在 App 端实测同样取不到值。 * 两者都会静默回落成 0,造成"看起来改了但没生效"。故统一读 uni 的系统信息 API, * 由各页面以内联样式绑定,行为跨端一致且可验证。 */ let cached: number | null = null; /** 状态栏高度(px);取不到时返回 0,H5 下即为 0。 */ export const statusBarHeight = (): number => { if (cached !== null) return cached; try { const info = uni.getSystemInfoSync?.(); const height = typeof info?.statusBarHeight === 'number' ? info.statusBarHeight : 0; cached = Number.isFinite(height) && height > 0 ? height : 0; } catch { cached = 0; } return cached; }; /** 状态栏避让内边距:状态栏高度 + 额外留白。 */ export const safeTopPadding = (extra = 0) => `${statusBarHeight() + extra}px`;