Angular2动态更改CSS属性


72

我们正在制作一个Angular2应用程序,我们希望能够以某种方式创建一个全局CSS变量(并在分配变量时每当更改时更新属性的值)。

我们使用Polymer已有一段时间(现在我们要切换到Angular2组件),并且使用CSS属性(Polymer具有一些polyfill),并且仅使用来更新样式Polymer.updateStyles()

有什么方法可以实现类似的功能?

编辑:

我们想要类似于Sasscolor: $g-main-color或CSS自定义属性的东西,color: var(--g-main-color)并且每当我们决定更改属性的值时(例如,类似updateVariable('g-main-color', '#112a4f')它的东西都会在任何地方动态更新值)。应用运行时的所有情况。

编辑2:

我想在CSS的不同部分(主机,子元素...)中使用一些全局CSS变量,并能够立即更改该值-因此,如果我更改my-color变量,它将在应用程序中随处更改。

我将使用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 }} }

2
我很想知道您采取了什么方法。我们有类似的要求。
Yousuf

我对此仍然没有解决方案。今天唯一可取的方法可能是将CSS变量与某种类型的
polyfill

您是否知道可以在angular2中使用任何polyfill替换变量?
Yousuf

是否有理由使用ngStyle绑定对象不起作用?这些对象可以来自任何地方,您可以在运行时随意更改它们。这样,您不必事先知道属性或值,只需构造一个对象,将其分配给元素绑定到的值,即可进行更改。这意味着您可以将任何种类的预制,静态或编译后的CSS排除在外。如果那不好,您总是可以将所有元素绑定到innerHTML,并通过应用动态创建的样式化跨度来更改innerHTML。
Tim Consolazio

Answers:


21

只需使用标准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");

2
这正是我想要的,谢谢分享
Noopur Dabhi 18/12/15

当使用Angular 2.0+时,不是直接使用DOM操作和jQuery是最后的选择吗?
巨麋

看看这个,来自Angular的Renderer2文档:angular.io/api/core/Renderer2
巨麋鹿

@GiantElk对,但我只是更改CSS变量值。由于在ngStyle中不支持绑定CSS变量,因此我认为这实际上是最简单的解决方案。就我个人而言,我永远不会使用像Renderer这样的困难的API来更改变量的值。
Monkeythedev '19

69

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里面的东西,但我将不得不可能处理它。
tenhobi

我不明白 使用SASS / LESS。对于JavaScript中的动态样式,我只能看到它们。无论如何,除非做错了,否则不能混合使用静态样式和动态样式。静态:css。动态:JavaScript。
Gerard Sans 2015年

我确实说过,拥有Angular2管道之类的东西非常好-能够在CSS文件或区域中编写它。但这可能是不可能的,所以我将不得不像您在1)中编写的那样进行操作,也许只是在Sass文件中添加注释,以便从外部使用(或应该是)全局变量。
tenhobi

如果您喜欢冒险,可以采取一个步骤来采用SASS并输出一个可以导入^ _ ^的JS模块
Gerard Sans 2015年

对于其中有数字的变量没有用,您不想创建10000个类
Milad

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属性进行相同的思考。

我希望这就是你的意思。

此示例是此处出色的Egghead教程的示例。


5
那不是我们想要的。我们想要Sasscolor: $g-main-color或CSS自定义属性中的内容,color: var(--g-main-color)并且每当我们决定更改属性的值时(例如JSupdateVariable('g-main-color', '#112a4f')之类的东西),它都会在任何地方动态更新值。应用运行时的所有情况。
tenhobi,2015年

2

我做了这个小伙子,探索一种做自己想要的方法。

在这里,我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 {}

我必须能够更改宿主和子元素的样式,而这对于您的解决方案是无法实现的,而且它是“ CSS区域”之外的一种凌乱的书写样式。看一下EDIT2。顺便说一句。与其通过属性从输入中获取颜色,不如直接导入一些类并从中使用变量,因为我想要整个应用程序的全局变量。;)
tenhobi

-2

Angular 6 + Alyle用户界面

借助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);
  }
}

Github仓库


问题是关于Dart的问题。我想这行不通。
君特Zöchbauer
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.