【问题标题】:Generate dynamic css based on variables angular基于变量angular生成动态css
【发布时间】:2018-02-13 07:24:28
【问题描述】:

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

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

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

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

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

任何帮助都是可观的。

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

【问题讨论】:

  • 我认为这将是一个很好的功能请求。

标签: javascript css angular typescript angular2-template


【解决方案1】:

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

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

另一个例子:

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

这里我已经从 json-data 加载了背景图片。

【讨论】:

  • 这是一个很好的建议 Ajinkya 但正如我所提到的,它将是一个巨大的 css,并将应用于几乎所有元素。所以不能使用ngStyle
  • @Vikram,已经为这个https://github.com/angular/angular/issues/7108提交了一个问题,还有一些建议,这可能对你有帮助
【解决方案2】:

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>

【讨论】:

    【解决方案3】:

    你只能绑定style.color:

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

    【讨论】:

      【解决方案4】:

      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

      【讨论】:

      • 您应该在此处发布代码解决方案。能否请您说明如何使用 CSS 样式属性中的变量值?
      • 您能发布一些此解决方案的代码示例吗?这看起来是一个非常好的解决方案。
      • 我刚刚在 Angular 4 和 Angular CLI ~1.6.0 中尝试过这个,但没有成功,但它有效:github.com/angular/angular/issues/9343#issuecomment-312035896
      • 这个答案不完整。
      • @NinjaCoding 它在什么方面不完整?
      【解决方案5】:

      我想为嵌套在组件中的元素动态设置样式,(特别是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>
      

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

      【讨论】:

        【解决方案6】:

        后台使用,颜色使用JSON方式:

        <ion-list-header class="background-size"
        [ngStyle]="{'background-image': 'url(' + data.headerImage + ')'}"
        *ngIf="data.headerImage != null">
        

        【讨论】:

        • 虽然此代码可以解决 OP 的问题,但最好包含关于您的代码如何解决 OP 问题的说明。这样,未来的访问者可以从您的帖子中学习,并将其应用到他们自己的代码中。 SO 不是编码服务,而是知识资源。此外,高质量、完整的答案更有可能得到支持。这些功能,以及所有帖子都是独立的要求,是 SO 作为一个平台的一些优势,使其与论坛区分开来。您可以编辑以添加其他信息和/或使用源文档补充您的解释。
        • 您或其他人能否解释一下:“JSON 方法用于颜色”
        猜你喜欢
        • 2020-03-29
        • 2018-01-07
        • 2012-10-28
        • 1970-01-01
        • 2019-12-10
        • 1970-01-01
        • 2020-07-17
        • 1970-01-01
        • 2012-05-30
        相关资源
        最近更新 更多