2015-10-25 26 views
60

Stiamo creando un'applicazione Angular2 e vogliamo essere in grado di creare in qualche modo una variabile CSS globale (e aggiornare i valori delle proprietà ogni volta che viene modificato quando viene assegnata la variabile).Cambio dinamico angolare2 Proprietà CSS

Abbiamo utilizzato polimero per un tempo (ora si passano a componenti Angular2) e abbiamo usato proprietà CSS (polimero abbia qualche polyfill) e avevamo appena aggiornare stili utilizzando Polymer.updateStyles().

Esiste un modo per ottenere una funzione simile?

EDIT:

Vogliamo qualcosa di simile a Sass color: $g-main-color oa CSS proprietà personalizzate color: var(--g-main-color) e ogni volta che decidiamo di cambiare il valore della proprietà, per esempio qualcosa come updateVariable('g-main-color', '#112a4f') aggiorna dinamicamente il valore ovunque. Tutto ciò mentre un'app è in esecuzione.

EDIT 2:

voglio usare alcune variabili globali CSS in diverse parti (ospite, elemento figlio ...) della mia CSS ed essere in grado di cambiare immediatamente il valore - quindi se cambio -colore variabile, cambia ovunque nell'app.

userò la sintassi Sass ad esempio:

:host { border: 2px solid $my-color } 
:host .some-label { color: $my-color } 

è possibile utilizzare qualcosa come tubi angolari? (ma presumibilmente funziona solo in HTML)

:host { border: 2px solid {{ 'my-color' | cssvariable }} } 
:host .some-label { color: {{ 'my-color' | cssvariable }} } 
+2

Sono interessato a sapere quale approccio avete preso. Stiamo avendo requisiti simili. – Yousuf

+0

Non ho ancora soluzioni per questo. L'approccio solo oggi resonable è probabilmente l'uso di variabili CSS con qualche tipo di polyfill ... – HoBi

+0

Sai di qualsiasi polyfill che può essere usato in angular2 per sostituire le variabili? – Yousuf

risposta

2

Basta utilizzare le variabili CSS standard:

il CSS globale (ad es: styles.css)

body { 
    --my-var: #000 
} 

In del componente CSS o qualunque essa sia:

span { 
    color: var(--my-var) 
} 

Poi puoi modificare il valore della variabile direttamente con TS/JS impostando lo stile in linea sull'elemento html:

document.querySelector("body").style.cssText = "--my-var: #000"; 

Altrimenti si può utilizzare jQuery per esso:

$("body").css("--my-var", "#fff"); 
+2

Sì. Questa è una buona opzione ora, non indietro nel 2015: :) – HoBi

5

Non hai alcun codice di esempio ma suppongo che si vuole fare qualcosa di simile?

@View({ 
directives: [NgClass], 
styles: [` 
    .${TodoModel.COMPLETED} { 
     text-decoration: line-through; 
    } 
    .${TodoModel.STARTED} { 
     color: green; 
    } 
`], 
template: `<div> 
       <span [ng-class]="todo.status" >{{todo.title}}</span> 
       <button (click)="todo.toggle()" >Toggle status</button> 
      </div>` 
}) 

si assegna ng-class ad una variabile che è dinamico (una proprietà di un modello chiamato TodoModel come si può intuire).

todo.toggle() sta cambiando il valore di todo.status e lì per la classe di input sta cambiando.

Questo è un esempio per il nome della classe, ma in realtà si potrebbe fare lo stesso per le proprietà CSS.

Spero che questo sia ciò che intendevi.

Questo esempio viene preso per il grande tutorial di testa di porco here.

+5

Non è quello che vogliamo. Vogliamo qualcosa di simile a Sass 'color: $ g-main-color' o nelle proprietà personalizzate CSS' color: var (- g-main-color) 'e ogni volta che decidiamo di modificare il valore della proprietà, ad es. qualcosa come JS 'updateVariable ('g-main-color', '# 112a4f')' aggiorna dinamicamente il valore ovunque. Tutto ciò mentre un'app è in esecuzione. – HoBi

2

Ho fatto this plunker per esplorare un modo per fare quello che vuoi.

Qui ricevo mystyle dal componente principale ma è possibile ottenerlo da un servizio.

import {Component, View} from 'angular2/angular2' 

@Component({ 
    selector: '[my-person]', 
    inputs: [ 
    'name', 
    'mystyle: customstyle' 
    ], 
    host: { 
    '[style.backgroundColor]': 'mystyle.backgroundColor' 
    } 
}) 
@View({ 
    template: `My Person Component: {{ name }}` 
}) 
export class Person {} 
+0

Devo essere in grado di cambiare gli stili di elementi host e secondari che non sono in grado di fare con la soluzione, inoltre è una specie di stile di scrittura disordinato al di fuori dell'area "CSS". Date un'occhiata a EDIT 2. Btw. invece di prendere colore dall'input tramite un attributo, sarebbe meglio importare qualche classe e usarne una variabile, perché voglio le variabili globali per l'intera app. ;) – HoBi

53

1) Utilizzando gli stili inline

<div [style.color]="myDynamicColor"> 

2) utilizzare più mapping classi CSS per quello che vuoi e passare classi come:

/* CSS */ 
.theme { /* any shared styles */ } 
.theme.blue { color: blue; } 
.theme.red { color: red; } 

/* Template */ 
<div class="theme" [ngClass]="{blue: isBlue, red: isRed}"> 
<div class="theme" [class.blue]="isBlue"> 

Esempi di codice da: https://angular.io/cheatsheet

Maggiori informazioni sulla direttiva ngClass: https://angular.io/docs/ts/latest/api/common/index/NgClass-directive.html

+2

Questo potrebbe funzionare, ma c'è un problema: devi separare gli stili dinamici dal file CSS, che non è mai il modo migliore. :(Preferirei avere qualcosa all'interno del CSS, ma probabilmente dovrò occuparmene .. – HoBi

+0

Non capisco, usa SASS/LESS, per gli stili dinamici da JavaScript posso solo vederli. mescola stili statici e dinamici a meno che tu stia sbagliando Static: css Dynamic: JavaScript –

+0

Ho detto che sarebbe stato carino avere qualcosa come i tubi Angular2: la possibilità di scriverlo all'interno del file o dell'area CSS. probabilmente non è possibile, quindi dovrò farlo come se avessi scritto in 1) e magari aggiungere un commento al file Sass, che ci sia una variabile globale usata (o dovrebbe essere) dall'esterno. – HoBi