iis服务器助手广告
返回顶部
首页 > 资讯 > 精选 >angular如何进行样式隔离
  • 537
分享到

angular如何进行样式隔离

2023-07-05 00:07:35 537人浏览 八月长安
摘要

今天小编给大家分享一下angular如何进行样式隔离的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。angular 以组件为基

今天小编给大家分享一下angular如何进行样式隔离的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

angular 以组件为基本单位。我们编写一个一个的组件,再将这些组件组合为一颗组件树。但是在开发的过程中,经常需要在父组件中覆盖子组件的样式。比如现在我们有一个parent 组件和child 组件,child 组件里面有一个span,span 的字体为红色。

如下所示:

//child.componet.html<span class="child-span">child span</span>//child.component.sCSS.child-span {  color: red;}

如果现在,parent 组件想要child 组件中span 的内容变成绿色。可以使用如下的方式

//parent.component.scssapp-child {  ::ng-deep {    .child-span {      color: green;    }  }}

在parent 组件中,使用angular 提供的::ng-deep 关键字进行样式的覆盖。

现在我们修改一下child 组件的内容,在span 外面加上一层div,毕竟现实中的组件肯定不会只有一层这么简单。

//child.componet.html<div class="child-div">  <span class="child-span">child span</span></div>//child.component.scss.child-div {  .child-span {    color: red;  }}

这时候,我们会发现child 组件中span 的内容又变回了红色,之前parent 组件对其的覆盖并没有生效。

::ng-deep 为什么会失效呢?或者说,::ng-deep 会在什么时候有效?什么时候失效?更进一步说,angular 中组件和组件之间的样式隔离是怎么做到的呢?

css 选择器

css 中提供了元素选择器,id 选择器,class 选择器以及属性选择器

对于angular 的样式隔离的问题,比较重要的就是属性选择器。在属性选择器中,通过给元素添加任意一个属性,可以准确地选中这个元素。比如说,

a[target] {    background-color:yellow;}

通过上面的选择器,我们可以选中所有带有target属性的a元素。

另外一个是后代选择器

在css 中,后代选择器会选择指定元素的所有后代元素。比如,

[attr] span {    color: green;}

这个选择器会首先选中带有attr 属性的元素,然后选中这个元素的所有后代span 元素。

有了css 属性选择器后代选择器,就有了需要完成组件样式隔离的所有工具。angular 中组件的样式隔离与::ng-deep 完全基于这两个内容。

angular 样式隔离实现机制

我们现在回到之前的angular组件child 组件的内容为

//child.componet.html<span class="child-span">child span</span>//child.component.scss.child-span {  color: red;}

parent 组件的内容为

//parent.component.html<app-child></app-child>

上面两个组件经过angular 处理以后,生成的html 内容如下

angular如何进行样式隔离

可以看到,parent 组件上面多了_nGContent-mye-c13_nghost-mye-c12 两个属性,而child 组件上面多了_ngcontent-mye-c12_nghost-mye-c11 两个属性,child 组件下的span 标签,增加了_nghost-mye-c11 属性。

对于scss 文件,经过angular 的处理以后,在child 组件中的.child-span 类,变成了.child-span[_nghost-mye-c11]

angular如何进行样式隔离

通过这些内容我们就可以看出来angular 的样式隔离就是利用属性选择器完成的。

_nghost-mye-c11 这个属性只会出现在child 组件中。在child.component.scss 中的.child-span类变成了.child-span[_nghost-mye-c11],根据之前提到的属性选择器的机制,.child-span 只会对child 组件的内容生效。

如果在parent 组件内部也写一个.child-span类选择器,那么生成的类选择器就会是.child-span[_nghost-mye-c12]。而_nghost-mye-c12 这个属性是属于parent 组件的,于是这个.child-span 类只会对parent 组件的内容生效。并不会影响到child 组件,样式的隔离也就完成了。

::ng-deep

那为什么通过::ng-deep 可以在parent 组件里面,覆盖child 组件中的内容呢?

//parent.component.scssapp-child {  ::ng-deep {    .child-span {      color: green;    }  }}

上面的内容通过angular 处理以后,生成的内容为app-child[_nghost-mye-c12] .child_span。位于::ng-deep 后面的类,去掉了自动添加的属性,这时候根据css 的后代选择器机制。app-child[_nghost-mye-c12] .child_span会选中child 组件下面的所有带有.child_span 类的标签,而且根据优先级计算,app-child[_nghost-mye-c12] .child_span 高于child 组件生成的.child_span[_nghost-mye-c11] ,于是child 组件中的样式就被覆盖掉了。

