从宿主组件角度覆盖子组件样式的正确方法

时间:2019-01-23 13:52:21

标签: angular angular2viewencapsulation

从主机组件覆盖子组件样式的正确方法是什么。我尝试使用encapsulation: ViewEncapsulation.None,但是我需要在style.sass文件中而不是主机组件中写入替代内容。 stackblitz

应该是什么

2 个答案:

答案 0 :(得分:4)

如果您可以控制子组件代码,则可以定义customStyle输入属性:

@Input() customStyle: {};
<div class="child-div" [ngStyle]="customStyle">I am the child</div>

并从父组件传递它:

<app-child [customStyle]="style1"></app-child>
style1 = {
  backgroundColor: "red",
  height: "150px"
}

有关演示,请参见this stackblitz


类似的技术可以允许将特定的样式属性传递给子组件:

@Input() backgroundColor: string;
<div class="child-div" [style.background-color]="backgroundColor">I am the child</div>

来自父组件:

<app-child backgroundColor="red"></app-child>

有关演示,请参见this stackblitz


否则,在Angular提出其他方法之前,您可以使用::ng-deep shadow-piercing descendant combinator从父CSS修改子组件样式:

:host ::ng-deep .parent .child-div {
  background-color: lime;
  height: 200px;
}

有关演示,请参见this stackblitz

答案 1 :(得分:0)

我的“方法”使用viewEncapsulation.None,不重要,将类添加到子级。 forked stackblitz's Connors

//The parent
.child1 .child-div {
  background-color: lime!important;
  height: 200px!important;
}

<div style="text-align: center;" class='parent'>Hi I am the app-root and I contain child-comp!
<app-child class="child1"></app-child>
<app-child ></app-child>
</div>