Je suis nouveau dans Angular 4, alors quelqu'un pourrait-il expliquer comment et où l'utiliser ::ng-deep
dans Angular 4?
En fait, je veux écraser certaines des propriétés CSS des composants enfants des composants parents. De plus, est-il pris en charge sur IE11?
css
angular
angular-template
Jeyabalan Thavamani
la source
la source
/deep/
et::ng-deep
sont tous deux obsolètes, je vous suggère de consulter cette réponse stackoverflow.com/a/49308475/2275011 et de commenter pour plus de détails et de solutions.Réponses:
Généralement, le
/deep/ “shadow-piercing”
combinateur peut être utilisé pour forcer un style àchild components
. Ce sélecteur avait un alias >>> et en a maintenant un autre appelé :: ng-deep.depuis
/deep/ combinator
est obsolète, il est recommandé d'utiliser::ng-deep
Par exemple:
<div class="overview tab-pane" id="overview" role="tabpanel" [innerHTML]="project?.getContent( 'DETAILS')"></div>
et
css
.overview { ::ng-deep { p { &:last-child { margin-bottom: 0; } } } }
il sera appliqué aux composants enfants
la source
USAGE
::ng-deep
,>>>
et/deep/
désactivez l'encapsulation de vue pour des règles CSS spécifiques, en d'autres termes, cela vous donne accès aux éléments DOM, qui ne sont pas dans le HTML de votre composant. Par exemple, si vous utilisez Angular Material (ou toute autre bibliothèque tierce comme celle-ci), certains éléments générés sont en dehors de la zone de votre composant (comme la boîte de dialogue ) et vous ne pouvez pas accéder à ces éléments directement ou en utilisant un CSS standard façon. Si vous souhaitez modifier les styles de ces éléments, vous pouvez utiliser l'une de ces trois choses, par exemple:::ng-deep .mat-dialog { /* styles here */ }
Pour l' instant , l' équipe angulaire recommande de faire « profonds » manipulations uniquement avec émulé encapsulation vue.
DÉSAPPROBATION
Les manipulations "profondes" sont en fait obsolètes aussi, MAIS cela fonctionne toujours pour le moment, car Angular prend en charge le pré-traitement (ne vous précipitez pas pour refuser
::ng-deep
aujourd'hui, jetez d'abord un coup d'œil aux pratiques de dépréciation ).Quoi qu'il en soit, avant de suivre cette voie, je vous recommande de jeter un œil à la désactivation de l' approche d' encapsulation de vue (ce qui n'est pas non plus idéal, cela permet à vos styles de s'infiltrer dans d'autres composants), mais dans certains cas, c'est un meilleur moyen. Si vous avez décidé de désactiver l'encapsulation des vues, il est fortement recommandé d'utiliser des classes spécifiques pour éviter l'intersection des règles CSS, et enfin, éviter un désordre dans vos feuilles de style. Il est vraiment facile de désactiver directement dans le
.ts
fichier du composant :@Component({ selector: '', template: '', styles: [''], encapsulation: ViewEncapsulation.None // Use to disable CSS Encapsulation for this component })
Vous pouvez trouver plus d'informations sur l'encapsulation des vues dans cet article.
la source
ViewEncapsulation.None
! Cela causera beaucoup de dégâts en permettant à ces styles de s'infiltrer dans d'autres composants.Je voudrais souligner l'importance de limiter les
::ng-deep
aux seuls enfants d'un composant en exigeant que le parent soit une classe css encapsulée.Pour que cela fonctionne, il est important d'utiliser
::ng-deep
après le parent, pas avant sinon cela s'appliquerait à toutes les classes avec le même nom au moment où le composant est chargé.Composant css:
.my-component ::ng-deep .mat-checkbox-layout { background-color: aqua; }
Modèle de composant:
<h1 class="my-component"> <mat-checkbox ....></mat-checkbox> </h1>
CSS résultant (généré angulaire):
.my-component[_ngcontent-c1] .mat-checkbox-layout { background-color: aqua; }
ÉDITER:
Vous pouvez obtenir le même comportement en utilisant le
:host
mot - clé au lieu de créer une nouvelle classe css.:host ::ng-deep .mat-checkbox-layout
la source
my-component ::ng-deep...
vient de sauver ma journée. J'ai passé toute la journée à essayer d'appliquer un style à mon composant avec ng-deep et je remplaçais tous mes composants, de toute mon application.:host
mot-clé - a ajouté une note à la réponse pour plus de clarté.Assurez-vous de ne pas manquer l'explication
:host-context
qui se trouve directement au-dessus::ng-deep
dans le guide angulaire: https://angular.io/guide/component-styles . Avertissement: je l'ai manqué jusqu'à maintenant et j'aurais aimé le voir plus tôt.::ng-deep
est souvent nécessaire lorsque vous n'avez pas écrit le composant et n'avez pas accès à sa source, mais:host-context
peut être une option très utile lorsque vous le faites.Par exemple, j'ai un en-
<h1>
tête noir à l' intérieur d'un composant que j'ai conçu et je souhaite pouvoir le changer en blanc lorsqu'il est affiché sur un arrière-plan à thème sombre.Si je n'avais pas accès à la source, je devrai peut-être le faire dans le css pour le parent:
.theme-dark widget-box ::ng-deep h1 { color: white; }
Mais à la place,
:host-context
vous pouvez le faire à l' intérieur du composant.h1 { color: black; // default color :host-context(.theme-dark) & { color: white; // color for dark-theme } // OR set an attribute 'outside' with [attr.theme]="'dark'" :host-context([theme='dark']) & { color: white; // color for dark-theme } }
Cela cherchera n'importe où dans la chaîne de composants
.theme-dark
et appliquera le css au h1 s'il est trouvé. C'est une bonne alternative au fait de trop compter sur::ng-deep
ce qui, bien que souvent nécessaire, est en quelque sorte un anti-modèle.Dans ce cas, le
&
est remplacé par leh1
(c'est ainsi que sass / scss fonctionne) afin que vous puissiez définir votre css «normal» et thématique / alternatif juste à côté de l'autre, ce qui est très pratique.Veillez à obtenir le nombre correct de fichiers
:
. Car::ng-deep
il y en a deux et pour:host-context
un seul.la source
:host(.theme-dark)
si vous ne souhaitez héritertheme-dark
d'aucun composant parent. Cela dépendra entièrement de la conception css de votre site. De plus, les attributs peuvent être très utiles et peuvent être combinés de manière sophistiquée en css seul:host([theme='dark']:not([dayofweek='tuesday'))
.theme-light
classe, celui-ci est à son tour imbriqué dans un conteneur avec.theme-dark
il reprendratheme-dark
et appliquera le css. Mais c'est une excellente solution pour les classes de type 'modernizr', ou si vous avez un thème défini globalement et une seule fois.Juste une mise à jour:
Vous devriez utiliser
::ng-deep
au lieu de/deep/
qui semble être obsolète.Par documentation:
Vous pouvez le trouver ici
la source
Utilisez :: ng-deep avec précaution. Je l'ai utilisé tout au long de mon application pour définir la couleur de la barre d'outils de conception de matériaux sur différentes couleurs dans mon application uniquement pour constater que lorsque l'application testait les couleurs de la barre d'outils les unes sur les autres. Venez découvrir que c'est parce que ces styles deviennent globaux, voir cet article Voici une solution de code fonctionnelle qui ne se répand pas dans les autres composants.
<mat-toolbar #subbar> ... </mat-toolbar> export class BypartSubBarComponent implements AfterViewInit { @ViewChild('subbar', { static: false }) subbar: MatToolbar; constructor( private renderer: Renderer2) { } ngAfterViewInit() { this.renderer.setStyle( this.subbar._elementRef.nativeElement, 'backgroundColor', 'red'); } }
la source