Blazor CSS 隔离

来源:https://learn.microsoft.com/zh-cn/aspnet/core/blazor/components/css-isolation?view=aspnetcore-8.0

CSS 隔离指将 CSS 范围限定到 Razor 组件,以简化 CSS 并避免与其他组件或库发生冲突。

若要定义组件特定的样式,请在相同文件夹中创建一个 .razor.css​ 文件,该文件与组件的 .razor​ 文件的名称相匹配。 .razor.css​ 文件是限定范围的 CSS 文件。

原理

Blazor的CSS隔离的原理,是在生成CSS静态资源Bundle时,在HTML元素上添加以b-​开头的十个随机字符的属性名,并在CSS中添加与组件属性匹配的属性选择器。

image

生成的CSS Bundle在<head>​ 标记中引用,以下 <link>​ 元素将添加到从 Blazor 项目模板创建的应用:

<link href="{ASSEMBLY NAME}.styles.css" rel="stylesheet">

{ASSEMBLY NAME}​ 占位符是项目的程序集名称。

应用到子组件

若要将父组件的CSS应用到子组件,需对父组件的.razor.css​ 文件中的后代元素使用 ::deep​伪元素选择器。

示例:

名为 Parent​ 的父组件:

@page "/parent"

<div>
    <h1>Parent component</h1>

    <Child />
</div>

名为 Child​ 的子组件:

<h1>Child Component</h1>

使用::deep​表示 h1​ 样式声明必须应用于父组件及其子组件。

::deep h1 { 
    color: red;
}

::deep​伪元素仅适用于后代元素。例如,删除div​元素将删除后代关系。 在下面的示例中,样式不应用于子组件。

<h1>Parent</h1>

<Child />

原理

默认情况下,属性选择器应用于最右侧的元素,例如:

div h1 {
    color: red;
}

将转换为:

div h1[b-1ka3goze5o] {
    color: red;
}

::deep​会影响属性选择器的位置,属性选择器将应用于::deep​所在的位置。例如:

::deep div h1 {
    color: red;
}

将转换为:

[b-1ka3goze5o] div h1 {
    color: red;
}
div ::deep h1 {
    color: red;
}

将转换为:

div[b-1ka3goze5o] h1 {
    color: red;
}

对于父组件:

<div>
    <h1>Parent component</h1>

    <Child />
</div>

将转换为:

<div b-1ka3goze5o>
    <h1 b-1ka3goze5o>Parent component</h1>

    <h1 b-tfw78d6ead>Child Component</h1>
</div>

如果删除div​元素,子组件不再是父组件的后代:

<h1>Parent</h1>

<Child />

将转换为:

<h1 b-1ka3goze5o>Parent component</h1>

<h1 b-tfw78d6ead>Child Component</h1>

父组件的CSS:

::deep h1 { 
    color: red;
}

将转换为:

[b-1ka3goze5o] h1 {
    color: red;
}

所以样式未应用到子组件。

posted @   星墨  阅读(9)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示