Angular2 - 将[_ngcontent-mav-x]添加到样式中

时间:2016-03-25 16:52:09

标签: css typescript angular

我正在设置一个基本的角度应用,我试图为我的观点注入一些CSS。这是我的一个组件的示例:

import { Component } from 'angular2/core';
import { ROUTER_PROVIDERS, ROUTER_DIRECTIVES, RouteConfig } from 'angular2/router';

import { LandingComponent } from './landing.component';
import { PortfolioComponent } from './portfolio.component';

@Component({
    selector: 'portfolio-app',
    templateUrl: '/app/views/template.html',
    styleUrls: ['../app/styles/template.css'],
    directives: [ROUTER_DIRECTIVES],
    providers: [ROUTER_PROVIDERS]
})

@RouteConfig([
    { path: '/landing', name: 'Landing', component: LandingComponent, useAsDefault: true },
    { path: '/portfolio', name: 'Portfolio', component: PortfolioComponent }
])

export class AppComponent { }

现在从我的服务器请求.css文件,当我检查页面源时,我可以看到它被添加到头部。但有些奇怪的事情正在发生:

<style>@media (min-width: 768px) {


    .outer[_ngcontent-mav-3] {
        display: table;
        position: absolute;
        height: 100%;
        width: 100%;
    }
    .mainContainer[_ngcontent-mav-3] {
        display: table-cell;
        vertical-align: middle;
    }
    .appContainer[_ngcontent-mav-3] {
        width: 95%;
        border-radius: 50%;
    }
    .heightElement[_ngcontent-mav-3] {
        height: 0;
        padding-bottom: 100%;
    }
}</style>

从此文件生成:

/* Small devices (tablets, 768px and up) */

@media (min-width: 768px) {
    /* center the mainContainer */

    .outer {
        display: table;
        position: absolute;
        height: 100%;
        width: 100%;
    }
    .mainContainer {
        display: table-cell;
        vertical-align: middle;
    }
    .appContainer {
        width: 95%;
        border-radius: 50%;
    }
    .heightElement {
        height: 0;
        padding-bottom: 100%;
    }
}

有人可以解释_ngcontent-mav标签的来源,它代表什么以及如何摆脱它?

我认为这就是为什么我的风格没有应用到我的模板的原因。

如果您需要有关应用结构的更多信息,请查看我的gitRepo,或者询问,然后我会将问题添加到问题中。

感谢您的帮助。

2 个答案:

答案 0 :(得分:39)

<强> UPDATE2

所有新浏览器现在都支持

::slotted,并且可以与`ViewEncapsulation.ShadowDom

一起使用

https://developer.mozilla.org/en-US/docs/Web/CSS/::slotted

<强>更新

/deep/>>>已弃用。 ::ng-deep 会替换它们。 ::-deep在源和文档中也被标记为已弃用,但这意味着它最终也会被删除。

我认为这取决于W3C为影子DOM提供的内容(如https://tabatkins.github.io/specs/css-shadow-parts/

它基本上是一种解决方法,直到所有浏览器都支持本机,并且ViewEncapsulation.Emulated可以完全删除。

SASS也支持

::ng-deep(或者将取决于SASS实施)

<强>原始

查看封装有助于防止样式流入或流出组件。默认封装是ViewEncapsulation.Emulated,其中像_ngcontent-mav-x这样的类被添加到组件标记中,并且样式也被重写为仅适用于匹配的类。

这在某种程度上模拟了影子DOM的默认行为。

您可以停用此封装,将encapsulation: ViewEncapsulation.None添加到@Component()装饰器。

另一种方法是最近(重新)引入阴影穿刺CSS组合器>>>/deep/::shadow。引入这些组合器用于样式化阴影DOM,但在那里被弃用。 Angular最近介绍了它们,直到实现了CSS变量等其他机制。 另请参阅https://github.com/angular/angular/pull/7563https://github.com/angular/angular/blob/master/CHANGELOG.md#200-beta10-2016-03-17

>>>/deep/是等效的,使用此组合器会使样式忽略添加的辅助类(_ngcontent-mav-x

* >>> my-component, /* same as */
* /deep/ my-component {
  background-color: blue;
}

适用于所有my-component标记,无论它们嵌套在其他组件中的深度。

some-component::shadow * {
  background-color: green;
} 

适用于some-component模板中的所有元素,但不适用于其他后代。

他们也可以合并

* /deep/ my-component::shadow div {
  background-color: blue;
}

这适用于所有my-component模板的模板中的所有div元素,无论my-component嵌套在其他组件中有多深。

/deep/>>>::shadow只能与

一起使用
  • encapsulation: ViewEncapsulation.None
  • encapsulation: ViewEncapsulation.Emulated
  • encapsulation: ViewEncapsulation.Native当浏览器本机支持它们时(Chrome会在控制台中输出警告,但不推荐使用它们)或者 当浏览器没有原生支持影子DOM和 web_components polyfills已加载。

有关简单示例,请参阅此问题Plunker

中的https://stackoverflow.com/a/36226061/217408

另见ng-conf 2016 https://www.youtube.com/watch?v=J5Bvy4KhIs0

的演示文稿

答案 1 :(得分:17)

你应该试试这个,

import {ViewEncapsulation} from 'angular2/core';

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