优先使用nvue页面并用image组件替代CSS背景,设置mode="aspectFill"、width="750rpx"、height="100%"、z-index="-1",配合@2x/@3x图片资源,可避免拉伸、模糊与闪白问题。
App端(尤其是iOS)用 background-image 做全屏背景时,常见图片被强行拉伸、裁剪或留白——根本原因是 background-size 在原生渲染层(WebView / Weex / nvue)行为不一致,且 uni-app 默认未接管 viewport 缩放逻辑。
nvue 页面:只有 nvue 能真正控制原生层级的背景绘制,uni-app 的 vue 页面在 App 端本质是 WebView,受系统 WebKit 行为限制background-size: cover 在 iOS App 中可能失效,改用 background-size: 100% 100% + background-repeat: no-repeat 更可控(但需注意宽高比失真)<view class="bg">),并确保该元素 height: 100vh 且父级无 padding/margin 干扰upx 设置背景图尺寸——它在 App 端无法参与 background 渲染计算,一律用 rpx 或 %
nvue 虽支持原生背景,但直接设 background-image 仍可能因图片分辨率不足或缩放算法导致模糊,尤其在 iPhone X 及以后机型上。
static/ 下按命名规则放置:bg.png、[email protected]、[email protected]
image 组件替代 CSS 背景:设置 width: 750rpx、height: 100%、mode="aspectFill",再用 z-index: -1 置底scale-down 模式:nvue 的 mode="scaleToFill" 会强制拉伸,"aspectFill" 才等比缩放并裁剪,视觉更稳cover-image,注意它不支持圆角和阴影,且不能响应 click 事件,仅适合纯展示一套代码要同时跑 H5、小程序、App,背景图写法必须区分——H5 支持完整 CSS,App(尤其 nvue)只认子集,混写会导致 H5 正常、App 失效或报错。
#ifdef APP-PLUS 包裹 App 专属样式,#ifndef APP-PLUS 写 H5/小程序逻辑,别依赖运行时判断background-attachment: fixed —— nvue 不支持,vue 页面在 App 里也基本无效background: linear-gradient(...) 在 nvue 中不生效,只能用图片替代或改用 canvas 绘制background-image: url('data:...') 解析失败率高,统一转为 base64 文件引用或组件化图标冷启动时先看到白屏,几毫秒后背景才出现,核心是图片未预加载 + 渲染时机错位。
onLoad 前就触发图片加载:把背景图 URL 提前写死在 data 里,或用 uni.preloadImage 主动预载(仅 App 支持)background-color 占位色(如 #f5f5f5),避免白屏突兀;不要用透明色或 rgba(0,0,0,0)
<template> 顶层 <image>,别嵌套在 <scroll-view> 或 <list> 里——滚动容器会截断背景渲染renderMode: "native"(manifest.json 中):开启后部分 CSS 背景会被忽略,此时必须切到 image 方案最麻烦的其实是设计稿给的背景图没预留安全边距,状态栏和底部 home indicator 区域一裁就丢关键内容。这个得前端和设计师对齐,不是加个 padding 就能解决的。