那为什么有时候::ng-deep不能够覆盖掉呢?比如,当child 组件代码如下的时候

//child.componet.html<div class="child-div">  <span class="child-span">child span</span></div>//child.component.scss.child-div {  .child-span {    color: red;  }}

这时候即使我们发现child 组件中span 的颜色依旧是红色。

实际上原因也不复杂,检查angular 生成的样式文件后,我们可以发现,之所以没有把覆盖掉,纯粹是因为css 选择器优先级的问题。child 组件生成的样式.child-div[_nghost-mye-c11] .child-span[_nghost-mye-c11] 优先级高于parent 组件生成的样式app-child[_nghost-mye-c12] .child。于是,我们看到的效果就是parent 组件中的::ng-deep 没有生效,一种比较快捷的做法是直接在parent 组件的样式后面加上!important。但是由于!important 权重太高的原因,并不是很推荐。歪个楼,在发现angular ::ng-deep 失效的原因之前,很遗憾,项目之前很多地方的都有这种用法。

另一个方法就是,既然是因为优先级不够,那么提高parent 组件生成的样式的优先级就可以了。修改parent 组件的代码为

:host {  app-child {    ::ng-deep {      .child-div {        .child-span {          color: green;        }      }    }  }}

这时候,parent 组件生成的样式[_nghost-mye-c12] app-child[_nghost-mye-c12] .child-div .child-span 优先级高于child 组件生成的样式.child-div[_nghost-mye-c11] .child-span[_nghost-mye-c11] ,child 组件中span 的颜色也就变绿了。

这里我们使用了:host 关键字,接下来,我们简单看看它的作用。

:host

上个小结中,parent 组件生成的样式是[_nghost-mye-c12] app-child[_nghost-mye-c12] .child-div .child-span,如果去掉:host,就会发现,生成的样式变成了app-child[_nghost-mye-c12] .child-div .child-span。所以:host 关键字只是给生成的样式,加上了parent 组件属性字段而已。

那这个:host有什么用呢?

常见的作用有两个。

一个就是选择当前的组件标签,在angular 中,我们自定义的组件,比如这里的parent 组件app-parent 和child 组件app-child 最后都是会渲染到生成的html 文档上的。如果需要选中这些标签,就可以使用:host 关键字。

另一个作用还是隔离样式,将class 类写在:host 内部,这个类无论如何也是不可能泄漏到全局去的。实际上,通过前面的内容分析可以发现,不写在:host 里面,也不会泄漏到全局。但是如果出现了以下的情况

//some.component.scss::ng-deep {    .random-class {        xxxx    }}

这个类经过angular 处理以后,最后会变为

.random-class {    xxxx}

random-class 将会对全局造成影响。

但是如果把它包裹在:host 内部,哪怕使用了::ng-deep 关键字,最多也只会影响到这个组件的后代元素。所以在angular 官方文档中有下面的一段话。

Applying the ::ng-deep pseudo-class to any CSS rule completely disables view-encapsulation for that rule. Any style with ::ng-deep applied becomes a global style. In order to scope the specified style to the current component and all its descendants, be sure to include the :host selector before ::ng-deep. If the ::ng-deep combinator is used without the :host pseudo-class selector, the style can bleed into other components.

以上就是“angular如何进行样式隔离”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网精选频道。

--结束END--

本文标题: angular如何进行样式隔离

