📜  ViewEncapsulation.Native、ViewEncapsulation.None 和 ViewEncapsulation.Emulated 之间的差异 (1)

📅  最后修改于: 2023-12-03 15:05:49.935000             🧑  作者: Mango

ViewEncapsulation.Native、ViewEncapsulation.None 和 ViewEncapsulation.Emulated之间的差异

Angular框架提供了三种不同类型的封装模式,可以用于对组件样式进行封装,这些封装模式分别是:ViewEncapsulation.NativeViewEncapsulation.NoneViewEncapsulation.Emulated

1. ViewEncapsulation.Emulated

这是默认的封装模式,与其他两种模式不同,它将组件中的样式放入到它专有的 Shadow DOM 中,并添加一个随机的属性选择器,以确保该样式只能应用于组件自身的 Shadow DOM 内部。

ViewEncapsulation.Emulated 通过模拟 Shadow DOM 模式来封装组件样式,但并不使用Shadow DOM。这就意味着,所有组件都可以使用该模式,并且与现有的浏览器良好兼容。

示例代码:

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

@Component({
  selector: 'app-example',
  template: `
    <div class="example">
      <p>Hello World!</p>
    </div>
  `,
  styles: [`
    .example {
      font-size: 20px;
      color: blue;
    }
  `],
  encapsulation: ViewEncapsulation.Emulated
})
export class ExampleComponent { }
2. ViewEncapsulation.None

如果你希望组件中的样式可以全局应用,即使它不在任何组件内部,就可以使用 ViewEncapsulation.None。这种模式完全取消了封装,使组件样式可以影响到全局。

示例代码:

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

@Component({
  selector: 'app-example',
  template: `
    <div class="example">
      <p>Hello World!</p>
    </div>
  `,
  styles: [`
    .example {
      font-size: 20px;
      color: blue;
    }
  `],
  encapsulation: ViewEncapsulation.None
})
export class ExampleComponent { }
3. ViewEncapsulation.Native

对于支持 Shadow DOM 的浏览器,ViewEncapsulation.Native 将使用原生的 Shadow DOM 技术在组件中封装样式。该模式可以保证组件样式只作用于组件内部,避免了全局污染,但需要考虑浏览器支持的问题。

示例代码:

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

@Component({
  selector: 'app-example',
  template: `
    <div class="example">
      <p>Hello World!</p>
    </div>
  `,
  styles: [`
    .example {
      font-size: 20px;
      color: blue;
    }
  `],
  encapsulation: ViewEncapsulation.Native
})
export class ExampleComponent { }
4. 总结

ViewEncapsulation.Emulated 是最常用的封装模式,它提供了一种有效的方式来保证组件样式的隔离,同时也能确保在大多数浏览器中正常工作。然而,对于一些需要更细粒度控制的情况,我们可以考虑使用ViewEncapsulation.Native或ViewEncapsulation.None。无论选择哪种模式,我们都需要谨慎考虑如何构建我们的应用程序,以确保我们的样式能够同时满足易用性和可维护性。