Angular样式隔离(style isolation)及选择器(:host, :host-context, ::ng-deep)的使用

这篇具有很好参考价值的文章主要介绍了Angular样式隔离(style isolation)及选择器(:host, :host-context, ::ng-deep)的使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.Angular样式隔离

Angular样式隔离的好处最最要的一条就是CSS的可维护性。当没有样式隔离时,我们创建一个组件并添加样式后,可能会影响到其他的组件样式,而且很有可能查找不出问题所在。虽然我们可以想出办法来避免样式被覆盖,但是可能会引发CSS的可维护性问题。

Angular的视图封装(View Encapsulation)

在Angular中,组件的样式可以封装在组件的宿主元素中(host),这样它们就不会影响应用程序的其他部分。

视图封装模式:

1.ViewEncapsulation.ShadowDom: Angualr使用浏览器内置的Shadow Dom API将组件的视图封装在ShadowRoot中,用作组件的宿主元素,并以隔离的方式应用提供的样式(只对浏览器内置Shadow Dom支持时才起作用)。组件的样式只添加到Shadow Dom宿主中,确保它们只影响各自组件视图中的元素。

2.ViewEncapsulation.Emulated:使样式仅应用于组件的视图,不会影响应用程序中的其他元素,模拟Shadow Dom行为(默认的视图封装模式)。组件的样式被添加到文档的<head>中,使它们在整个应用程序中可用,但只影响它们各自组件模板中的元素。

3.ViewEncapsulation.None:不使用任何类型的视图封装,为组件指定的任何样式都是全局应用的,并且影响应用程序中的任何HTML元素。组建的样式被添加到文档的<head>中,使它们在整个应用程序中可用,所以时完全全局的,并影响文档中的任务匹配元素。

要想设置组件的视图封装模式,可以在组件装饰器中设置 encapsulation 选项。

为了更好的理解默认的视图封装(Emulated View Encapsulation)是如何起作用的,先贴上一段代码:

 1 @Component({
 2     selector: 'app-root',
 3     template: `
 4         <h2>Parent Component</h2>
 5         <app-child></app-child>
 6     `,
 7     styles: [
 8         `
 9           h2 {
10             background-color: lightskyblue;
11           }
12         `
13     ],
14     encapsulation: ViewEncapsulation.Emulated
15 })    
16 export class AppComponent implements OnInit {
17    
18     ...
19 }
 1 @Component({
 2     selector: 'app-child',
 3     template: `
 4        <h2>Child Component</h2>
 5     `,
 6     styles: [
 7         `
 8           h2 {
 9             background-color: aqua;
10           }
11         `
12     ],
13     encapsulation: ViewEncapsulation.Emulated
14 })    
15 export class ChildComponent implements OnInit {
16    
17     ...
18 }

以下是运行时的代码,

Angular样式隔离(style isolation)及选择器(:host, :host-context, ::ng-deep)的使用

 可以看到app-root自定义元素上添加了一个奇怪的属性:_nghost-jtq-c16属性;在根组件中的HTML元素有一个看起来很奇怪但不同的属性:_ngcontent-jtq-c16;app-child自定义元素上添加了另一个属性:_nghost-jtq-c17,以及组件内HTML元素有一个_ngcontent-jtq-c17属性。

因此,我们可以知道Angular样式隔离的基本原理:

1.在应用程序启动时(或在使用AOT构建时),每个组件都将具有附加到宿主元素的唯一属性,具体取决于组件的处理顺序:_nghost-jtq-c16, _nghost-jtq-c17。

2.除此之外,每个组件模板中的每个元素也将应用该特定组件独有的属性:_ngcontent-jtq-c16, _ngcontent-jtq-c17。

 Angular将这些样式应用到相应的独特属性上:

Angular样式隔离(style isolation)及选择器(:host, :host-context, ::ng-deep)的使用

Angular样式隔离(style isolation)及选择器(:host, :host-context, ::ng-deep)的使用

2.选择器(:host, :host-context, ::ng-deep)的使用

:host

每个组件都与一个和组件的选择器相匹配的元素相关联。呈现模板的这个元素称为宿主元素。:host 伪类选择器用于创建以宿主元素本身为目标的样式,而不是以宿主内部的元素为目标。

当我们想要为app-root组件本身添加样式(加一个边框),就需要用到 :host 伪类选择器,原因是所有与组件关联的样式(通过css文件或内联形式在组件装饰器中声明),通常作用于模板内的元素。

1 :host {
2     display: block;
3     border: 5px solid palegreen;
4 }

 

Angular样式隔离(style isolation)及选择器(:host, :host-context, ::ng-deep)的使用

 应用样式后,组件显示入下:Angular样式隔离(style isolation)及选择器(:host, :host-context, ::ng-deep)的使用

 :host与其他选择器组合使用

1 :host h2 {
2     color: red;
3 }

 

1 :host(.active) {
2   font-weight: bold;
3 }

 在:host()选择器中,括号内的条件决定了要设置样式的宿主元素(宿主元素具有active类)。

::ng-deep

将::ng-deep伪类应用于任何CSS规则会完全禁止视图封装规则;任何应用了::ng-deep的样式都会成为全局样式。为了将指定样式限定在当前组件以及后代,确保在::ng-deep之前包含:host选择器。如果在没有:host伪类选择器的情况下使用::ng-deep选择器,样式可能会渗入其他组件。

如果希望组件的样式级联到组件的所有子元素,而不是页面上的任务其他元素,我们可以通过将:host与::ng-deep选择器结合使用来实现:

1 :host ::ng-deep h2 {
2     color: red;
3 }

运行时生成如下样式:

1 <style>  
2 [_nghost-c0]  h2 {
3     color: red;
4 }
5 </style>

