css - Delte stiler på tvers av komponenter i en Angular 2-app
Jeg har noen CSS-regler i Angular 2-appen min som vil være vanlige på tvers av ulike komponenter. Selvfølgelig vil jeg ikke kopiere og lime dem inn i hver komponents stiler. Jeg har for øyeblikket 2 ideer:
- Plasser vanlige CSS-regler i en statisk CSS-fil og inkluder den ved å bruke en lenke i
head-seksjonen i index.html-filen min. - Plasser mine vanlige CSS-regler i en eller flere filer og inkluder dem i
@Component-deklaratoren for hver komponent, f.eks.styleUrls: [ './myComponentStyle.css', '../common/common.css']
Første tilnærming ser ikke så kantete ut for meg, men samtidig er den sikker på å fungere og enkel å implementere.
Den andre krever at noe arbeid gjøres med hver komponent, men gir mer kontroll over hvilke stiler som brukes av en. Den lar meg også organisere mine vanlige stiler i mindre stilark og bruke bare de som trengs.
Foretrekker du noen av de løsningene, eller finnes det en tredje, bedre en? :)
Svar #1
1. Denne løsningen er god, men den er mer egnet for vanlige stiler, som bør være tilgjengelige for alle komponenter. For eksempel stiler for CSS-rutenett. For å gjøre det mer angular-aktig kunne du sette kapsling for app-komponenten din til ingen:
`@Component({
selector: 'my-app',
template: ` `,
styleUrls: ["shared.style.css"],
encapsulation: ViewEncapsulation.None
}) export class App {}`
Demoen kan finnes her (plunker)
Merk: Stiler som inkluderes på denne måten (bare ved å legge til stiltagg, eller uten innkapsling) vil påvirke alle elementer på sidene dine. Noen ganger er det det vi virkelig ønsker (avtale om å bruke hvilket som helst CSS-rammeverk for hullprosjekter). Men hvis du bare vil dele stiler mellom noen få komponenter - er det sannsynligvis ikke den beste måten.
Summary:
(+) easy to use
(-) no encapsulation
2. Jeg liker denne løsningen, fordi den er veldig forståelig og har forutsigbar oppførsel. Men det er ett problem med den:
Det vil legge til stil-taggen med dine delte stiler hver gang du bruker den. Det kan være et problem hvis du har stor stilfil, eller mange elementer som bruker den.
@Component({
selector: 'first',
template: `<h2> <ng-content> </ng-content> </h2>`,
styleUrls: ["shared.style.css"]
})
export class FirstComponent {}
Demoen kan finnes her (plunker)
Summary:
(+) easy to use
(+) encapsulation
(-) duplicates styles for every usage
3. Det er ett alternativ til du kan bruke. Bare lag en komponent til som vil gi delte stiler til dens barn.
` <styles-container>
<first> first comp </first>
</styles-container>
<styles-container>
<second> second comp </second>
</styles-container>`
I slike tilfeller må du bruke /deep/ i stilene dine for å gjøre stilen tilgjengelig for barnekomponenter:
:host /deep/ h2 {
color: red;
}
Det er også verdt å nevne å ikke glemme å bruke :host for å gjøre stiler tilgjengelige kun for barnelementer. Hvis du utelater det, vil du få en ekstra global stil.
Demoen kan finnes her (plunker)
Summary:
(-) you have to create container and it in templates
(+) encapsulation
(+) no duplicated styles
Notater: Innkapsling av stiler er en veldig kul funksjon. Men du bør også huske at det ikke finnes noen måte å begrense dine dyptliggende stiler på. Så hvis du bruker dyptliggende stiler, vil de være tilgjengelige for absolutt alle barn, så bruk det også med forsiktighet.
