Eu tenho um componente pai:
<parent></parent>
E eu quero preencher esse grupo com componentes filhos:
<parent>
<child></child>
<child></child>
<child></child>
</parent>
Modelo principal:
<div class="parent">
<!-- Children goes here -->
<ng-content></ng-content>
</div>
Modelo filho:
<div class="child">Test</div>
Como parent
e child
são dois componentes separados, seus estilos são bloqueados para seu próprio escopo.
No meu componente pai, tentei fazer:
.parent .child {
// Styles for child
}
Mas os .child
estilos não estão sendo aplicados aos child
componentes.
Tentei usar styleUrls
para incluir a parent
folha de estilo no child
componente para resolver o problema de escopo:
// child.component.ts
styleUrls: [
'./parent.component.css',
'./child.component.css',
]
Mas isso não ajudou, também tentou o contrário, buscando a child
folha de estilo, parent
mas também não ajudou.
Então, como você estiliza componentes filhos incluídos em um componente pai?
css
angular
angular-components
Chrillewoodz
fonte
fonte
Respostas:
Atualização - A maneira mais nova
Não faça isso, se puder evitá-lo. Como Devon Sans aponta nos comentários: Esse recurso provavelmente será preterido.
Atualização - Maneira mais recente
No Angular 4.3.0 , todos os combinadores piercing css foram preteridos. A equipe angular introduziu um novo combinador
::ng-deep
(ainda está no nível experimental e não no caminho completo e final), como mostrado abaixo,DEMO: https://plnkr.co/edit/RBJIszu14o4svHLQt563?p=preview
À moda antiga
Você pode usar
encapsulation mode
e / oupiercing CSS combinators >>>, /deep/ and ::shadow
exemplo de trabalho: http://plnkr.co/edit/1RBDGQ?p=preview
fonte
::ng-deep
agora está obsoleto , não recomendo usá-lo em aplicativos futurosATUALIZAÇÃO 3:
::ng-deep
também foi descontinuado, o que significa que você não deve mais fazer isso. Não está claro como isso afeta as coisas nas quais você precisa substituir estilos em componentes filhos de um componente pai. Para mim, parece estranho se isso for removido completamente, porque como isso afetaria coisas como bibliotecas nas quais você precisa substituir estilos em um componente de biblioteca?Comente se você tem alguma idéia disso.
ATUALIZAÇÃO 2:
Desde então
/deep/
e todos os outros seletores de piercing de sombra agora estão obsoletos. Descarga angular::ng-deep
que deve ser usada para uma compatibilidade mais ampla.ATUALIZAR:
Se estiver usando Angular-CLI, você precisará usar em
/deep/
vez de>>>
ou não funcionará.ORIGINAL:
Depois de ir para a página Github do Angular2 e fazer uma pesquisa aleatória por "estilo", encontrei a seguinte pergunta: Angular 2 - estilo innerHTML
Que dizia usar algo que foi adicionado
2.0.0-beta.10
, os seletores>>>
e::shadow
.Então, simplesmente fazendo:
No
parent
arquivo de estilo 's resolveu o problema. Observe que, conforme indicado na citação acima, esta solução é apenas intermediária até que o estilo de componentes cruzados mais avançado seja suportado.fonte
Você NÃO deve usar
::ng-deep
, está obsoleto. No Angular, a maneira correta de alterar o estilo do componente infantil dos pais é usarencapsulation
(leia o aviso abaixo para entender as implicações):E então, você poderá modificar o css do seu componente sem a necessidade de :: ng-deep
AVISO: Isso fará com que todas as regras css que você escreve para esse componente sejam globais.
Para limitar o escopo do seu css apenas a este componente, adicione uma classe css à tag superior do seu componente e coloque seu css "dentro" dessa tag:
Arquivo Scss:
fonte
::ng-deep
. Geralmente, os componentes têm seu próprio seletor de qualquer maneira (<my-component>, <div my-component>
, etc.), portanto, não há necessidade de um elemento wrapper com uma classe especial.Infelizmente, parece que o seletor / deep / está obsoleto (pelo menos no Chrome) https://www.chromestatus.com/features/6750456638341120
Em suma, parece que atualmente não há solução a longo prazo, a não ser que, de alguma forma, o componente filho modele as coisas dinamicamente.
Você pode passar um objeto de estilo para seu filho e aplicá-lo via:
<div [attr.style]="styleobject">
Ou, se você tiver um estilo específico, poderá usar algo como:
<div [style.background-color]="colorvar">
Mais discussões relacionadas a isso: https://github.com/angular/angular/issues/6511
fonte
Teve o mesmo problema, portanto, se você estiver usando o angular2-cli com o scss / sass use '/ deep /' em vez de '>>>', o último seletor ainda não é suportado (mas funciona muito bem com o css).
fonte
Se você deseja ser mais direcionado para o componente filho real, faça o seguinte. Dessa forma, se outros componentes filhos compartilharem o mesmo nome de classe, eles não serão afetados.
Plunker: https://plnkr.co/edit/ooBRp3ROk6fbWPuToytO?p=preview
Por exemplo:
Espero que isto ajude!
codematrix
fonte
Na verdade, há mais uma opção. O que é bastante seguro. Você pode usar o ViewEncapsulation. De qualquer forma, sempre prefira algum estilo global mais estilos encapsulados.
Aqui está o exemplo de Denis Rybalka modificado:
fonte
Existem algumas opções para conseguir isso no Angular:
1) Você pode usar seletores css profundos
2) Você também pode alterar o encapsulamento de exibição que está definido como Emulado como padrão, mas pode ser facilmente alterado para Nativo, que usa a implementação do navegador nativo Shadow DOM; no seu caso, você só precisa desativá-lo
Por exemplo: `
fonte
Você não deve escrever regras CSS para um componente filho em um componente pai, pois um componente Angular é uma entidade independente que deve declarar explicitamente o que está disponível para o mundo externo. Se o layout filho mudar no futuro, seus estilos para os elementos componentes componentes espalhados pelos arquivos SCSS de outros componentes poderão ser facilmente quebrados, tornando seu estilo muito frágil. Isso é o que
ViewEncapsulation
acontece no caso do CSS. Caso contrário, seria o mesmo se você pudesse atribuir valores a campos particulares de alguma classe de qualquer outra classe na Programação Orientada a Objetos.Portanto, o que você deve fazer é definir um conjunto de classes que você pode aplicar ao elemento host filho e implementar como a criança responde a elas.
Tecnicamente, isso poderia ser feito da seguinte maneira:
Em outras palavras, você usa o
:host
pseudo-seletor fornecido pelo conjunto Angular + de classes CSS para definir possíveis estilos filho no próprio componente filho. Você pode acionar esses estilos de fora aplicando classes predefinidas ao<child>
elemento host.fonte
parent.component.scss
relacionado ao estilo do componente filho. É o único objetivo dessa abordagem. Por que você precisaparent.component.scss
?ViewEncapsulation
apenas porque seu valor padrão é o que leva à questão do OP. Você não precisa atribuir umViewEncapsulation
código diferente para o código acima funcionar.Acho muito mais limpo passar uma variável @INPUT se você tiver acesso ao código do componente filho:
A idéia é que o pai diga à criança qual deve ser seu estado de aparência e que a criança decida como exibir o estado. É uma bela arquitetura
Maneira de SCSS:
Melhor maneira: - use a
selected
variável:fonte
A partir de hoje (Angular 9), o Angular usa um DOM DOM para exibir os componentes como elementos HTML personalizados . Uma maneira elegante de estilizar esses elementos personalizados pode estar usando variáveis CSS personalizadas . Aqui está um exemplo genérico:
Como podemos ver no código acima, criamos um elemento personalizado, como o Angular faria por todos os componentes e, em seguida, substituímos a variável responsável pela cor do plano de fundo na raiz da sombra do elemento personalizado, no escopo global .
Em um aplicativo Angular, isso pode ser algo como:
parent.component.scss
child-element.component.scss
fonte
A resposta rápida é que você não deveria estar fazendo isso. Ele quebra o encapsulamento de componentes e prejudica o benefício que você obtém dos componentes independentes. Considere passar um sinalizador de prop para o componente filho, ele pode decidir como renderizar de forma diferente ou aplicar CSS diferente, se necessário.
Angular está obsoleta todas as maneiras de afetar o estilo infantil dos pais.
https://angular.io/guide/component-styles#deprecated-deep--and-ng-deep
fonte
Eu também tive esse problema e não queria usar solução obsoleta, então acabei com:
em parrent
componente filho
na criança em div html
e no código
funciona como esperado e não deve ser preterido;)
fonte
Conforme a internet é atualizada, me deparei com uma solução.
Primeiro algumas advertências.
Primeiro, marque o encapsulamento do componente filho como sombra, para renderizá-lo no dom de sombra real. Segundo, adicione o atributo part ao elemento que você deseja permitir que o pai crie. Na folha de estilo do componente de seus pais, você pode usar o método :: part () para acessar
fonte
Proponho um exemplo para torná-lo mais claro, pois o angular.io/guide/component-styles afirma:
Em
app.component.scss
, importe seu,*.scss
se necessário._colors.scss
tem alguns valores de cores comuns:Aplique uma regra a todos os componentes
Todos os botões da
btn-red
classe serão estilizados.Aplicar uma regra a um único componente
Todos os botões com
btn-red
classe noapp-login
componente serão estilizados.fonte
Eu o resolvi fora do Angular. Eu defini um scss compartilhado que estou importando para meus filhos.
shared.scss
child.scss
Minha abordagem proposta é uma maneira de resolver o problema que o OP perguntou. Como mencionado em várias ocasiões, :: ng-deep,: ng-host será depreciado e desabilitar o encapsulamento é muito vazamento de código, na minha opinião.
fonte