Soy nuevo en Angular 4, así que, ¿alguien podría explicar cómo y dónde usarlo ::ng-deep
en Angular 4?
En realidad, quiero sobrescribir algunas de las propiedades CSS de los componentes secundarios de los componentes principales. Además, ¿es compatible con IE11?
css
angular
angular-template
Jeyabalan Thavamani
fuente
fuente
/deep/
y::ng-deep
están en desuso, le sugiero que consulte esta respuesta stackoverflow.com/a/49308475/2275011 y comentarios para obtener más detalles y soluciones.Respuestas:
Por lo general, el
/deep/ “shadow-piercing”
combinador se puede usar para forzar un estilo achild components
. Este selector tenía un alias >>> y ahora tiene otro llamado :: ng-deep.ya que
/deep/ combinator
ha quedado obsoleto, se recomienda utilizar::ng-deep
Por ejemplo:
<div class="overview tab-pane" id="overview" role="tabpanel" [innerHTML]="project?.getContent( 'DETAILS')"></div>
y
css
.overview { ::ng-deep { p { &:last-child { margin-bottom: 0; } } } }
se aplicará a los componentes secundarios
fuente
USO
::ng-deep
,>>>
Y la/deep/
vista de encapsulación para desactivar las reglas CSS específicas, en otras palabras, que le da acceso a los elementos DOM, que no están en el HTML de su componente. Por ejemplo, si está usando Angular Material (o cualquier otra biblioteca de terceros como esta), algunos elementos generados están fuera del área de su componente (como el diálogo ) y no puede acceder a esos elementos directamente o usando un CSS normal camino. Si desea cambiar los estilos de esos elementos, puede usar una de esas tres cosas, por ejemplo:::ng-deep .mat-dialog { /* styles here */ }
Por ahora, el equipo de Angular recomienda realizar manipulaciones "profundas" solo con la encapsulación de vista EMULADA .
DEPRECACIÓN
Las manipulaciones "profundas" también están en desuso , PERO sigue funcionando por ahora, porque Angular admite el preprocesamiento (no se apresure a rechazarlo
::ng-deep
hoy, primero eche un vistazo a las prácticas de desuso ).De todos modos, antes de seguir este camino, le recomiendo que eche un vistazo a la desactivación del enfoque de encapsulación de vistas (que tampoco es ideal, permite que sus estilos se filtren en otros componentes), pero en algunos casos, es una mejor manera. Si decidió deshabilitar la encapsulación de vista, se recomienda encarecidamente utilizar clases específicas para evitar la intersección de reglas CSS y, finalmente, evitar un desorden en sus hojas de estilo. Es realmente fácil de deshabilitar directamente en el
.ts
archivo del componente :@Component({ selector: '', template: '', styles: [''], encapsulation: ViewEncapsulation.None // Use to disable CSS Encapsulation for this component })
Puede encontrar más información sobre la encapsulación de vistas en este artículo.
fuente
ViewEncapsulation.None
! Hará mucho daño al permitir que esos estilos se filtren en otros componentes.Destacaría la importancia de limitar
::ng-deep
a los hijos únicos de un componente al exigir que el padre sea una clase CSS encapsulada.Para que esto funcione, es importante usar
::ng-deep
después del padre, no antes, de lo contrario se aplicaría a todas las clases con el mismo nombre en el momento en que se carga el componente.CSS del componente:
.my-component ::ng-deep .mat-checkbox-layout { background-color: aqua; }
Plantilla de componente:
<h1 class="my-component"> <mat-checkbox ....></mat-checkbox> </h1>
CSS resultante (generado en ángulo):
.my-component[_ngcontent-c1] .mat-checkbox-layout { background-color: aqua; }
EDITAR:
Puede lograr el mismo comportamiento utilizando la
:host
palabra clave en lugar de crear una nueva clase css.:host ::ng-deep .mat-checkbox-layout
fuente
my-component ::ng-deep...
acaba de salvarme el día. Pasé todo el día tratando de aplicar un estilo para mi componente con ng-deep y estaba anulando todos mis componentes, desde toda mi aplicación.:host
palabra clave: agregó una nota a la respuesta para mayor claridad.Asegúrese de no perderse la explicación
:host-context
que se encuentra directamente arriba::ng-deep
en la guía angular: https://angular.io/guide/component-styles . Descargo de responsabilidad: me lo perdí hasta ahora y desearía haberlo visto antes.::ng-deep
a menudo es necesario cuando no escribiste el componente y no tienes acceso a su fuente, pero:host-context
puede ser una opción muy útil cuando lo haces.Por ejemplo, tengo un
<h1>
encabezado negro dentro de un componente que diseñé y quiero tener la capacidad de cambiarlo a blanco cuando se muestra sobre un fondo temático oscuro.Si no tuve acceso a la fuente, es posible que tenga que hacer esto en el CSS para el padre:
.theme-dark widget-box ::ng-deep h1 { color: white; }
Pero en cambio
:host-context
, puedes hacer esto dentro del componente.h1 { color: black; // default color :host-context(.theme-dark) & { color: white; // color for dark-theme } // OR set an attribute 'outside' with [attr.theme]="'dark'" :host-context([theme='dark']) & { color: white; // color for dark-theme } }
Esto buscará en cualquier parte de la cadena de componentes
.theme-dark
y aplicará el CSS al h1 si lo encuentra. Esta es una buena alternativa a confiar demasiado en lo::ng-deep
que, si bien a menudo es necesario, es algo así como un anti-patrón.En este caso,
&
se reemplaza porh1
(así es como funciona sass / scss) para que pueda definir su css 'normal' y temático / alternativo uno al lado del otro, lo cual es muy útil.Tenga cuidado de obtener el número correcto de
:
. Porque::ng-deep
hay dos y:host-context
solo uno.fuente
:host(.theme-dark)
si no desea heredartheme-dark
de ningún componente principal. Esto dependerá completamente del diseño CSS de su sitio. Además, los atributos pueden ser muy útiles y se pueden combinar de formas sofisticadas solo en CSS:host([theme='dark']:not([dayofweek='tuesday'))
.theme-light
clase, esto a su vez está anidado dentro de un contenedor con el.theme-dark
que todavía recogerátheme-dark
y aplicará el css. Pero esta es una gran solución para las clases de tipo 'modernizr', o si tiene un tema establecido globalmente y solo una vez.Solo una actualización:
Debería usar en
::ng-deep
lugar de lo/deep/
que parece estar en desuso.Por documentación:
Lo puedes encontrar aqui
fuente
Utilice :: ng-deep con precaución. Lo usé en toda mi aplicación para configurar el color de la barra de herramientas de diseño de materiales en diferentes colores en toda mi aplicación solo para descubrir que cuando la aplicación estaba probando los colores de la barra de herramientas se superponen. Venga a descubrir que es porque estos estilos se vuelven globales, vea este artículo. Aquí hay una solución de código de trabajo que no se filtra en otros componentes.
<mat-toolbar #subbar> ... </mat-toolbar> export class BypartSubBarComponent implements AfterViewInit { @ViewChild('subbar', { static: false }) subbar: MatToolbar; constructor( private renderer: Renderer2) { } ngAfterViewInit() { this.renderer.setStyle( this.subbar._elementRef.nativeElement, 'backgroundColor', 'red'); } }
fuente