css 的 env() 函数仅用于读取系统安全区域(如 safe-area-inset-top),不支持项目环境变量;需通过构建工具或 css 变量在打包时注入环境配置。

CSS 里没有 env() 函数来“获取环境变量”,它和 process.env 或 import.meta.env 完全无关。你看到的 env(safe-area-inset-top) 是 CSS 原生函数,只用于读取系统 UI 安全区域(如 iPhone 刘海、安卓状态栏),不是用来注入项目环境配置的。
env() 函数只能读取系统安全区域,不能读取 .env 文件里的值
env() 是 CSS 标准定义的内置函数,浏览器原生支持,但它的参数是固定几个系统级标识符:safe-area-inset-top、safe-area-inset-right、safe-area-inset-bottom、safe-area-inset-left。它不接受任意字符串,也不能拼接、计算或从 JS 注入。
- ✅ 正确用法:
padding-top: env(safe-area-inset-top); - ❌ 错误用法:
background-image: url(env(VITE_API_BASE_URL));(语法错误,浏览器直接忽略) - ❌ 错误用法:
color: env('VUE_APP_THEME');(非法参数,无效)
试图用它替代构建时变量注入,会导致样式失效且无任何报错提示——浏览器只是静默跳过。
想在 CSS 中用项目环境变量?必须靠构建阶段处理
CSS 文件本身是静态资源,运行时无法访问构建环境。所有“在 CSS 中用环境变量”的实际方案,都发生在打包时(Webpack/Vite)或预处理时(Sass/Less):
- Less/Sass 用户:用
modifyVars或additionalData把process.env.VUE_APP_XXX注入为预处理器变量,再在.less里用@xxx - Vite + CSS-in-JS 或纯 CSS:在
main.ts中用document.documentElement.style.setProperty('--api-url', import.meta.env.VITE_API_BASE_URL),然后 CSS 里写content: var(--api-url) - React/Vue 入口 HTML:用
%REACT_APP_ENV%或%VUE_APP_SOURCE_BASE_URL%占位符,由构建工具替换后注入,再由 JS 读取并加载对应样式表
这些方式都绕不开一个事实:CSS 文件内容必须在构建完成前就确定下来,不存在“运行时查环境变量”这回事。
safe-area-inset 系列值不是“可配置的”,而是只读系统反馈
env(safe-area-inset-*) 的值完全由设备操作系统和浏览器决定,前端无法修改、覆盖或 fallback。它只在有物理遮挡(刘海、挖孔、虚拟导航栏)的设备上返回非零值,其他设备返回 0px。
- ⚠️ 注意:iOS Safari 11.0+、Chrome 69+、Firefox 62+ 支持,但旧版 Android WebView 基本不支持
- ⚠️ 不要把它当 CSS 变量用:它不能被
:root覆盖,也不能用var()引用(var(--safe-top)≠env(safe-area-inset-top)) - ✅ 推荐搭配
@supports (env(safe-area-inset-top))使用,避免在不支持设备上应用错误 padding
真正容易被忽略的是:很多人把 env() 和 var() 混为一谈,甚至以为能在 @import 或 url() 里动态拼接路径——这在任何浏览器中都不可能生效。系统级 env() 和项目级环境变量,属于完全不同的技术层级,强行混用只会让样式在构建或运行时悄悄丢失。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











