Estou tentando estilizar um elemento colocado pela saída do roteador em angular e quero ter certeza de que o elemento gerado terá uma largura de 100%
Pela maioria das respostas, vejo que devo usar o ::ng-deep
seletor, mas pelos documentos do Angular ele está sendo descontinuado. Existe uma alternativa para ::ng-deep
?
::ng-deep
não vai a lugar nenhum. Sempre será uma configuração que você pode ativar. Não há absolutamente nenhuma maneira de removê-lo agora sem uma reação massiva da comunidade. Veja quantos resultados retornaram para esta pesquisa github.com/search?q=%3A%3Ang-deep&type=Code - é como dizer que a!important
propriedade css vai desaparecer!important
tem um lugar importante na especificação CSS, mas::deep
sempre foi apenas uma proposta.Respostas:
FWIW Em minha pesquisa, não encontrei nenhum substituto para o ng-deep ou outras alternativas aplicáveis. Isso ocorre porque, acredito, a equipe Angular está adiando as especificações do W3C no shadow dom, que inicialmente tinha seletores como
deep
. No entanto, o W3c removeu a recomendação, mas não a substituiu por uma nova. Até que isso aconteça, imagino que a equipe Angular manterá::ng-deep
e suas alternativas disponíveis, mas em estado obsoleto devido ao estado pendente dos rascunhos do W3C. Não consigo encontrar a documentação para fazer o backup agora, mas eu a vi recentemente.Resumindo: Continue usando
::ng-deep
e suas alternativas até que uma substituição seja criada - a descontinuação é apenas um aviso antecipado para que as pessoas não sejam surpreendidas sempre que a mudança real se materializar.- ATUALIZAÇÃO -
https://drafts.csswg.org/css-scoping-1/ Aqui está o rascunho da proposta, se você estiver interessado. Parece que eles estão trabalhando em um conjunto robusto de seletores para elementos dentro de uma árvore shadow dom; é essa especificação, uma vez aprovada, que eu acho que informará o clone angular, se houver um (ou seja, o angular pode não precisar implementar seus próprios seletores uma vez que isso vá ao ar nos navegadores).
fonte
::ng-deep
vez em quando (se você se preocupa com a aparência do seu site) - mesmo com algo parecido com material angular. Eles têm bugs que não são corrigidos por meses e as soluções alternativas geralmente envolvem ng-deep. E não confunda os diferentes seletores 'profundos' obsoletos -::ng-deep
é definitivamente o menos obsoleto.:host[some-context] {}
- it depende do tipo de flexibilidade / portabilidade que você deseja. Eu não gosto muito de nenhuma maneira, mas este é o mundo do encapsulamento.Para ignorar o obsoleto
::ng-deep
, geralmente desativoViewEncapsulation
. Embora essa não seja a melhor abordagem, ela me serviu bem.Para desativar
ViewEncapsulation
, faça o seguinte em seu componente:import { Component, ViewEncapsulation } from '@angular/core'; @Component({ selector: 'app-header', templateUrl: './header.component.html', styleUrls: ['./header.component.scss'], encapsulation: ViewEncapsulation.None }) export class HeaderComponent { }
Isso tornará os estilos .scss neste componente globais para todo o aplicativo. Para não permitir que os estilos subam na cadeia de componentes pai e irmão, envolva todo o scss com o seletor assim:
app-header { // your styles here and any child component styles can go here }
Agora, os estilos especificados aqui irão para os componentes filhos, então você precisa ser mais específico com seus seletores de css e cuidar de seus p's e q's ao adicionar CSS (talvez adicionar o seletor filho especificado em seu aplicativo Angular e então seus estilos).
Eu digo que não é a melhor abordagem por causa do parágrafo acima, mas isso me serviu bem.
fonte
ViewEncapsulation
causará muitos danos ao fazer com que esses estilos vazem para todos os componentes. Este recurso deve ser usado com sabedoria e total compreensãoA alternativa simples e fácil para um estilo profundo é um estilo comum que usa o seletor de elemento do componente pai. Então, se você tivesse isso em hero-details.component.css:
:host ::ng-deep h3 { font-style: italic; }
Seria assim em styles.css:
app-hero-details h3 { font-style: italic; }
Basicamente, um estilo profundo é um estilo não encapsulado, portanto, conceitualmente, parece mais um estilo comum para mim do que um estilo componente. Pessoalmente, eu não usaria mais estilos profundos. Alterações significativas são normais em atualizações de versão principais e a remoção de recursos obsoletos é um jogo justo.
fonte
Como alguém disse antes, se você estiver usando uma biblioteca de terceiros, é virtualmente impossível evitar ter que usar de
::ng-deep
vez em quando. Mas o que você vai fazer com seus projetos anteriores quando o::ng-deep
não mais suportados pelos navegadores?Para estar pronto para esse momento, vou sugerir o seguinte:
@Component({ selector: 'app-example', templateUrl: './example.component.html', styleUrls: ['./example.component.scss'], encapsulation: ViewEncapsulation.None })
<section class="app-example-container"> <!-- a third party component --> <mat-tab-group> <mat-tab label="First"></mat-tab> <mat-tab label="Second"></mat-tab> </mat-tab-group> </section>
.app-example-container { /* All the CSS code goes here */ .mat-tab-group .mat-tab-label {color: red;} }
Uma nota pessoal para o futuro: https://angular.io/guide/component-styles
Esse deve ser o primeiro lugar a olhar para alternativas oficiais / caminhos a seguir
fonte
But what are you going to do about your previous projects when the ::ng-deep became no longer supported by browsers?
Isso não é compilado / polyfilled pelo angular cli, então não há envolvimento do navegador? Ótima resposta btw.:host /deep/ .mat-tab-label
isso deve ser transformado em::ng-deep
. Para ser honesto, parece que usar o alias é mais conveniente porque a CLI pode alterá-lo durante o tempo de compilação, mas ainda assim, você precisará fazer umng build
e implementar novamente. Minha resolução foi evitar::ng-deep
em todos os meus projetos :)Este não é um substituto geral para :: ng-deep, mas para o caso de uso descrito pelo autor da pergunta:
No caso especial em que você deseja estilizar o elemento inserido por uma saída de roteador, há uma solução elegante usando o seletor vizinho adjacente em CSS:
router-outlet+* { /* styling here... */ }
Isso se aplica a todos os elementos que são vizinhos diretos de uma tomada do roteador.
Leitura adicional:
https://developer.mozilla.org/en-US/docs/Web/CSS/Adjacent_sibling_combinator
https://angular.io/guide/router#router-outlet
fonte
*
é o pior cenário seguido de perto,element *
maselement + *
não está nem perto dos dois primeiros.Você pode usar "/ deep /". É a alternativa :: ng-deep.
:host /deep/ h3 { font-style: italic; }
fonte
alias
umalternative
.