Свойство 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); } }