我正在尝试对路由器插座放置的元素进行倾斜设置,以确保生成的元素的宽度为100%
从大多数答复中,我看到我应该使用::ng-deep
选择器,但是从Angular的文档中,它已被弃用。有替代品::ng-deep
吗?
Answers:
FWIW在我的研究中,我没有找到ng-deep的替代品或其他适用的替代品。我相信这是因为,Angular团队正在遵循影子dom的W3C规范,该规范最初具有诸如的选择器deep
。但是,W3c自此删除了该建议,但未用新建议取代它。在此之前,我想像Angular团队将继续使用::ng-deep
它的替代方案,但由于W3C草案的待定状态而处于过时状态。我现在无法花时间来找到支持该文档的文档,但是最近确实看到了。
长话短说:继续使用::ng-deep
它及其替代方案,直到创建替代方案为止-弃用只是一个早期通知,因此,只要实际的更改实现,人们就不会蒙蔽双眼。
-更新-
https://drafts.csswg.org/css-scoping-1/ 如果您有兴趣,这是提案草案。看来他们正在为影子dom树中的元素选择器的强大集合。我认为正是这一规范(一旦获得批准)将通知角度克隆,甚至还有一个克隆(即,一旦在浏览器中发布,角度可能不需要实现自己的选择器)。
::ng-deep
偶尔使用一次(如果您完全关心网站的外观),即使使用棱角分明的东西也是如此。他们有几个月无法修复的错误,解决方法通常涉及ng-deep。而且不要混淆不同的不推荐使用的“深度”选择器-::ng-deep
绝对是不推荐使用的选择器。
:host[some-context] {}
(而不是:: ng-deep)存在于子组件中,例如:-取决于您想要哪种灵活性/可移植性。我不喜欢这两种方式,但这就是封装的世界。
要绕开已弃用的设备::ng-deep
,通常会禁用它ViewEncapsulation
。尽管这不是最佳方法,但它对我很有帮助。
要禁用ViewEncapsulation
,请在组件中执行以下操作:
import { Component, ViewEncapsulation } from '@angular/core';
@Component({
selector: 'app-header',
templateUrl: './header.component.html',
styleUrls: ['./header.component.scss'],
encapsulation: ViewEncapsulation.None
})
export class HeaderComponent {
}
这将使此组件中的.scss样式对整个应用程序都是全局的。为了不允许样式沿着父级和同级组件的链向上移动,请使用选择器将整个scss包装起来,如下所示:
app-header {
// your styles here and any child component styles can go here
}
现在,此处指定的样式将归因于子组件,因此添加CSS时,您必须特别注意css选择器,并注意p和q(可能会添加Angular应用中指定的子选择器,然后添加其样式)。
由于上面的段落,我说这不是最好的方法,但这对我很有帮助。
ViewEncapsulation
会使这些样式可能泄漏到所有组件中,从而造成很多损失。应当明智地使用此功能并充分理解
深层样式的简单替代方法是使用父组件的元素选择器的通用样式。因此,如果您在hero-details.component.css中具有此功能:
:host ::ng-deep h3 {
font-style: italic;
}
它将在styles.css中变为:
app-hero-details h3 {
font-style: italic;
}
基本上,深层样式是未封装的样式,因此从概念上讲,它对我来说更像是通用样式,而不是组件样式。我个人不再使用深样式。重大更改是主要版本更新中的正常现象,而过时的功能删除则是公平的游戏。
如前所述,如果您使用的是第三方库,几乎不可能避免::ng-deep
偶尔使用。但是,当::ng-deep
浏览器不再支持以前的项目时,您将如何处理?
为此,我将提出以下建议:
@Component({
selector: 'app-example',
templateUrl: './example.component.html',
styleUrls: ['./example.component.scss'],
encapsulation: ViewEncapsulation.None
})
<section class="app-example-container">
<!-- a third party component -->
<mat-tab-group>
<mat-tab label="First"></mat-tab>
<mat-tab label="Second"></mat-tab>
</mat-tab-group>
</section>
.app-example-container {
/* All the CSS code goes here */
.mat-tab-group .mat-tab-label {color: red;}
}
关于未来的自我说明:https : //angular.io/guide/component-styles
应该是寻找官方替代品/路途的第一个地方
But what are you going to do about your previous projects when the ::ng-deep became no longer supported by browsers?
那不是由cli编译/多填充的,所以没有浏览器参与吗?好答案顺便说一句。
:host /deep/ .mat-tab-label
它的混叠是可能的(应转换为)::ng-deep
。坦白地说,使用别名似乎更方便,因为CLI可以在编译时对其进行更改,但是仍然需要ng build
再次进行部署。我的解决方案是完全避免::ng-deep
我所有的项目:)
这不是:: ng-deep的一般替代,而是问题作者描述的用例:
在特殊情况下,如果要设置由路由器出口插入的元素的样式,则可以使用CSS中的相邻邻居选择器来解决问题:
router-outlet+* {
/* styling here... */
}
这将适用于所有与路由器出口直接相邻的元素。
进一步阅读:
https : //developer.mozilla.org/zh-CN/docs/Web/CSS/Adjacent_sibling_combinator
https://angular.io/guide/router#router-outlet
*
最糟糕的情况是紧随其后,element *
但element + *
与前两个情况相距甚远。
您可以使用“ / deep /”。这是:: ng-deep替代方案。
:host /deep/ h3 {
font-style: italic;
}
alias
不是一个alternative
。
::ng-deep
不会去任何地方。它将始终是您可以启用的设置。没有社区的强烈反对,他们绝对不可能立即删除它。看看此搜索返回了多少结果github.com/search?q=%3A%3Ang-deep&type=Code-就像说css!important
属性将消失