J'ai un composant parent:
<parent></parent>
Et je veux remplir ce groupe avec des composants enfants:
<parent>
<child></child>
<child></child>
<child></child>
</parent>
Modèle parent:
<div class="parent">
<!-- Children goes here -->
<ng-content></ng-content>
</div>
Modèle enfant:
<div class="child">Test</div>
Puisque parent
et child
sont deux composants séparés, leurs styles sont verrouillés à leur propre portée.
Dans mon composant parent, j'ai essayé de faire:
.parent .child {
// Styles for child
}
Mais les .child
styles ne sont pas appliqués aux child
composants.
J'ai essayé d'utiliser styleUrls
pour inclure la parent
feuille de style de dans le child
composant pour résoudre le problème de portée:
// child.component.ts
styleUrls: [
'./parent.component.css',
'./child.component.css',
]
Mais cela n'a pas aidé, a également essayé dans l'autre sens en récupérant la child
feuille de style dans parent
mais cela n'a pas aidé non plus.
Alors, comment stylisez-vous les composants enfants qui sont inclus dans un composant parent?
css
angular
angular-components
Chrillewoodz
la source
la source
Réponses:
Mise à jour - Nouvelle façon
Ne le faites pas, si vous pouvez l'éviter. Comme le souligne Devon Sans dans les commentaires: Cette fonctionnalité sera très probablement obsolète.
Mise à jour - Nouvelle façon
À partir d' Angular 4.3.0 , tous les combinartors piercing css ont été déconseillés. L'équipe angulaire a introduit un nouveau combinateur
::ng-deep
(toujours au niveau expérimental et non pas de manière complète et finale) comme indiqué ci-dessous,DEMO: https://plnkr.co/edit/RBJIszu14o4svHLQt563?p=preview
À l'ancienne
Vous pouvez utiliser
encapsulation mode
et / oupiercing CSS combinators >>>, /deep/ and ::shadow
exemple de travail: http://plnkr.co/edit/1RBDGQ?p=preview
la source
::ng-deep
est désormais obsolète , je ne recommande pas de l'utiliser dans de futures applicationsMISE À JOUR 3:
::ng-deep
est également obsolète, ce qui signifie que vous ne devriez plus faire cela du tout. Il n'est pas clair comment cela affecte les choses où vous devez remplacer les styles dans les composants enfants à partir d'un composant parent. Pour moi, il semble étrange que cela soit complètement supprimé, car comment cela affecterait-il les choses en tant que bibliothèques où vous devez remplacer les styles dans un composant de bibliothèque?Commentez si vous avez une idée à ce sujet.
MISE À JOUR 2:
Depuis
/deep/
et tous les autres sélecteurs de perforation d'ombre sont désormais obsolètes. Angular drop::ng-deep
qui devrait être utilisé à la place pour une compatibilité plus large.METTRE À JOUR:
Si vous utilisez Angular-CLI, vous devez utiliser à la
/deep/
place de>>>
sinon, cela ne fonctionnera pas.ORIGINAL:
Après être allé sur la page Github d'Angular2 et faire une recherche aléatoire de "style", j'ai trouvé cette question: Angular 2 - style innerHTML
Qui a dit d'utiliser quelque chose qui a été ajouté
2.0.0-beta.10
, les sélecteurs>>>
et::shadow
.Donc, tout simplement:
Dans
parent
le fichier de feuille de style » résolu le problème. Veuillez noter, comme indiqué dans la citation ci-dessus, que cette solution n'est qu'intermédiaire jusqu'à ce que le style croisé plus avancé soit pris en charge.la source
Vous ne devez PAS l'utiliser
::ng-deep
, il est obsolète. Dans Angular, la bonne façon de changer le style du composant enfant du parent est d'utiliserencapsulation
(lisez l'avertissement ci-dessous pour comprendre les implications):Et puis, vous pourrez modifier la forme css de votre composant sans avoir besoin de :: ng-deep
AVERTISSEMENT: cette opération rendra toutes les règles CSS que vous écrivez pour ce composant globales.
Afin de limiter la portée de votre css à ce composant uniquement, ajoutez une classe css à la balise supérieure de votre composant et placez votre css "à l'intérieur" de cette balise:
Fichier SCSS:
la source
::ng-deep
. En général, les composants ont de toute façon leur propre sélecteur (<my-component>, <div my-component>
, etc.), il n'y a donc même pas besoin d'un élément wrapper avec une classe spéciale.Malheureusement, il semble que le sélecteur / deep / soit obsolète (au moins dans Chrome) https://www.chromestatus.com/features/6750456638341120
En bref, il semble qu'il n'y ait (actuellement) aucune solution à long terme autre que d'obtenir en quelque sorte votre composant enfant pour styliser les choses de manière dynamique.
Vous pouvez passer un objet de style à votre enfant et le faire appliquer via:
<div [attr.style]="styleobject">
Ou si vous avez un style spécifique, vous pouvez utiliser quelque chose comme:
<div [style.background-color]="colorvar">
Plus de discussion à ce sujet: https://github.com/angular/angular/issues/6511
la source
Nous avons eu le même problème, donc si vous utilisez angular2-cli avec scss / sass, utilisez '/ deep /' au lieu de '>>>', le dernier sélecteur n'est pas encore pris en charge (mais fonctionne très bien avec css).
la source
Si vous souhaitez être plus ciblé sur le composant enfant réel que vous devez le faire, procédez comme suit. De cette façon, si d'autres composants enfants partagent le même nom de classe, ils ne seront pas affectés.
Plunker: https://plnkr.co/edit/ooBRp3ROk6fbWPuToytO?p=preview
Par exemple:
J'espère que cela t'aides!
codematrix
la source
En fait, il y a une autre option. Ce qui est plutôt sûr. Vous pouvez utiliser ViewEncapsulation.None MAIS mettre tous vos styles de composants dans sa balise (aka sélecteur). Mais de toute façon, préférez toujours un style global et des styles encapsulés.
Voici l'exemple modifié de Denis Rybalka:
la source
Il existe quelques options pour y parvenir dans Angular:
1) Vous pouvez utiliser des sélecteurs CSS profonds
2) Vous pouvez également modifier l'encapsulation de la vue, elle est définie sur Emulated par défaut, mais peut être facilement remplacée par Native qui utilise l'implémentation native du navigateur Shadow DOM, dans votre cas, il vous suffit de la désactiver
Par exemple: `
la source
Vous ne devez pas écrire de règles CSS pour les éléments d'un composant enfant dans un composant parent, car un composant angulaire est une entité autonome qui doit déclarer explicitement ce qui est disponible pour le monde extérieur. Si la disposition des enfants change à l'avenir, vos styles pour ces éléments de composants enfants dispersés dans les fichiers SCSS des autres composants pourraient facilement se casser, rendant ainsi votre style très fragile. C'est à cela que
ViewEncapsulation
sert le CSS. Sinon, ce serait la même chose si vous pouviez attribuer des valeurs aux champs privés d'une classe de n'importe quelle autre classe en programmation orientée objet.Par conséquent, ce que vous devez faire est de définir un ensemble de classes que vous pourriez appliquer à l'élément hôte enfant et d'implémenter la façon dont l'enfant y répond.
Techniquement, cela pourrait se faire comme suit:
En d'autres termes, vous utilisez le
:host
pseudo-sélecteur fourni par Angular + ensemble de classes CSS pour définir les styles enfants possibles dans le composant enfant lui-même. Vous avez ensuite la possibilité de déclencher ces styles de l'extérieur en appliquant des classes prédéfinies à l'<child>
élément hôte.la source
parent.component.scss
lié au style du composant enfant. C'est le seul but de cette approche. Pourquoi as-tu besoinparent.component.scss
?ViewEncapsulation
juste parce que sa valeur par défaut est ce qui conduit à la question OP. Vous n'avez pas besoin d'attribuer un autreViewEncapsulation
pour que le code ci-dessus fonctionne.Je trouve beaucoup plus propre de passer une variable @INPUT si vous avez accès au code du composant enfant:
L'idée est que le parent indique à l'enfant quel doit être son état d'apparence et que l'enfant décide comment afficher l'état. C'est une belle architecture
SCSS Way:
Meilleure façon: - utilisez la
selected
variable:la source
À ce jour (Angular 9), Angular utilise un DOM Shadow pour afficher les composants en tant qu'éléments HTML personnalisés . Une manière élégante de styliser ces éléments personnalisés peut être d'utiliser des variables CSS personnalisées . Voici un exemple générique:
Comme nous pouvons le voir dans le code ci-dessus, nous créons un élément personnalisé, tout comme Angular le ferait pour nous avec chaque composant, puis nous remplaçons la variable responsable de la couleur d'arrière-plan dans la racine d'ombre de l'élément personnalisé, à partir de la portée globale .
Dans une application angulaire, cela pourrait ressembler à:
parent.component.scss
child-element.component.scss
la source
La réponse rapide est que vous ne devriez pas faire ça du tout. Il rompt l'encapsulation des composants et compromet les avantages que vous obtenez des composants autonomes. Pensez à passer un indicateur prop au composant enfant, il peut alors décider lui-même comment effectuer un rendu différent ou appliquer différents CSS, si nécessaire.
Angular déprécie toutes les façons d'affecter les styles d'enfants des parents.
https://angular.io/guide/component-styles#deprecated-deep--and-ng-deep
la source
j'ai également eu ce problème et je ne voulais pas utiliser une solution obsolète, donc je me suis retrouvé avec:
en parallèle
composant enfant
chez l'enfant en div html
et en code
fonctionne comme prévu et ne doit pas être déconseillé;)
la source
Au fur et à mesure des mises à jour sur Internet, je suis tombé sur une solution.
D'abord quelques mises en garde.
Tout d'abord, marquez l'encapsulation de votre composant enfant comme ombre afin qu'elle soit rendue dans le dom réel de l'ombre. Ensuite, ajoutez l'attribut de pièce à l'élément que vous souhaitez autoriser au parent à styliser. Dans la feuille de style des composants de votre parent, vous pouvez utiliser la méthode :: part () pour accéder
la source
Je propose un exemple pour le rendre plus clair, car angular.io/guide/component-styles déclare:
Le
app.component.scss
, importez votre*.scss
si nécessaire._colors.scss
a des valeurs de couleur communes:Appliquer une règle à tous les composants
Tous les boutons ayant de la
btn-red
classe seront stylisés.Appliquer une règle à un seul composant
Tous les boutons ayant une
btn-red
classe sur leapp-login
composant seront stylisés.la source
Je l'ai résolu en dehors d'Angular. J'ai défini un scss partagé que j'importe à mes enfants.
shared.scss
child.scss
L'approche que je propose est un moyen de résoudre le problème posé par le PO. Comme mentionné à plusieurs reprises, :: ng-deep,: ng-host sera déprécié et la désactivation de l'encapsulation est tout simplement trop une fuite de code, à mon avis.
la source