J'installe une application de base angular, et j'essaie d'injecter du CSS dans mes vues. Voici un exemple de l'un de mes composants:
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 { }
Maintenant, le fichier .css est demandé à mon serveur, et lorsque j'inspecte la source de la page, je peux voir qu'il a été ajouté à la tête. Mais quelque chose d'étrange se produit:
<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>
est généré à partir de ce fichier:
/* 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%;
}
}
Quelqu'un peut-il expliquer d'où vient la balise _ngcontent-mav, que signifie-t-elle et comment s'en débarrasser?
Je pense que c'est la raison pour laquelle mon style n'est pas appliqué à mes modèles.
Si vous avez besoin de plus d'informations sur la structure de l'application, veuillez consulter mon gitRepo , ou demandez et j'ajouterai le code à la question.
Merci pour l'aide.
update2
::slotted
Est désormais pris en charge par tous les nouveaux navigateurs et peut être utilisé avec `ViewEncapsulation.ShadowDom
https://developer.mozilla.org/en-US/docs/Web/CSS/::slotted
mise à jour
/deep/
Et >>>
Sont déconseillés. ::ng-deep
les remplace. ::-deep
Est également marqué comme obsolète dans la source et les documents, mais cela signifie qu'il sera également supprimé à terme.
Je pense que cela dépend de ce que le W3C propose pour le thème du DOM fantôme (comme https://tabatkins.github.io/specs/css-shadow-parts/ )
Il s'agit essentiellement d'une solution de contournement jusqu'à ce que tous les navigateurs prennent en charge que nativement et que ViewEncapsulation.Emulated
Puisse être entièrement supprimé.
::ng-deep
Est également pris en charge dans SASS (ou le sera, selon la mise en œuvre de SASS)
original
L'encapsulation de la vue aide à empêcher les styles de pénétrer dans ou hors des composants. L'encapsulation par défaut est ViewEncapsulation.Emulated
Où des classes comme _ngcontent-mav-x
Sont ajoutées aux balises des composants et les styles sont également réécrits pour ne s'appliquer qu'aux classes correspondantes.
Cela émule dans une certaine mesure le comportement par défaut du DOM fantôme.
Vous pouvez désactiver cette encapsulation en ajoutant encapsulation: ViewEncapsulation.None
Au décorateur @Component()
.
Une autre façon est les combinateurs CSS de perforation d'ombre récemment (ré) introduits >>>
, /deep/
Et ::shadow
. Ces combinateurs ont été introduits pour styliser le DOM d'ombre mais y sont déconseillés. Angular introduisez-les récemment jusqu'à ce que d'autres mécanismes comme les variables CSS soient implémentés. Voir aussi https://github.com/angular/angular/pull/756 ( https://github.com/angular/angular/blob/master/CHANGELOG.md#200-beta10-2016-03-17 )
>>>
Et /deep/
Sont équivalents et l'utilisation de ces combinateurs fait que les styles ignorent les classes auxiliaires ajoutées (_ngcontent-mav-x
)
* >>> my-component, /* same as */
* /deep/ my-component {
background-color: blue;
}
s'applique à toutes les balises my-component
, quelle que soit leur profondeur d'imbrication dans d'autres composants.
some-component::shadow * {
background-color: green;
}
s'applique à tous les éléments du modèle de some-component
, mais pas aux autres descendants.
Ils peuvent également être combinés
* /deep/ my-component::shadow div {
background-color: blue;
}
cela s'applique à tous les éléments div du modèle de tous les modèles my-component
, quelle que soit la profondeur my-component
imbriquée dans d'autres composants.
/deep/
, >>>
Et ::shadow
Ne peuvent être utilisés qu'avec
encapsulation: ViewEncapsulation.None
encapsulation: ViewEncapsulation.Emulated
encapsulation: ViewEncapsulation.Native
Lorsque le navigateur les prend en charge de manière native (Chrome ne fait qu'imprimer un avertissement dans la console qu'ils sont obsolètes) ouPour un exemple simple, voir aussi le Plunker de cette question https://stackoverflow.com/a/36226061/217408
Voir également cette présentation de ng-conf 2016 https://www.youtube.com/watch?v=J5Bvy4KhIs
Vous devriez essayer ceci,
import {ViewEncapsulation} from 'angular2/core';
@Component({
...
encapsulation: ViewEncapsulation.None,
...
})