Angular2 动态变化 CSS 属性
Angular2 dynamic change CSS property
我们正在制作一个 Angular2 应用程序,我们希望能够以某种方式创建一个全局 CSS 变量(并更新属性的值每当分配变量时更改)。
我们使用 Polymer 有一段时间了(现在我们正在切换到 Angular2 个组件)并且我们使用了 CSS 属性(Polymer 有一些 polyfill)并且我们有只需使用 Polymer.updateStyles()
.
更新样式
有什么办法可以实现类似的功能吗?
编辑:
我们想要类似于 Sass color: $g-main-color
或 CSS 自定义属性 color: var(--g-main-color)
的东西,每当我们决定更改 属性 的值时,例如像 updateVariable('g-main-color', '#112a4f')
这样的东西,它会动态更新所有地方的值。所有这一切,而一个应用程序是 运行.
编辑 2:
我想在 CSS 的不同部分(主机、子元素...)使用一些全局 CSS 变量,并且能够立即更改值 - 所以如果我更改我的- 颜色变量,它在应用程序中随处变化。
我将使用 Sass 语法,例如:
:host { border: 2px solid $my-color }
:host .some-label { color: $my-color }
是否可以使用 Angular 管道之类的东西? (但据说它只适用于 HTML)
:host { border: 2px solid {{ 'my-color' | cssvariable }} }
:host .some-label { color: {{ 'my-color' | cssvariable }} }
你没有任何示例代码,但我想你想做这样的事情?
@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
的值并且输入的 class 正在更改。
这是 class 名称的示例,但实际上您可以对 css 属性做同样的思考。
我希望这就是你的意思。
这个例子取自很棒的 egghead 教程 here。
我 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 {}
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
只需使用标准 CSS 变量:
你的全局css(例如:styles.css)
body {
--my-var: #000
}
在您的组件的 css 或其他任何内容中:
span {
color: var(--my-var)
}
然后你可以通过将内联样式设置为html元素来直接使用TS/JS更改变量的值:
document.querySelector("body").style.cssText = "--my-var: #000";
否则你可以使用jQuery:
$("body").css("--my-var", "#fff");
Angular 6 + 艾莉尔 UI
使用 Alyle UI 您可以动态更改样式
@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);
}
}
我们正在制作一个 Angular2 应用程序,我们希望能够以某种方式创建一个全局 CSS 变量(并更新属性的值每当分配变量时更改)。
我们使用 Polymer 有一段时间了(现在我们正在切换到 Angular2 个组件)并且我们使用了 CSS 属性(Polymer 有一些 polyfill)并且我们有只需使用 Polymer.updateStyles()
.
有什么办法可以实现类似的功能吗?
编辑:
我们想要类似于 Sass color: $g-main-color
或 CSS 自定义属性 color: var(--g-main-color)
的东西,每当我们决定更改 属性 的值时,例如像 updateVariable('g-main-color', '#112a4f')
这样的东西,它会动态更新所有地方的值。所有这一切,而一个应用程序是 运行.
编辑 2:
我想在 CSS 的不同部分(主机、子元素...)使用一些全局 CSS 变量,并且能够立即更改值 - 所以如果我更改我的- 颜色变量,它在应用程序中随处变化。
我将使用 Sass 语法,例如:
:host { border: 2px solid $my-color }
:host .some-label { color: $my-color }
是否可以使用 Angular 管道之类的东西? (但据说它只适用于 HTML)
:host { border: 2px solid {{ 'my-color' | cssvariable }} }
:host .some-label { color: {{ 'my-color' | cssvariable }} }
你没有任何示例代码,但我想你想做这样的事情?
@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
的值并且输入的 class 正在更改。
这是 class 名称的示例,但实际上您可以对 css 属性做同样的思考。
我希望这就是你的意思。
这个例子取自很棒的 egghead 教程 here。
我 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 {}
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
只需使用标准 CSS 变量:
你的全局css(例如:styles.css)
body {
--my-var: #000
}
在您的组件的 css 或其他任何内容中:
span {
color: var(--my-var)
}
然后你可以通过将内联样式设置为html元素来直接使用TS/JS更改变量的值:
document.querySelector("body").style.cssText = "--my-var: #000";
否则你可以使用jQuery:
$("body").css("--my-var", "#fff");
Angular 6 + 艾莉尔 UI
使用 Alyle UI 您可以动态更改样式
@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);
}
}