此样式将应用于app-root内所有h2元素。

这种选择器的组合很有用,当将样式应用到使用ng-content传递给模板的元素。

:host-context

根据宿主元素的祖先元素的某些条件,将样式应用于组件模板中的元素,这时:host-context会很有用。

注:只有宿主元素及其后代会受到样式影响,而不是祖先元素。

 1 @Component({
 2   selector: 'themeable-button',
 3   template: `
 4         <button class="btn btn-theme">Themeable Button</button>
 5   `,
 6   styles: [`
 7       :host-context(.red-theme) .btn-theme {
 8         background: red;
 9       }
10       :host-context(.blue-theme) .btn-theme {
11           background: blue;
12       }
13   `]
14 })
15 export class ThemeableButtonComponent {
16 
17 }

现在的样式是不起作用的;为了使样式生效,需要向该组件的任何父元素添加一个主题激活类。

1 <div class="blue-theme">
2     <themeable-button></themeable-button>
3 </div>

 文章来源地址https://www.toymoban.com/news/detail-807355.html

到了这里,关于Angular样式隔离(style isolation)及选择器(:host, :host-context, ::ng-deep)的使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Vue教程(五):样式绑定——class和style

    样式提前准备 绑定class样式——字符串写法 适用于: 样式的类名不确定,需要动态指定 html: js: 效果: 绑定class样式——数组写法 适用于: 要绑定的样式个数不确定,名字也不确定 html: js 效果: 绑定class样式——对象写法 适用于: 要绑定的样式个数确定,名字也确定,

    2024年02月12日
    浏览(38)
  • 前端导出表格 修改样式(xlsx-style)用法

            xlsx-style 修改样式的机制  就是选中哪一行,那一列或者哪一个  然后去修改  比如表格最左上角的一个格子 坐标是 (0, 0) 下标  也可以叫做  A1 选中之后   可以修改其样式  1. 下载依赖   首先下载依赖到项目 2. 引入到项目 3. 创建导出表格         为什么

    2024年02月13日
    浏览(51)
  • 实现 css 样式隔离的方法

    样式隔离是一种在 Web 开发中常用的技术,用于确保组件或模块之间的样式不会相互影响,从而提高代码的可维护性和可重用性 CSS Modules: CSS Modules 是一种将 CSS 文件转换成 JavaScript 模块的技术,其中每个 CSS 类都会被自动命名,从而避免了类名冲突。在使用 CSS Modules 时,每

    2024年02月21日
    浏览(41)
  • vue中style设置scoped后部分样式不生效

    因为用了elementUI的组件库,一个页面用到了el-dialog,需要改一下样式,但style中设置了scoped后样式并不生效。 因为vue的scoped为本组件的所有标签都打上了一个唯一attribute,样式生效时也带上了这唯一的attribute,但是本组件应用的所有子组件,除根标签以为其他都未打上这唯一

    2024年02月13日
    浏览(43)
  • vue 3 第二十七章:样式(动态class、动态style)

    在 Vue 中,我们可以使用动态绑定语法来动态地添加类名或样式。本章将介绍 Vue 3 中如何使用动态绑定语法来动态地添加类名或样式。 在 Vue 中,我们可以使用 :class 或 v-bind:class 指令来动态地添加类名。例如,下面的例子中,我们可以根据 isActive 的值动态地为元素添加 act

    2024年02月07日
    浏览(46)
  • 【ArcGIS Pro二次开发】(61):样式(Style)和符号(Symbol)

    在 ArcGIS Pro SDK 中,地图要素符号(Symbol)和符号样式(Style)是2个很重要的概念。 【Symbol】是用于表示地图上不同类型的要素(如点、线、面)的图形化表示。 在地图中,各种要素都需要通过符号来展示,符号通常包括颜色、线型、填充样式、大小等属性。在 ArcGIS Pro SDK

    2024年02月11日
    浏览(56)
  • 视频讲解vue2基础之style样式class类名绑定

    目录  style样式的动态绑定 class类名动态绑定 一:官方给出的写法 二:自创三元表达式写法  详细的视频讲解:002vue_样式的动态绑定_哔哩哔哩_bilibili 003vue_样式动态绑定(小案例)_哔哩哔哩_bilibili 详细的视频讲解:002vue_样式的动态绑定_哔哩哔哩_bilibili 003vue_样式动态绑定

    2023年04月15日
    浏览(50)
  • Angular: 样式绑定

    使用 ngClass 和 ngStyle 可以进行样式的绑定。 ngStyle 根据组件中的变量, isTextColorRed和fontSize的值来动态设置元素的颜色和字体大小 效果如下所示 效果如下所示 ngStyle: 用途:用于动态设置元素的内联样式。 语法:[ngStyle]=\\\"{\\\'property\\\': value}\\\",其中 property 是 CSS 样式属性,value 是

    2024年02月15日
    浏览(36)
  • CSS样式穿透技巧:利用scoped与deep实现前端组件样式隔离与穿透

    一、什么是scoped 在vue文件中的style标签上,有一个特殊的属性:scoped。 当一个style标签拥有scoped属性时,它的CSS样式就只能作用于当前的组件,通过该属性,可以使得组件之间的样式不互相污染。 二、scoped的原理 为组件实例生成一个唯一标识,给组件中的每个标签对应的d

    2024年04月10日
    浏览(53)
  • 纯前端导出,设置导出xlsx文件样式xlsx-js-style

    设置导出的表格样式,xlsx-js-style!真的绝绝子! 1.下载xlsx-js-style依赖 2.在main.js中挂载到vue原型上,方便使用  3.页面具体写法 参考:前端根据后端返回数据导出指定样式的表格(xlsx-js-style)_前端excel导出指定格式-CSDN博客

    2024年01月17日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包