Tengo un componente padre:
<parent></parent>
Y quiero llenar este grupo con componentes secundarios:
<parent>
<child></child>
<child></child>
<child></child>
</parent>
Plantilla principal:
<div class="parent">
<!-- Children goes here -->
<ng-content></ng-content>
</div>
Plantilla hijo:
<div class="child">Test</div>
Ya que parent
y child
son dos componentes separados, sus estilos son encerrados en su propio ámbito de aplicación.
En mi componente principal intenté hacer:
.parent .child {
// Styles for child
}
Pero el .child
estilos no se aplican a los child
componentes.
Intenté usar styleUrls
para incluir la parent
hoja de estilo de 's en el child
componente para resolver el problema del alcance:
// child.component.ts
styleUrls: [
'./parent.component.css',
'./child.component.css',
]
Pero eso no ayudó, también lo intentó de otra manera al buscar la child
hoja de estilo parent
pero tampoco ayudó.
Entonces, ¿cómo diseña los componentes secundarios que se incluyen en un componente principal?
css
angular
angular-components
Chrillewoodz
fuente
fuente
Respuestas:
Actualización: la forma más nueva
No lo hagas, si puedes evitarlo. Como Devon Sans señala en los comentarios: es muy probable que esta característica esté en desuso.
Actualización: nueva forma
Desde Angular 4.3.0 , todos los combinadores de piercing css quedaron en desuso. El equipo angular introdujo un nuevo combinador
::ng-deep
(todavía está en el nivel experimental y no en la forma completa y final) como se muestra a continuación,DEMO: https://plnkr.co/edit/RBJIszu14o4svHLQt563?p=preview
Vieja forma
Puedes usar
encapsulation mode
y / opiercing CSS combinators >>>, /deep/ and ::shadow
ejemplo de trabajo: http://plnkr.co/edit/1RBDGQ?p=preview
fuente
::ng-deep
ahora está en desuso , no recomiendo usarlo en futuras aplicacionesACTUALIZACIÓN 3:
::ng-deep
también está en desuso, lo que significa que ya no debes hacer esto. No está claro cómo esto afecta las cosas en las que necesita anular los estilos en los componentes secundarios de un componente primario. Para mí, parece extraño que esto se elimine por completo porque ¿cómo afectaría esto a las bibliotecas en las que necesita anular los estilos en un componente de biblioteca?Comenta si tienes alguna idea sobre esto.
ACTUALIZACIÓN 2:
Desde entonces,
/deep/
todos los demás selectores de piercing de sombra ahora están en desuso. Angular descartado::ng-deep
que debe usarse en su lugar para una compatibilidad más amplia.ACTUALIZAR:
Si usa Angular-CLI, debe usarlo en
/deep/
lugar de hacerlo>>>
o no funcionará.ORIGINAL:
Después de ir a la página de Github de Angular2 y hacer una búsqueda aleatoria de "estilo", encontré esta pregunta: Angular 2 - estilo innerHTML
Lo cual dice que use algo que se agregó
2.0.0-beta.10
, los selectores>>>
y::shadow
.Entonces simplemente haciendo:
En
parent
el archivo de hoja de estilo de resuelto el problema. Tenga en cuenta que, como se indica en la cita anterior, esta solución es solo intermedia hasta que se admita un estilo de componentes cruzados más avanzado.fuente
NO debe usar
::ng-deep
, está en desuso. En Angular, la forma correcta de cambiar el estilo del componente infantil del padre es usarencapsulation
(lea la advertencia a continuación para comprender las implicaciones):Y luego, podrá modificar el formato CSS de su componente sin necesidad de :: ng-deep
ADVERTENCIA: Al hacer esto, todas las reglas CSS que escriba para este componente serán globales.
Para limitar el alcance de su CSS a este componente solamente, agregue una clase CSS a la etiqueta superior de su componente y coloque su CSS "dentro" de esta etiqueta:
Archivo Scss:
fuente
::ng-deep
. En general, los componentes tienen su propio selector de todos modos (<my-component>, <div my-component>
, etc.), por lo que ni siquiera es necesario un elemento contenedor con una clase especial.Lamentablemente, parece que el selector / deep / está en desuso (al menos en Chrome) https://www.chromestatus.com/features/6750456638341120
En resumen, parece que (actualmente) no hay una solución a largo plazo que no sea lograr que su componente hijo estilice las cosas dinámicamente.
Puede pasar un objeto de estilo a su hijo y aplicarlo a través de:
<div [attr.style]="styleobject">
O si tiene un estilo específico, puede usar algo como:
<div [style.background-color]="colorvar">
Más discusión relacionada con esto: https://github.com/angular/angular/issues/6511
fuente
Tuve el mismo problema, así que si está usando angular2-cli con scss / sass use '/ deep /' en lugar de '>>>', el último selector aún no es compatible (pero funciona muy bien con css).
fuente
Si desea centrarse más en el componente secundario real de lo que debería, haga lo siguiente. De esta manera, si otros componentes secundarios comparten el mismo nombre de clase, no se verán afectados.
Plunker: https://plnkr.co/edit/ooBRp3ROk6fbWPuToytO?p=preview
Por ejemplo:
¡Espero que esto ayude!
codematrix
fuente
En realidad hay una opción más. Lo cual es bastante seguro. Puede usar ViewEncapsulation. Ninguno PERO coloca todos los estilos de sus componentes en su etiqueta (también conocido como selector). Pero de todos modos, siempre prefiero un estilo global más estilos encapsulados.
Aquí está el ejemplo modificado de Denis Rybalka:
fuente
Hay algunas opciones para lograr esto en Angular:
1) Puedes usar selectores css profundos
2) También puede cambiar la encapsulación de vista que está configurada como Emulada por defecto, pero puede cambiarse fácilmente a Nativo, que usa la implementación del navegador nativo de DOM DOM, en su caso solo necesita deshabilitarlo
Por ejemplo: `
fuente
No debe escribir reglas CSS para los elementos de un componente secundario en un componente primario, ya que un componente angular es una entidad autónoma que debe declarar explícitamente lo que está disponible para el mundo exterior. Si el diseño secundario cambia en el futuro, sus estilos para los elementos de ese componente secundario dispersos en los archivos SCSS de otros componentes podrían romperse fácilmente, haciendo que su estilo sea muy frágil. Eso es lo que
ViewEncapsulation
es en el caso de CSS. De lo contrario, sería lo mismo si pudiera asignar valores a campos privados de alguna clase desde cualquier otra clase en Programación Orientada a Objetos.Por lo tanto, lo que debe hacer es definir un conjunto de clases que podría aplicar al elemento host secundario e implementar cómo responde el niño a ellas.
Técnicamente, se podría hacer de la siguiente manera:
En otras palabras, utiliza el
:host
pseudo-selector proporcionado por Angular + conjunto de clases CSS para definir posibles estilos secundarios en el componente secundario en sí. Luego tiene la capacidad de activar esos estilos desde el exterior aplicando clases predefinidas al<child>
elemento host.fuente
parent.component.scss
relacionado con el estilo del componente secundario. Es el único propósito de este enfoque. ¿Por qué lo necesitasparent.component.scss
?ViewEncapsulation
solo porque su valor predeterminado es lo que lleva a la pregunta OP. No tiene que asignar unViewEncapsulation
código diferente para que funcione el código anterior.Me parece mucho más limpio pasar una variable @INPUT si tiene acceso al código del componente secundario:
La idea es que el padre le dice al niño cuál debería ser su estado de apariencia, y el niño decide cómo mostrar el estado. Es una bonita arquitectura
Manera SCSS:
Mejor manera: - usar
selected
variable:fuente
A partir de hoy (Angular 9), Angular utiliza un DOM DOM para mostrar los componentes como elementos HTML personalizados . Una forma elegante de diseñar esos elementos personalizados podría ser usar variables CSS personalizadas . Aquí hay un ejemplo genérico:
Como podemos ver en el código anterior, creamos un elemento personalizado, tal como lo haría Angular para nosotros con cada componente, y luego anulamos la variable responsable del color de fondo dentro de la raíz sombra del elemento personalizado, desde el alcance global .
En una aplicación Angular, esto podría ser algo como:
parent.component.scss
child-element.component.scss
fuente
La respuesta rápida es que no deberías estar haciendo esto, en absoluto. Rompe la encapsulación de componentes y socava el beneficio que obtienes de los componentes autónomos. Considere pasar una bandera de apoyo al componente hijo, entonces puede decidir por sí mismo cómo renderizar de manera diferente o aplicar CSS diferente, si es necesario.
Angular está despreciando todas las formas de afectar los estilos infantiles de los padres.
https://angular.io/guide/component-styles#deprecated-deep--and-ng-deep
fuente
También tuve este problema y no quería usar una solución obsoleta, así que terminé con:
en padres
componente hijo
en niño en html div
y en código
funciona como se esperaba y no debe ser desaprobado;)
fuente
A medida que Internet se actualiza, he encontrado una solución.
Primero algunas advertencias.
Primero, marque la encapsulación de su componente hijo como sombra para que se represente en el dom de sombra real. En segundo lugar, agregue el atributo de la parte al elemento que desea permitir que el padre aplique. En la hoja de estilo de componentes de sus padres, puede usar el método :: part () para acceder
fuente
Propongo un ejemplo para hacerlo más claro, ya que angular.io/guide/component-styles dice:
Encendido
app.component.scss
, importe su*.scss
si es necesario._colors.scss
tiene algunos valores de color comunes:Aplicar una regla a todos los componentes
Se diseñarán todos los botones que tengan
btn-red
clase.Aplicar una regla a un solo componente
Se diseñarán todos los botones que tengan
btn-red
clase en elapp-login
componente.fuente
Lo he resuelto fuera de Angular. He definido un scss compartido que estoy importando a mis hijos.
shared.scss
child.scss
Mi enfoque propuesto es una forma de resolver el problema que el OP ha preguntado. Como se mencionó en varias ocasiones, :: ng-deep,: ng-host se depreciará y, en mi opinión, deshabilitar la encapsulación es una pérdida de código.
fuente