::ng-deep的范围是什么?
What is the the scope of ::ng-deep?
我们的很多网站都是这样构造的:
- 组件
- 组件CSS
- 组件模板
- child分量
我们经常需要根据 parent 组件所在的 child 组件设置不同的样式。当然,这很烦人,但是当我们使用全局 CSS 因为我们可以简单地定位具有唯一 ID 和 class CSS 选择器的特定实例。
我们正尝试停止使用全局样式并将我们的 CSS 封装在每个组件中。这个问题是,据我所知,封装 angular CSS 将限定你的 CSS 以便它只适用于那个组件......这意味着它也不会适用于任何 child 个组件。
一个解决方案似乎是在我们的组件 CSS 中使用 ::ng-deep
选择器来定位 child。不过,这遇到了一些阻力,因为有人告诉我,这通常也会破坏封装,并可能影响网站不同组件中的其他部分。
这就是我感到困惑的地方。一些问题:
任何以 ::ng-deep
为目标的样式是否会被缩小范围以使其成为全局样式 application-wide?或者它只是 'global' 在那个 parent 组件中?
如果是前者,仍然使用 ::ng-deep 是否可行,但还要确保您使用额外的唯一 css 选择器,因此它仅适用于 child 您要定位的组件?
或者是否有更合适的方法向特定 child 组件实例添加样式?
::ng-deep
本身确实使样式全局化,但是当与 :host
结合使用时可能会满足您的需要,但正如@eldar 所暗示的 this link、::ng-deep
已弃用(已经有一段时间了)。
:ng-deep 是全局的。无论你把它放在哪里,它都适用于 all 个组件。不只是 children.
如果您使用 :host :ng-deep,那么它将从该组件开始工作(进入 children、grand children 等)。
使用 ng-deep 的主要问题是 Angular 中的样式是延迟加载的。因此,在某些情况下,您可以完美地查看网站,然后查看使用 ng-deep 的特定页面,然后您可以返回到之前正常但现在已损坏的页面,因为 ng-deep样式在站点范围内应用。 e.x。 https://tutorialsforangular.com/2020/04/13/the-dangers-of-ng-deep-bleeding/
一般来说,如果我需要根据放置的位置对 child 组件进行稍微不同的样式设置,那么我会为 child 创建一个输入变量,并设置 parent它,然后在 child 组件 HTML 的某处将其设为 class。然后 child 组件可以设置 class 它认为合适的样式,而您不必破坏封装。
我们的很多网站都是这样构造的:
- 组件
- 组件CSS
- 组件模板
- child分量
我们经常需要根据 parent 组件所在的 child 组件设置不同的样式。当然,这很烦人,但是当我们使用全局 CSS 因为我们可以简单地定位具有唯一 ID 和 class CSS 选择器的特定实例。
我们正尝试停止使用全局样式并将我们的 CSS 封装在每个组件中。这个问题是,据我所知,封装 angular CSS 将限定你的 CSS 以便它只适用于那个组件......这意味着它也不会适用于任何 child 个组件。
一个解决方案似乎是在我们的组件 CSS 中使用 ::ng-deep
选择器来定位 child。不过,这遇到了一些阻力,因为有人告诉我,这通常也会破坏封装,并可能影响网站不同组件中的其他部分。
这就是我感到困惑的地方。一些问题:
任何以 ::ng-deep
为目标的样式是否会被缩小范围以使其成为全局样式 application-wide?或者它只是 'global' 在那个 parent 组件中?
如果是前者,仍然使用 ::ng-deep 是否可行,但还要确保您使用额外的唯一 css 选择器,因此它仅适用于 child 您要定位的组件?
或者是否有更合适的方法向特定 child 组件实例添加样式?
::ng-deep
本身确实使样式全局化,但是当与 :host
结合使用时可能会满足您的需要,但正如@eldar 所暗示的 this link、::ng-deep
已弃用(已经有一段时间了)。
:ng-deep 是全局的。无论你把它放在哪里,它都适用于 all 个组件。不只是 children.
如果您使用 :host :ng-deep,那么它将从该组件开始工作(进入 children、grand children 等)。
使用 ng-deep 的主要问题是 Angular 中的样式是延迟加载的。因此,在某些情况下,您可以完美地查看网站,然后查看使用 ng-deep 的特定页面,然后您可以返回到之前正常但现在已损坏的页面,因为 ng-deep样式在站点范围内应用。 e.x。 https://tutorialsforangular.com/2020/04/13/the-dangers-of-ng-deep-bleeding/
一般来说,如果我需要根据放置的位置对 child 组件进行稍微不同的样式设置,那么我会为 child 创建一个输入变量,并设置 parent它,然后在 child 组件 HTML 的某处将其设为 class。然后 child 组件可以设置 class 它认为合适的样式,而您不必破坏封装。