根据变量angular生成动态css

IT技术 javascript css angular typescript angular2-template
2021-03-03 06:18:59

我正在使用 angular 4 开发一个管理面板,并尝试集成一个部分来自定义样式,如更改颜色、bg 等。我已经开发了一个部分来保存数据库中的设置,使用 API 将它们作为 json 加载到应用程序中。

现在我正在尝试使用来自 json 的值生成动态 css,我尝试在主要组件中使用以下代码但它不起作用

@Component({
      templateUrl: 'card.html',
      styles: [`
        .card {
          height: 70px;
          width: 100px;
          color: {{css.cardColor}};
        }
      `],
})

我不确定应该如何在组件中加载 css 值并在样式标签中使用它们。我没有找到任何其他解决方案。

另一种方法是使用角度动画概念,但 css 将是巨大的,并且不可能使用触发器和所有的角度动画来实现它。我相信有一个解决方案,因为它似乎是一个真正的要求,应该由许多其他开发人员完成。

任何帮助都是可观的。

编辑:不能使用 ngStyle 作为其将应用于几乎所有元素作为整个应用程序,而不仅仅是特定元素。

6个回答

您可以使用 ngStyle 将 css 从 json 动态添加到您的页面。

<div [ngStyle]="{'color': variable ? 'red' : 'blue'}"></div>

另一个相同的例子可以是

 <div md-card-avatar [ngStyle]="{'background-image': 'url(' + post.avatar + ')', 'background-size': 'cover'  }"></div>

在这里,我从 json 加载了背景图像

这是一个很好的建议 Ajinkya 但正如我提到的,它将是一个巨大的 css,并将应用于几乎所有元素。所以不能使用 ngStyle
2021-04-26 06:18:59
@Vikram,已经为此https://github.com/angular/angular/issues/7108提交了一个问题, 还有一些建议,这可能对您有所帮助
2021-05-13 06:18:59

angular 中可用的直接方法是使用 ngstyle,如下所示

<div [ngStyle]="{'color': style.colorVal ? style.colorVal : '#000', 'font-size' : style.fontSize ? style.fontSize : '16px' }"></div>

在经历了不同的方法并尝试将动态 css 添加到 angular 应用程序的所有页面后,我最终得到了以下解决方案。

要求:根据返回的值和 API 生成动态 css 以更改设计和样式。

解决方案 :

  1. 创建一个新组件并创建一个服务来从 API 加载动态 css 变量。
  2. 在模板文件中添加样式标签并为属性使用变量值。
  3. 在所有页面或主模板上加载此模板。
  4. 在应用程序构建样式将移动到 head 标签。

代码示例

import { CssService} from './Css.service';

@Component({
  selector: 'DynamicCss',
  templateUrl: './DynamicCss.component.html',
  styleUrls: ['./DynamicCss.component.scss']
})
export class ServiceProviderComponent implements OnInit {
    cssVariables: any;
    constructor(private cssService:CssService){
        /* call the service/api to get the css variable values in cssVariables */

    }
}

现在使用 jquery 或 javascript 应用 css 以在如下函数的帮助下附加 css

appendCss(customData)
{
     let text = '.custom-form-1 {
            background-image: url("`+customData.background_image+`");
         }';
     $(document).ready(function(){
         $("style").append(text);
      });
}

并像我一样从服务或其他变量加载自定义数据后调用此函数 ngOnInit

ngOnInit(){
 this.appendCss(this.customizeFormData);
}

它使用 jquery,但如果您不想在 Angular 应用程序中使用 jquery,也可以使用 javascript/typescript 完成

其他有用的资源 https://github.com/angular/angular/issues/9343#issuecomment-312035896

我只是用 Angular 4 和 Angular CLI ~1.6.0 尝试过这个,但没有用,但这有效:github.com/angular/angular/issues/9343#issuecomment-312035896
2021-04-20 06:18:59
你能发布一些这个解决方案的代码示例吗?这看起来是一个非常好的解决方案。
2021-05-05 06:18:59
您应该在此处发布代码解决方案。你能展示一下你如何使用 css 样式属性中的变量值吗?
2021-05-10 06:18:59
这个答案是不完整的。
2021-05-10 06:18:59
@NinjaCoding 在什么方面它是不完整的?
2021-05-14 06:18:59

您只能绑定style.color

<div class="card" [style.color]="cardColor">lorem ipsum</div>

ngClass 用于设置变量值的动态类基础,如下所示

Ts 文件组件:

@Component ({
    selector:'simple-comp',
    template:`   <ol class="breadcrumb">
        <li *ngClass="{'active': step==='step1'}" (click)="step='step1; '">Step1</li>
        <li *ngClass="{'active': step==='step2'}"  (click)="step='step2'">Step2</li>
        <li *ngClass="{'active': step==='step3'}" (click)="step='step3'">Step3</li>
       </ol>`
})

export class SimpleComponent {
    public step: string = 'step1'; // change value like step1, step2, step3
}

HTML代码:

<some-element [ngClass]="{'first': true, 'second': true, 'third': false}">
 ...
</some-element>

我想动态设置嵌套在组件中的元素的样式(特别是http://tb.github.io/ng2-nouislider/),因此与 OP 类似,ngStyle 不适合。

我的方法是在我的模板 ( https://angular.io/api/core/ViewChild ) 中使用一个引用变量来访问组件的本机元素并使用 querySelector ( https://developer.mozilla .org/en-US/docs/Web/API/Document/querySelector)。

然后使用 Renderer 2 应用所需的样式。 下面和https://stackblitz.com/edit/angular-r3bs1d上的示例

import { Component, Renderer2, ViewChild, AfterViewInit } from '@angular/core';

@Component({
    selector: 'my-app',
    templateUrl: './app.component.html',
    styleUrls: [ './app.component.css' ]
})

export class AppComponent implements AfterViewInit  {
    backgroundColour = '#ff0000';
    constructor(private renderer: Renderer2) { }
    @ViewChild('parent', { static: false }) parent;
    ngAfterViewInit(){
        this.renderer.setStyle(this.parent.nativeElement.querySelector('.child'), 'background', this.backgroundColour);
    }
}

HTML:

<div #parent>
    <div class="child">Child Element</div>
</div>

至少对于较小的样式更改,我认为这是一个可行的解决方案。