2015-10-25 5 views
60

Мы делаем приложение Angular2, и мы хотим иметь возможность каким-то образом создать глобальную переменную CSS (и обновлять значения свойств при каждом изменении при назначении переменной).Angular2 dynamic change CSS свойство

Мы использовали Polymer некоторое время (теперь мы переходим на компоненты Angular2), и мы использовали свойства CSS (у Polymer есть полипол), и мы только что обновили стили, используя Polymer.updateStyles().

Есть ли способ, как мы можем достичь аналогичной функции?

EDIT:

Мы хотим что-то похожее на Sass color: $g-main-color или в CSS пользовательских свойств color: var(--g-main-color) и всякий раз, когда мы решили изменить значение свойства, например, что-то вроде updateVariable('g-main-color', '#112a4f') динамически обновляет значение везде. Все это, пока приложение работает.

EDIT 2:

Я хочу использовать некоторые глобальные переменные CSS в разных частях (хост, дочерний элемент ...) моего CSS и быть в состоянии немедленно изменить значение - так, если изменить -цветная переменная, она меняется везде в приложении.

Я буду использовать синтаксис Sass, например:

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

можно использовать что-то вроде угловых труб? (Но это, мол, работает только в HTML)

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

Мне интересно знать, какой подход вы взяли. У нас есть аналогичные требования. – Yousuf

+0

У меня до сих пор нет решения. Вероятнее всего, использование только резонансного подхода сегодня - использование переменных CSS с каким-то полифоном ... – HoBi

+0

Знаете ли вы, какой-либо полиполк, который можно использовать в угловом2 для замены переменных? – Yousuf

ответ

2

Просто используйте стандартные CSS переменные:

Ваш глобальный CSS (например: styles.css)

body { 
    --my-var: #000 
} 

В CSS вашего компонента O бы это ни было:

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

Тогда вы можете напрямую изменить значение переменной с помощью TS/JS, установив стиль строки в элемент html:

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

В противном случае вы можете использовать JQuery для него:

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

Да. Это хороший вариант сейчас, а не в 2015 году: :) – HoBi

5

Вы не имеете пример кода, но я предполагаю, что вы хотите сделать что-то вроде этого?

@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>` 
}) 

Вы назначаете ng-class к переменной, которая является динамическим (свойство модели называется TodoModel, как вы можете догадаться).

todo.toggle() меняет значение todo.status и там, где меняется класс ввода.

Это пример имени класса, но на самом деле вы можете сделать то же самое для свойств css.

Надеюсь, это то, что вы имели в виду.

Этот пример взят за большой учебник по яйцам here.

+5

Это не то, что мы хотим. Нам нужно что-то вроде цвета Sass: $ g-main-color' или в пользовательских свойствах CSS 'color: var (-g-main-color)' и всякий раз, когда мы решаем изменить значение свойства, например. что-то вроде JS 'updateVariable ('g-main-color', '# 112a4f')' динамически обновляет значение везде. Все это, пока приложение работает. – HoBi

2

Я сделал this plunker, чтобы изучить один из способов сделать то, что вы хотите.

Здесь я получаю mystyle от родительского компонента, но вы можете получить его из службы.

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

Я должен иметь возможность изменять стили любых хостов и дочерних элементов, которые я не могу с вашим решением, и это своего рода беспорядочные стили записи из-за пределов «области CSS». Взгляните на EDIT 2. КПП. вместо того, чтобы брать цвет от ввода через атрибут, было бы лучше просто импортировать некоторый класс и использовать переменную из него, потому что мне нужны глобальные переменные для всего приложения. ;) – HoBi

53

1) Использование встроенных стилей

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

2) Используйте несколько отображение классов CSS, что вы хотите и переключить классы, как:

/* 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"> 

образцы кода от: https://angular.io/cheatsheet

Дополнительная информация о директиве ngClass: https://angular.io/docs/ts/latest/api/common/index/NgClass-directive.html

+2

Это может сработать, но есть одна проблема - вам нужно отделить динамические стили от файла CSS, что никогда не будет лучшим способом. :(Мне хотелось бы иметь что-то внутри CSS, но мне, вероятно, придется справиться с этим. – HoBi

+0

Я не понимаю. Используйте SASS/LESS. Для динамических стилей из JavaScript я могу их видеть. В любом случае вы не можете смешайте статические и динамические стили, если вы не ошибаетесь. Статический: css. Динамический: JavaScript. –

+0

Я действительно говорил, что было бы неплохо иметь что-то вроде труб Angular2 - возможность писать его внутри файла или области CSS. вероятно, невозможно, поэтому мне придется сделать это, как вы писали в 1), и, возможно, просто добавьте комментарий в файл Sass, что используется (или должна быть) глобальная переменная извне. – HoBi