style example component app angular2 angular

example - Cargue el estilo css externo en Angular 2 Component



css in angular (4)

import {Component} from ''angular2/core''; @Component({ selector: ''my-app'', template: ''<div></div>'', styleUrls: [ ''http://domain.com/external.css'', ''app/local.css'' ] }) export class AppComponent {}

El external.css no se carga. ¿Hay alguna forma de cargar el css externo en un componente Angular 2?


Esto podría ser tarde, espero que esto ayude a alguien más. Para usar ViewEncapsulation, simplemente use import { ViewEncapsulation } from ''@angular/core'';


Un mejor enfoque ya está publicado aquí: https://.com/a/36265072/5219412

Solo tiene que agregar esto en la declaración de su componente:

@Component({ ... encapsulation: ViewEncapsulation.None, })

Como se especifica en la documentación angular: https://angular.io/guide/component-styles

Espero eso ayude.


Ver también https://angular.io/docs/ts/latest/guide/component-styles.html

Ver encapsulación

Para permitir que los estilos externos afecten el contenido de los componentes, puede cambiar la encapsulación de la vista (eso es lo que evita que los estilos se "mezclen" en los componentes).

@Component({ selector: ''some-component'', template: ''<div></div>'', styleUrls: [ ''http://example.com/external.css'', ''app/local.css'' ], encapsulation: ViewEncapsulation.None, }) export class SomeComponent {}

Ver encapsulación cumple un propósito. La mejor manera es agregar estilos directamente al componente que deberían afectar. ViewEncapsulation se establece por componente y puede ser útil en algunas situaciones.

"piercing de sombra"

También puede usar el combinador CSS de perforación de sombras ::ng-deep ( >>> y /deep/ están en desuso) para crear selectores que crucen los límites de los componentes como

:host ::ng-deep .ng-invalid { border-bottom: solid 3px red; }

que aplica estilos a todas las etiquetas con una clase ng-invalid en el componente actual o cualquier descendiente con un subrayado rojo sin importar si la encapsulación es None o Emulated . Depende del soporte del navegador si /deep/ funciona con Native (que yo sepa, esto ya no es compatible con ningún navegador).

Nota

Los combinadores CSS de perforación de sombras son similares a los de la especificación DOM de sombra donde están en desuso desde hace bastante tiempo.

Con el ViewEncapsulation.Emulated predeterminado, se ViewEncapsulation.Emulated angulares ViewEncapsulation.Emulated implementación propia /deep/ y ::shadow y funcionarán incluso cuando Chrome elimine el soporte nativo.

Con ViewEncapsulation.Native Angular utiliza los combinadores de CSS DOM de sombra de ViewEncapsulation.Native (solo Chrome los admite de todos modos AFAIK). Si Chrome finalmente los elimina, no funcionarán también en Angular (nuevamente ViewEncapsulation.Native solamente).

Estilos globales

Los estilos agregados globalmente ( index.html ) no consideran los límites de los componentes. Angular2 y ViewEncapsulation.Emulated no reescriben dichos estilos. ViewEncapsulation.Emulated no se aplica a ellos. Solo si ViewEncapsulation.Native está configurado y el navegador tiene soporte DOM nativo de sombra, entonces los estilos globales no pueden sangrar.

Consulte también este tema relacionado https://github.com/angular/angular/issues/5390


En primer lugar , los styles / styleUrls solo deben usarse para cualquier regla css que afecte directamente el estilo del elemento desde su plantilla.

La razón por la que su external.css no se aplica a su componente es porque cuando carga estas reglas en external.css desde styleUrls o styles , al compilar, angular2 agregará un identificador de componente único como el selector de atribución a sus selectores originales.

Por ejemplo, en su external.css, si hay una regla como div.container { /*some rules*/ } , se convertirá en div.container[_ngcontent-cds-2] { /*some rules*/ } . Entonces, no importa cuán duro intente forzar que sus reglas se conviertan en reglas de prioridad, por ejemplo, agregar etiqueta !important , no va a funcionar: todos los selectores en su external.css se han restringido un nivel al selector de atributos, solo el elemento componente lleva El mismo atributo. Así es como angular2 restringe los estilos a solo el componente actual.

Por supuesto, siempre hay una solución alternativa.

Aquí está mi solución: SystemJS un servicio de recursos externos, para todo el script js, usará SystemJS para cargar AMD o Globalmente, para todos los archivos css, usará javascript simple para crear un <link> elemento y añádelo al elemento <head> .

Aquí hay una parte de mi código para su consideración:

loadCSS(url) { // Create link let link = document.createElement(''link''); link.href = url; link.rel = ''stylesheet''; link.type = ''text/css''; let head = document.getElementsByTagName(''head'')[0]; let links = head.getElementsByTagName(''link''); let style = head.getElementsByTagName(''style'')[0]; // Check if the same style sheet has been loaded already. let isLoaded = false; for (var i = 0; i < links.length; i++) { var node = links[i]; if (node.href.indexOf(link.href) > -1) { isLoaded = true; } } if (isLoaded) return; head.insertBefore(link, style); }