本文链接: https://www.lsjlt.com/news/348788.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • angular如何进行样式隔离
    今天小编给大家分享一下angular如何进行样式隔离的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。angular 以组件为基...
    99+
    2023-07-05
  • angular怎么进行样式隔离?实现机制详解
    总结我们首先介绍了css 的属性选择器和后代选择器。通过分析angular 生成的html 和css 代码,发现angular 的样式隔离功能,完全是基于这两个内容实现的。接下来,分析了::ng-deep 有时候生效,有时候有不生效的原因。...
    99+
    2023-05-14
    Angular
  • angular的样式隔离实现机制是什么
    本篇内容主要讲解“angular的样式隔离实现机制是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“angular的样式隔离实现机制是什么”吧!angular...
    99+
    2024-04-02
  • 微前端之 js隔离 样式隔离 元素隔离问题详解
    目录WebComponent 介绍js隔离问题解决方法一用 Proxy 代理方法二 用快照样式隔离问题方法一 样式增加不同前缀方法二 ShadawDom元素隔离WebComponen...
    99+
    2024-04-02
  • 如何进行MySQL 5.5 隔离级别的测试
    这篇文章将为大家详细讲解有关如何进行MySQL 5.5 隔离级别的测试,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。 REPEA...
    99+
    2024-04-02
  • 物理隔离与逻辑隔离如何鉴别
    辨别物理隔离与逻辑隔离的方法物理隔离是指指内部网不直接或间接地连接公共;而逻辑隔离是一种不同网络间的隔离部件,被隔离的两端仍然存在物理上的数据通道中。物理隔离为内部网划分了明确的安全边界,使得网络的可控性增强,便于内部管理;而逻辑隔离一般使...
    99+
    2024-04-02
  • 如何进行SAP Hybris和Netweaver的租户隔离机制设计
    今天就跟大家聊聊有关如何进行SAP Hybris和Netweaver的租户隔离机制设计,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。ABAP里的tenant isolation是通过...
    99+
    2023-06-04
  • 如何进行Tungsten Fabric与K8s集成及创建隔离命名空间
    本篇文章为大家展示了如何进行Tungsten Fabric与K8s集成及创建隔离命名空间,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。K8s与Tungsten Fabric集成后有四种配置模式,分别...
    99+
    2023-06-03
  • webpack如何对样式进行处理
    这篇文章主要介绍了webpack如何对样式进行处理,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。具体如下:我们可以在js中引入样式文件req...
    99+
    2024-04-02
  • Angular组件如何进行通信
    小编给大家分享一下Angular组件如何进行通信,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!准备一下我们的环境:1、创建一个h...
    99+
    2024-04-02
  • Angular项目中如何使用SASS样式
    这篇文章主要讲解了“Angular项目中如何使用SASS样式”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Angular项目中如何使用SASS样式”吧!在 ...
    99+
    2024-04-02
  • 云主机是如何隔离的
    云主机是通过虚拟化技术实现隔离的。下面是一些常见的隔离方法:1. 虚拟机隔离:云主机运行在虚拟机中,每个虚拟机都有自己的操作系统和资...
    99+
    2023-09-13
    云主机
  • 如何进行html div边框样式设置
    今天给大家介绍一下如何进行html div边框样式设置。文章的内容小编觉得不错,现在给大家分享一下,觉得有需要的朋友可以了解一下,希望对大家有所帮助,下面跟着小编的思路一起来阅读吧。 在html布局中详细...
    99+
    2024-04-02
  • 如何使用函数式编程对JavaScript进行断舍离
    这篇文章将为大家详细讲解有关如何使用函数式编程对JavaScript进行断舍离,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。关于DHTMLDHTML是Dynamic HT...
    99+
    2024-04-02
  • 如何修改mysql的隔离级别
    这篇文章给大家分享的是有关如何修改mysql的隔离级别的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。 修改mysql隔离级别的方法:1、找到“skip...
    99+
    2024-04-02
  • MySQL如何实现RC事务隔离
    这篇文章给大家分享的是有关MySQL如何实现RC事务隔离的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。ReadView机制基于undo log版本链条实现的一套读视图机制,事务生成一个ReadView:若为事务自...
    99+
    2023-06-29
  • Angular父子组件间如何进行通信
    小编给大家分享一下Angular父子组件间如何进行通信,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!组件通信组件是一个完整独立的...
    99+
    2024-04-02
  • Win10如何进行离线重装系统
    这篇文章主要介绍Win10如何进行离线重装系统,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!准备工具 装机大师软件一台正常使用的电脑温馨小提示:大家在使用离线重装系统的时候,记得要提前下载一个离线安装包,否则无法进行...
    99+
    2023-06-27
  • mysql如何查看事务隔离级别
    要查看MySQL数据库的当前事务隔离级别,可以执行以下命令: SELECT @@tx_isolation; 该命令将返回当前数据库...
    99+
    2024-04-17
    mysql
  • mysql如何修改事务隔离级别
    小编给大家分享一下mysql如何修改事务隔离级别,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!用户可以用SET TRANSACT...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作