h5端css中background-image的url()必须用url('/static/bg.png')或url('~@/static/bg.png')且图片须置于项目根目录/static下,否则404;因css不解析别名和相对路径,仅/static目录内容会被拷贝至dist。

直接说结论:H5端background-image里写url('./assets/bg.png')或url('@/static/bg.png')必然404,真正能跑通的只有url('/static/bg.png')或url('~@/static/bg.png'),且图片必须真实放在项目根目录的/static下——不是src/assets,也不是src/static。
为什么H5的CSS里url()总报404
CSS里的url()是纯字符串,webpack默认不处理它。你写url('./assets/bg.png'),构建后浏览器就真去请求/assets/bg.png,但这个路径根本没被拷贝进dist目录;写url('@/static/bg.png')也无效,因为@/别名只在<template></template>和<script></script>里由vue-loader解析,CSS解析器完全不认识。
-
url('../static/bg.png'):依赖CSS文件位置,打包后CSS可能被提取、重命名、挪动,路径关系立刻断裂 -
url('/static/bg.png'):可靠,前提是static/在项目根目录,且H5部署在根路径(如https://site.com/) -
url('~@/static/bg.png'):更稳,尤其部署在二级路径(如https://site.com/c/)时,会自动拼上publicPath
部署在二级路径(如/c/)时怎么写
如果你的H5部署在https://example.com/c/,光配url('/static/bg.png')会请求/static/bg.png(漏掉/c/),结果404。必须用url('~@/static/bg.png'),并确认两件事:
-
vue.config.js中publicPath设为'/c/'(结尾带斜杠) - 图片真实存于项目根目录的
/static,不是src/static - 打开浏览器Network面板,确认请求地址是
https://example.com/c/static/bg.png
动态拼接背景图路径(比如按主题切换)
别在CSS里硬写url('/static/themes/'+menu+'/bg.png')——这种字符串拼接在H5构建时不会被解析,运行时又没上下文,大概率变成/static/themes/undefined/bg.png。
- 改用
:style绑定内联样式::style="'background-image: url(~@/static/themes/'+ menu +'/bg.png)' - 确保
menu有初始值(比如data(){ return { menu: 'default' } }),避免首次渲染时menu为undefined - 如果
menu来自异步接口,加v-if="menu"控制渲染时机,否则微信小程序会尝试加载/pages/index/undefined
最易被忽略的一点:所有这些路径规则只对/static目录生效。把图放错位置(比如扔进src/assets),再怎么改写法都白搭——H5构建不会把它拷过去,小程序更不认识。











