Angular Material 组件中的语义颜色

问题描述 投票:0回答:2

我的 Angular Material v18 应用程序允许用户设置其主题,但一个组件组(“订单控件”)具有“购买”和“出售”两种语义颜色(如天气应用程序中的“冷”和“热”)与主题无关。 这是一个 HTML 版本,它做了它应该做的事情,后面跟着一个不改变颜色的 Angular Material 部分

如何让 Angular Material 订单控件在选择“买入/卖出”时更改语义颜色,与 HTML 版本类似?

这是 HTML 版本:

<div class="order-control">
  <div>
    <span [class]="buyColor()" (click)="isSell=false">BUY</span>
    <span [class]="sellColor()" (click)="isSell=true">SELL</span>
  </div>
  <div>
    <label for="units">Units</label>
    <input
      [class]="getColor()"
      type="range"
      id="units"
      name="units"
      [min]="unitsMin"
      [max]="unitsMax"
      [(ngModel)]="units"/>
  </div>
  <div>
    <label for="price">Price</label>
    <input
      [class]="getColor()"
      type="range"
      id="price"
      name="price"
      [min]="priceMin"
      [max]="priceMax"
      [(ngModel)]="price"/>
  </div>
  <div>
    <button [class]="getColor()" type="button">Submit order</button>
  </div>
</div>

这里有一个与 Angular Material 类似的版本,但是当选择订单“一侧”(即买入或卖出)时,切换按钮、滑块和提交按钮的颜色应该发生变化:

<div class="order-control">
  <div>
    <mat-button-toggle-group name="side" [(ngModel)]="isSell">
      <mat-button-toggle [value]="false">BUY</mat-button-toggle>
      <mat-button-toggle [value]="true">SELL</mat-button-toggle>
    </mat-button-toggle-group>
  </div>
  <div>
    <label for="units">Units</label>
    <mat-slider
      [max]="unitsMax"
      [min]="unitsMin"
      [step]="unitsStep"
      discrete showTickMarks>
      <input matSliderThumb [(ngModel)]="units" #unitsSlider />
    </mat-slider>
  </div>
  <div>
    <label for="price">Price</label>
    <mat-slider
      [max]="priceMax"
      [min]="priceMin"
      [step]="priceStep"
      discrete showTickMarks>
      <input matSliderThumb [(ngModel)]="price" #priceSlider />
    </mat-slider>
  </div>
  <div>
    <button mat-flat-button>Submit Order</button>
  </div>
</div>

CSS

.order-control {
  display: flex;
  flex-direction: column;
  justify-content: center;

  .sell {
    color: red;
    accent-color: red;
  }

  .buy {
    color: blue;
    accent-color: blue;
  }
}

TypeScript

@Component({
  selector: 'app-root',
  standalone: true,
  imports: [ FormsModule, MatButtonModule, MatButtonToggleModule, MatSliderModule ],
  templateUrl: './main.html',
  styleUrl: './main.css',
})
export class App {
  isSell: boolean = false;

  units = 1;
  unitsMin = 1;
  unitsMax = 10;
  unitsStep = 1;

  price = 500;
  priceMin = 0;
  priceMax = 1000;
  priceStep = 25;

  buyColor() {
    return this.isSell ? '' : 'buy';
  }

  sellColor() {
    return this.isSell ? 'sell' : '';
  }

  getColor() {
    return this.isSell ? 'sell' : 'buy';
  }
}

这是工作示例

css angular angular-material
2个回答
0
投票

我建议不要这样做,因为它会破坏设计:当你实现一个设计系统时,没有“独立组件”,它应该全部遵循提供的设计。

话虽这么说,只要有条件地申请你的课程就可以了?

<mat-button-toggle [value]="true" [class.sell]="isSell">SELL</mat-button-toggle>

0
投票

您可以尝试为特定组件创建自定义主题,如下所示

@use '@angular/material' as mat;
@include mat.core();

$custom-palette: (
  50: var(--Your-colors),
  ...
)
 
$custom-primary: mat.define-palette($custom-palette, 500)

$theme: mat.define-light-theme((
  color: (
    primary: $custom-primary,
    accent: $custom-accent,
  ),
))


$buy: mat.define-palette($theme, 500)

@include mat-button-theme($buy)

.buy-theme {
  @include mat-button-theme($buy);
}

然后在此处添加分配CSS变量的逻辑

--Your-colors

© www.soinside.com 2019 - 2024. All rights reserved.