【发布时间】:2017-04-26 16:42:28
【问题描述】:
我正在关注这个关于嵌入的教程https://scotch.io/tutorials/angular-2-transclusion-using-ng-content
但是没有提及如何设计最终替换 ng-content 的元素。
如果前面有 /deep/ 关键字,我似乎只能定位 css 中的那些元素,该关键字通常在定位嵌套组件时使用。它是否正确?
【问题讨论】:
我正在关注这个关于嵌入的教程https://scotch.io/tutorials/angular-2-transclusion-using-ng-content
但是没有提及如何设计最终替换 ng-content 的元素。
如果前面有 /deep/ 关键字,我似乎只能定位 css 中的那些元素,该关键字通常在定位嵌套组件时使用。它是否正确?
【问题讨论】:
更新
现在所有新浏览器都支持::slotted,并且可以与ViewEncapsulation.ShadowDom一起使用
https://developer.mozilla.org/en-US/docs/Web/CSS/::slotted
原创
::content xxx { ... } 或:host xxx { ... } 也可以。匀场不是很严格或准确。 AFAIK (>>> /deep/ old) ::ng-deep(由 SASS 支持)和空间目前也是如此。
【讨论】:
>>> 或 /deep/ 但它只适用于 :host xxx {...}
/deep/ 这样的 :host /deep/ xxx {...} 。是否需要开启某种设置?
::content。这适用于 Angular 模拟的“影子 DOM”(如果最近没有任何变化 - 不要密切关注 Angular - 检查 Angular 存储库中的 CHANGELOG.md)
<ng-content> 中的内容与组件隔离。它看不到组件的属性或样式。
如果您确实需要设置样式,有时您会这样做,您有两种选择:
您可以创建一个常规的 CSS 文件并像这样设置内容的样式。你几乎肯定在使用 shadow DOM polyfill。常规的 CSS 会看穿 polyfill 并设置元素的样式。假设您有一个应用程序侧边栏。你可以写:
app-sidebar p {
color:red;
}
如果您使用的是 ng-cli,那么您在 style.scss 中编写的任何规则都将是全局的。
如果您想使用 shadow DOM polyfill 并使用 Component 装饰器的 style 或 styleUrls 属性设置组件样式,请选择带有 :host 的元素,然后忽略带有 @ 的 shadow DOM polyfill 987654328@子选择器。
:host 将选择元素。/deep/ 将选择元素而不将模拟阴影 DOM 属性选择器添加到嵌套选择器中。 将它们放在一起,您可以选择嵌套在宿主组件元素中的所有元素,无论它们在哪里声明。
像这样:
:host /deep/ p {
color:red;
}
【讨论】:
The shadow-piercing descendant combinator is deprecated and support is being removed from major browsers and tools. As such we plan to drop support in Angular (for all 3 of /deep/, >>> and ::ng-deep). Until then ::ng-deep should be preferred for a broader compatibility with the tools.
这解决了我的问题
::ng-deep {
& > * {
// styles here
}
}
【讨论】:
作为上述答案的替代方案,您可以创建要应用于内容的指令,并使用该指令为内容添加样式。
【讨论】: