Blazor 的 CSS 隔离是编译期自动为 .razor.css 文件中选择器添加唯一属性标识并注入对应 HTML 属性,实现组件级样式作用域;需同名同目录配对文件,支持 ::deep 透传和 :global() 全局声明。
Blazor 提供了原生的 CSS 隔离(CSS Isolation)机制,让每个组件拥有专属样式,避免全局污染和命名冲突。它不是靠 JS 或运行时封装,而是编译期自动处理:你写一个 .razor.css 文件,Blazor 就会为其中的选择器自动添加唯一属性标识,并在 HTML 中注入对应属性,实现真正的作用域隔离。
新建 Blazor 项目(.NET 5+)默认已支持。只需为组件(如 Counter.razor)创建同名、同目录的 Counter.razor.css 文件,B
lazor 就会自动识别并处理。
.razor.css(例如 NavMenu.razor → NavMenu.razor.css)project.styles.css
假设 Counter.razor 中有:
在 Counter.razor.css 中写:
.btn-primary { background: #007bff; }
.btn-primary:hover { opacity: 0.9; }
构建后,Blazor 会把它转成类似这样:
.btn-primary[b-1a2b3c4d] { background: #007bff; }
.btn-primary[b-1a2b3c4d]:hover { opacity: 0.9; }
同时给按钮加上属性:。这样样式就只作用于本组件内带该属性的元素。
默认隔离很严格,但有时你需要:
::deep 前缀(如 ::deep .child-element),可将样式“透传”到子组件渲染的 DOM 中.razor.css 中用 :global(.some-class),让该选择器不加属性前缀,变*局有效.text-center)放到 wwwroot/css/app.css,不走隔离流程打开浏览器开发者工具,能看到元素上多了类似 b-xyz123 的属性,对应生成的 scoped 样式。常见问题:
::deep 或提高选择器权重,或改用 :global()
bin/obj 目录后重建基本上就这些。CSS 隔离不复杂但容易忽略细节,配对正确、理解作用域边界,就能写出干净可维护的 Blazor UI。