Angular Shadow DOM 封装怎么用?

文章导读
Previous Quiz Next ViewEncapsulation.ShadowDom ShadowDom 模式将应用 HTML 原生的 shadow dom 概念来限定组件的样式范围。组件的元素在任何情况下都不会受到全局样式的干扰,因为它完全通过 shadowDO
📋 目录
  1. ViewEncapsulation.ShadowDom
  2. 示例 - ShadowDom 封装的使用
  3. 在应用程序中应用不同的封装
A A

Angular - ShadowDom 封装



Previous
Quiz
Next

ViewEncapsulation.ShadowDom

ShadowDom 模式将应用 HTML 原生的 shadow dom 概念来限定组件的样式范围。组件的元素在任何情况下都不会受到全局样式的干扰,因为它完全通过 shadowDOM 概念隐藏。

示例 - ShadowDom 封装的使用

让我们创建一个简单的组件来查看 ViewEncapsulation.None 模式是如何工作的。

步骤 1: 使用 cd 命令导航到项目文件夹。创建一个新组件并将其命名为 view-encapsulation-sample

ng generate component view-encapsulation-sample
CREATE src/app/view-encapsulation-sample/view-encapsulation-sample.spec.ts (675 bytes)
CREATE src/app/view-encapsulation-sample/view-encapsulation-sample.ts (271 bytes)
CREATE src/app/view-encapsulation-sample/view-encapsulation-sample.css (0 bytes)
CREATE src/app/view-encapsulation-sample/view-encapsulation-sample.html (41 bytes)

步骤 2: 现在,转到 view-encapsulation-sample.ts 文件。为组件添加 ViewEncapsulation.None 模式,如下所示 −

view-encapsulation-sample.ts

import { Component, ViewEncapsulation } from '@angular/core';

@Component({
   selector: 'app-view-encapsulation-sample',
   imports: [],
   templateUrl: './view-encapsulation-sample.html',
   styleUrl: './view-encapsulation-sample.css',
   encapsulation: ViewEncapsulation.None
})
export class ViewEncapsulationSample {

}

步骤 3: 修改模板 view-encapsulation-sample.html,添加两个容器,如下所示 −

view-encapsulation-sample.ts

<div>I am inside the none container</div>
<div class="mystyle">I am inside the none container and has my own style</div>

在这里,第一个容器没有任何样式或 class,更容易受到全局样式的干扰。第二个容器具有 class 属性,但仍然有可能受到全局样式的干扰。

步骤 4: 在组件 CSS 文件 view-encapsulation-sample.css 中应用样式,如下所示 −

view-encapsulation-sample.css

div.mystyle { color: brown }

步骤 5: 将组件添加到 app 组件和 app.html 中,如下所示 −

app.ts

import { Component, signal } from '@angular/core';
import { RouterOutlet } from '@angular/router';
import { ViewEncapsulationSample } from './view-encapsulation-sample/view-encapsulation-sample';

@Component({
   selector: 'app-root',
   imports: [RouterOutlet, ViewEncapsulationSample],
   templateUrl: './app.html',
   styleUrl: './app.css'
})
export class App {
   protected readonly title = signal('expense-manager');
}

app.html

<app-view-encapsulation-sample />
<router-outlet />

步骤 6: 在全局 CSS 资源 styles.css 中添加针对 div 标签的样式,并运行应用程序。

styles.css

div { color: blue }

输出

现在,运行应用程序并查看输出。

ShadowDOM ViewEncapsulation Mode

现在,两个容器都受到原生 shadowDOM 概念的保护,不受全局样式的干扰。

在应用程序中应用不同的封装

组件的 view encapsulation 可以与其他在应用程序中使用的组件不同,因为 view encapsulation 是按组件基础应用的。即使是嵌套组件也可以根据组件需求具有不同的 view encapsulation 选项。Angular 甚至在非常复杂的嵌套组件树中也会按照指示应用封装。