La ViewEncapsulation
est un concept présent en Angular que nous utilisons dans toutes nos applications mais nous n'y faisons pas toujours attention.
Ah bon ! đČ
De quoi s'agit t-il ? đ€
En effet, la ViewEncapsulation
est la politique sur laquelle se base le framework Angular pour encapsuler le CSS présent dans nos composants. Il existe trois (03) types d'encapsulation CSS en Angular qui sont :
ViewEncapsulation.Emulated
ViewEncapsulation.None
ViewEncapsulation.ShadowDom
Avant d'aller plus loin, faisons un peu d'histoire đ
Qu'est-ce que l'encapsulation d'un composant web ?
L'encapsulation d'un composant web permet à ce composant de garder la structure de balisage, le style et le comportement cachés et séparés du reste de code de la page afin que les différentes parties n'entrent pas en conflit et que le code puisse rester agréable et propre.
Comment se fait l'encapsulation ?
L'encapsulation se fait grĂące aux APIs du Shadow DOM !
Le Shadow DOM est une notion venant des standards des Web Components, qui permettent dâencapsuler des parties du DOM, ainsi que des styles. Cela veut dire quâil est possible de limiter le champ dâaction dâun script ou dâun style Ă un Ă©lĂ©ment prĂ©cis. Il est alors possible dâappliquer des styles bien prĂ©cis Ă un seul nĆud du DOM, sans que tout le reste de lâapplication soit impactĂ©.En analogie avec un projet Angular, nous constatons que pour chaque composant crĂ©Ă©, nous avons au minimum :
un template HTML
du style CSS
une classe TS
qui sont trois (03) Ă©lements propres Ă ce composant.
Fin de l'histoire đ
La ViewEncapsulation
est donc implémentée en Angular pour faciliter le contÎle sur l'utilisation du Shadow DOM. Découvrons ensemble les trois (03) types d'encapsulation cités plus haut :
ViewEncapsulation.Emulated
: il permet d'ajouter un attribut spĂ©cifique Ă l'Ă©lĂ©ment hĂŽte du composant et en appliquant le mĂȘme attribut Ă tous les sĂ©lecteurs CSS fournis via les styles ou les styleUrls. Ici, le Shadow DOM n'est pas utilisĂ©. C'est l'encapsulation par dĂ©faut de Angular.
Dans cet exemple, _ngcontent-bpa-c51
est l'attribut spécifique.
ViewEncapsulation.None
: comme nous l'aurions deviné, ce mode d'encapsulation ne fournit aucune sorte d'encapsulation de style CSS, ce qui signifie que tous les styles fournis via styles ou styleUrls sont applicables à n'importe quel élément HTML de l'application, quel que soit leur composant hÎte. Il n'y a toujours pas l'utilisation du Shadow DOM.
Il faut faire trĂšs attention avec ce type d'encapsulation, car vous aurez des conflits entre les styles CSS de vos composants.
En gros, tous vos styles seront des styles globaux Ă votre application.
ViewEncapsulation.ShadowDom
: comme son nom l'indique, ce type d'encapsulation utilise l'API Shadow DOM native du navigateur pour encapsuler les styles CSS, ce qui signifie qu'il crée un ShadowRoot pour l'élément hÎte du composant, qui est ensuite utilisé pour encapsuler tous les styles du composant.
Dans cet exemple, on voit clairement le ShadowRoot qui est créé.
En somme, faisons bien attention au type d'encapsulation que nous choisirons par rapport à nos besoins. Il faut garder à l'esprit que par défaut c'est ViewEncapsulation.Emulated
qui est utilisé. Pour modifier le type d'encapsulation, il faut faire ceci par exemple :
import { Component, ViewEncapsulation } from '@angular/core';
@Component({
// ...
encapsulation: ViewEncapsulation.None,
})
export class HelloComponent {
// ...
}
Pour plus d'informations :
đ ViewEncapsulation Api CoređShadow DOM