23

I'm trying to do this, but is looks like it is only possible to change it to primary or warn.

0

10 Answers 10

42

The proper way to control colors of Angular Material elements is to use differrent pallettes, but the functionality is limited. If you want more control, you can add custom CSS, and in most cases you will need to use ::ng-deep to force your styles to apply, for example:

::ng-deep .mat-checkbox .mat-checkbox-frame {
  border-color: violet;
}

Here is a DEMO, where I changed the color of the border and background when it checked. You can follow this way to implement any styling you want.

If you're not familiar with ::ng-deep and don't really understand, when you need it, you can look through THIS short answer.

UPDATE 1

There is another one way via encapsulation disabling (thanks to @Ventura). It has a right to exist, but be careful if you decided to disable encapsulation, don't confuse with stylesheets, because it behaves differently from what you expect from default Angular logic regarding CSS.

For more info: https://coryrylan.com/blog/css-encapsulation-with-angular-components

SO answer: https://stackoverflow.com/a/54981478/6053654

UPDATE 2

The method is deprecated, see more info HERE or HERE.

Sign up to request clarification or add additional context in comments.

8 Comments

Thank you two. This is what I have done: ::ng-deep .mat-checkbox-checked.mat-accent .mat-checkbox-background, .mat-checkbox-indeterminate.mat-accent .mat-checkbox-background, .mat-accent .mat-pseudo-checkbox-checked, .mat-accent .mat-pseudo-checkbox-indeterminate, .mat-pseudo-checkbox-checked, .mat-pseudo-checkbox-indeterminate { background-color:green !important; }
deep is deprecated.
@Ventura Is there any analog for now?
@CommercialSuicide here is the solution that I found: stackoverflow.com/a/54981478/783364 not sure if it's the best one but if you are careful with global css stuff it should be just fine.
@ararb78, that's right, but what if we need to customize AM styles? Do we have such an option in other ways? View encapsulation disabling is not ideal btw
|
11

You may use this:

::ng-deep .mat-checkbox-checked.mat-accent .mat-checkbox-background, .mat-checkbox-indeterminate.mat-accent .mat-checkbox-background, .mat-accent .mat-pseudo-checkbox-checked, .mat-accent .mat-pseudo-checkbox-indeterminate, .mat-pseudo-checkbox-checked, .mat-pseudo-checkbox-indeterminate {
    background-color: red !important; /* Red background for example */
}

2 Comments

If you are using a newer version of Angular: Use /deep/ instead for ::ng-deep
deep is deprecated.
6

You can use this code to change its box and its check icon:

/*  In case of using Angular 9+, Replace /deep/ with ::ng-deep */

/deep/ .mat-checkbox.mat-accent {
  .mat-checkbox-frame {
    border: 1px solid dodger-blue;
  }

  &.mat-checkbox-checked .mat-checkbox-background {
    background-color: white;
    border: 1px solid dodger-blue;
  }

  .mat-checkbox-checkmark-path {
    stroke: dodger-blue !important;
  }
}

Angular Material Version: "7.0.0"

1 Comment

It works, just Replace '/deep/' with '::ng-deep' for Angular 9+ versions.
2

These answers didn't work for me for indeterminate boxes. Following did:

::ng-deep .mat-checkbox-checked .mat-checkbox-background,
::ng-deep .mat-checkbox-indeterminate .mat-checkbox-background {
  background-color: #222d32 !important;
}

Comments

0

Use this on your css.

::ng-deep .mat-primary .mat-pseudo-checkbox-checked {
    background: red;
}

You should use ::ng-deep otherwise it will not work.

On your Html, use like this,

<mat-form-field>
  <mat-select placeholder="values" [formControl]="val" multiple>
    <mat-option *ngFor="let v of values" [value]="v">{{v.text}}</mat-option>
  </mat-select>
</mat-form-field>

Comments

0
::ng-deep .mat-checkbox-checked.mat-accent .mat-checkbox-background,.mat-checkbox-indeterminate.mat-accent .mat-checkbox-background {
    background-color: #005691;
  }

1 Comment

Code-only answers are discouraged on Stack Overflow because they don't explain how it solves the problem. Please edit your answer to explain what this code does and how it answers the question, so that it is useful to the OP as well as other users with similar issues.
0

I was specifically interested in changing the color of the frame around the checkbox and the label text. This worked for me:

div.mat-checkbox-frame {
    border-color: red;
}

span.mat-checkbox-label {
    color: red;
}

Comments

0

Had to do this, slight variation of other answers:

::ng-deep .mat-pseudo-checkbox.mat-pseudo-checkbox-checked {
  background: $my-colour;
}

Comments

0

You can use

.mat-checkbox-ripple .mat-ripple-element,
.mat-checkbox-checked.mat-accent .mat-checkbox-background {
  background-color: $your-color-code !important;
}

Comments

0

I'm using Angular 20, which comes with the Angular Material Token API for customizing component styles. As you might already know, for most components, you can use SCSS mixins to override their colors and states, like this:

@use '@angular/material' as mat;

:root {
  @include mat.select-overrides((
    focused-arrow-color: red
  ));
}

But for <mat-pseudo-checkbox>, there isn't a mixin or API like there is for other components. If you inspect the checkbox, you'll see the checked state uses:

background-color: var(--mat-pseudo-checkbox-full-selected-icon-color, var(--mat-sys-primary));

Instead of using a mixin, you just define the variable it uses for the background color in your SCSS:

:root {
  --mat-pseudo-checkbox-full-selected-icon-color: #db3747;
}

So, just set the variable directly to customize the color.
Hope this helps!

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.