Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Css 角度7:为什么类样式不应用于DOM组件?_Css_Angular_Sass - Fatal编程技术网

Css 角度7:为什么类样式不应用于DOM组件?

Css 角度7:为什么类样式不应用于DOM组件?,css,angular,sass,Css,Angular,Sass,我有一个包含Ng引导组件的组件账单 ngb选项卡集具有以下DOM元素: <ngb-tabset _ngcontent-c3="" class="content"> <!-- Tabset links--> <div class="tab-content"> <div _ngcontent-c3=""> <!-- Content --> </div> </div> </

我有一个包含Ng引导组件的组件账单

ngb选项卡集
具有以下DOM元素:

<ngb-tabset _ngcontent-c3="" class="content">
  <!-- Tabset links-->
  <div class="tab-content">
    <div _ngcontent-c3="">
      <!-- Content -->
    </div>
  </div>
</ngb-tabset>
CSS代码已正确编译,通常由导航器查看,但不会对项目产生影响

但是,如果我将其应用于组件外部的项,代码将正常工作

了解这种奇怪的行为吗?

方法1-在选项卡内容模板中设置样式类 隔离每个组件的CSS样式,防止父组件CSS影响子组件。本例中的首选解决方案是在选项卡内容模板定义中设置样式类。以下是一个例子:

<ngb-tabset>
  <ngb-tab title="Simple">
    <ng-template ngbTabContent>
      <div class="my-style-1">
        <p>Some content</p>
      </div>
    </ng-template>
  </ngb-tab>
  ...
</ngb-tabset>
请参见演示


方法2-使用::ng deep伪类选择器 另一种方法是对
NgbTabset
子组件的内容使用
::ng deep
阴影穿透后代组合器:

::ng-deep .tab-content {
  padding-right: 120px;
}
import { Component, ViewEncapsulation } from '@angular/core';

@Component({
  ...
  encapsulation: ViewEncapsulation.None
})
请参见演示


方法3-关闭视图封装 或者,可以关闭父组件的视图封装:

::ng-deep .tab-content {
  padding-right: 120px;
}
import { Component, ViewEncapsulation } from '@angular/core';

@Component({
  ...
  encapsulation: ViewEncapsulation.None
})

请参阅以获取演示。

Angular使用阴影DOM。这意味着它将DOM逻辑与其他元素分开。组件有自己的范围样式。它们的封装方式不应使样式全局生效。所以,如果你想改变ngb标签集的风格,你必须走出它的范围。这就是为什么需要使用ViewEncapsulation.None

在@Component decorator中使用ViewEncapsulation.None

@Component({
selector: ....,
encapsulation: ViewEncapsulation.None,
styles: [...])} 

而且,您还可以使用ng deep。但是您不应该使用ng deep,因为它将被弃用。请看这里-

我想我可能对方法2有一些看法,目前这种方法仍然有效,但angular团队不赞成这种方法@JamieRees-是的,
::ng deep
不受欢迎,但我同意关于该主题的结论:使用它,直到Angular指定可以使用什么。我使用方法3,它工作正常。方法1没有效果,可能是因为视图封装。@clem-方法1应该可以与视图封装一起工作,如中所示。