Estilo html, cuerpo del componente web (Angular 2)


Estoy trabajando en un LoginComponent en Angular 2 que debería "restyle" las etiquetas html y body, para poder poner una imagen de fondo específica para la página de inicio de sesión.

Pero simplemente agregar un estilo para el html, body en mi login.css no parece funcionar.

¿Hay alguna forma de anular el estilo en el html, body desde un componente? O cualquier elemento para el caso.

He intentado cosas como:

:host(.btn) { ... }
:host(.btn:host) { ... }
.btn:host { ... }

Para dar estilo a un elemento fuera del componente Login. Pero nada parece funcionar.

Author: Vivendi, 2016-01-19

8 answers

Usted podría intentar

body {
  /* body styles here */
} 

Pero se supone que los estilos de los componentes no deben aplicarse a elementos externos a ellos mismos.

Otra forma es usar body como selector en su componente principal y usar host-binding para establecer/eliminar una clase CSS en body para hacer CSS que haya agregado a su índice.coincidencia html.

@Component({
  selector: "body", 
  host: {
    "[class.some-class]":"someClass" 
  }, 
}) 
export class AppComponent {
  constructor(private loginService: LoginService) {
    loginService.isLoggedInChanged.subscribe((value) => {
      this.someClass = value;
    });
  }
  someClass: bool = false;
} 

Cuando se establece someclass en true (usando algún enlace a un servicio, la clase se agrega al cuerpo.

Si no desea agregar CSS globalmente, también puede enlazar a un atributo de estilo directamente

@Component({
  selector: "body", 
  host: {
    "[style.background-image]":"bodyBackgroundImage()" 
  }, 
}) 
export class AppComponent {
  bool isLoggedIn = false;
  constructor(private loginService: LoginService) {
    loginService.isLoggedInChanged.subscribe((value) => {
      this.isLoggedIn = value;
    });
  }
  function bodyBackgroundImage() {
    return this.isLoggedIn ? 'url("gradient_bg.png")': 'none';
  }
} 

Update

DomAdapter se ha ido. Renderer2 debería proporcionar una funcionalidad similar.

Una forma de estilizar <body> directamente desde el componente login es usar el DomAdapter (ver también https://github.com/angular/angular/issues/4942 )

System.import('angular2/src/platform/browser/browser_adapter').then(function(browser_adapter) {
  browser_adapter.BrowserDomAdapter.makeCurrent();
})
...
_dom: DomAdapter = new BrowserDomAdapter();
_dom.setStyle(_dom.query('body'), 'padding', '50px');

 17
Author: Günter Zöchbauer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-29 14:27:55

Necesita cambiar la forma en que su componente sirve css usando ViewEncapsulation. Por defecto se establece en Emulated y angular será

Agregue un atributo que contenga el id sustituto y preprocese las reglas de estilo

Para cambiar este comportamiento import ViewEncapsulation from 'angular2/core' y usarlo en los metadatos del componente:

@Component({
  ...
  encapsulation: ViewEncapsulation.None,
  ...
})
 75
Author: Sasxa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-20 04:34:55

No estoy seguro de si esto es exactamente lo que estás buscando, pero esto no te dejará con una imagen de fondo del cuerpo cambiada permanentemente.

Así es como lo hice para algo similar. Si quieres impactar la imagen de fondo del cuerpo solo para esta página, esto puede funcionar. (No he probado esto completamente, pero parece funcionar en los navegadores de Windows.)

Dentro de su componente puede trabajar directamente a través del DOM cuando el componente se construye. Cuando se destruye se puede deshacer cambio.

export class SpecialBackground  {
  constructor(){
    document.body.style.backgroundImage = "url('path/to/your/image.jpg')";
    document.body.style.backgroundPosition = "center center";
    document.body.style.backgroundRepeat = "no-repeat";
    document.body.style.backgroundAttachment = "fixed";
    document.body.style.backgroundSize = "cover";
  }
  ngOnDestroy(){
    document.body.style.backgroundImage = "none";
  }
}

Para sus propósitos, puede usar una función diferente (en lugar del constructor) cuando se hace clic en el botón y debería estar listo.

 12
Author: jfgrissom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-29 04:13:44

La forma en que lo usé es

constructor() {
    document.body.className = "bg-gradient";
  }

ngOnDestroy(){
    document.body.className="";
  }

Esto agregará y eliminará dinámicamente el estilo del cuerpo de un componente en particular.

 8
Author: Akash Bavale,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-16 10:27:06

Acabo de editar los estilos.archivo scss y funcionó para mí.

 4
Author: Omer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-17 08:50:51

Tuve el mismo problema con margin-top, la forma en que arreglé es

constructor(
    private _renderer: Renderer2,
) {
    this._renderer.removeStyle(document.body, 'margin-top');
}

Esto funcionó perfectamente para mí.

 1
Author: Skeptor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-10 14:32:32

Es mejor agregar el archivo css a nivel raíz y configurarlo en angular-cli.json O añadirlo en el índice.HTML . así que puede escribir su reset y estilos globales y no hay necesidad de preocuparse por shadow dom y otros conceptos.

 0
Author: Chaitanya Chauhan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-28 13:50:14

Utilizo este enfoque en mi componente, cargado en router-outlet:

      ngOnInit() {
        // Change <body> styling
        document.body.classList.add('align-content-between');
      }

      ngOnDestroy() {
        // Change <body> styling
        document.body.classList.remove('align-content-between');
      }
 0
Author: Anton Pegov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-12 11:05:08