Свойство CSS динамического изменения Angular2
мы приложение Angular2 и мы хотим иметь возможность каким-то образом создать глобальную переменную CSS (и обновлять значения свойств при каждом изменении, когда переменная назначается).
некоторое время мы использовали полимер (теперь мы переходим на компоненты Angular2), и мы использовали свойства CSS (полимер имеет некоторые полифилл), и мы просто обновили стили с помощью 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 }} }
5 ответов:
просто используйте стандартные переменные CSS:
ваш глобальный css (например: стили.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");
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
у вас нет ни одного примера кода, но я предполагаю, что вы хотите сделать что-то подобное?
@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.
Я надеюсь, что это то, что вы означало.
этот пример взят для великого учебника egghead здесь.
Я этот 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 {}
угловой 6 + Alyle UI
С помощью ALYLE UI вы можете динамически изменять стили
здесь a demo stackblitz
@NgModule({ declarations: [ AppComponent ], imports: [ BrowserModule, CommonModule, FormsModule, HttpClientModule, BrowserAnimationsModule, AlyleUIModule.forRoot( { name: 'myTheme', primary: { default: '#00bcd4' }, accent: { default: '#ff4081' }, scheme: 'myCustomScheme', // myCustomScheme from colorSchemes lightGreen: '#8bc34a', colorSchemes: { light: { myColor: 'teal', }, dark: { myColor: '#FF923D' }, myCustomScheme: { background: { primary: '#dde4e6', }, text: { default: '#fff' }, myColor: '#C362FF' } } } ), LyCommonModule, // for bg, color, raised and others ], bootstrap: [AppComponent] }) export class AppModule { }Html
<div [className]="classes.card">dynamic style</div> <p color="myColor">myColor</p> <p bg="myColor">myColor</p>для изменения типа
import { Component } from '@angular/core'; import { LyTheme } from '@alyle/ui'; @Component({ ... }) export class AppComponent { classes = { card: this.theme.setStyle( 'card', // key () => ( // style `background-color: ${this.theme.palette.myColor};` + `position: relative;` + `margin: 1em;` + `text-align: center;` ... ) ) } constructor( public theme: LyTheme ) { } changeScheme() { const scheme = this.theme.palette.scheme === 'light' ? 'dark' : this.theme.palette.scheme === 'dark' ? 'myCustomScheme' : 'light'; this.theme.setScheme(scheme); } }