I have a mat-form-field with input that I am wanting to add a custom style to, however I cannot find any documentation regarding this on the official Angular Material website.
My eventual goal is to:
- Change the underline colour after the input box is selected
- Remove the floating label (if possible - I know this was a feature but now deprecated).
I'm not the most adept with Angular just yet, but if things need changing in JS, then I can always give it my best shot.
I just need a little guidance.
Current Code:
<form class="search-form">
<mat-form-field class="example-full-width">
<input class="toolbar-search" type="text" matInput>
<mat-placeholder>Search</mat-placeholder>
<mat-icon matSuffix style="font-size: 1.2em">search</mat-icon>
</mat-form-field>
</form>
Current CSS:
// Change text colour when inputting text
.toolbar-search, mat-placeholder {
color: white;
}
// Changes the underline and placeholder colour before input is selected
/deep/ .mat-input-underline {
background-color: white;
}
From my understanding, both features seem to be in MatFormField.
[floatLabel]
for FloatLabelType ('never', 'always', 'auto'
), applied using input[color]
, however you can only select colors from your theme ('primary', 'accent', 'warn'
). For more on how to setup the theme go to their website here,You can use the css selector you use below:
The /deep/ combinator is slated for deprecation in Angular, so its best to do without it. Unfortunately, the .mat-input-underline from Angular Material is highly specified, which makes it very difficult to override without using /deep/
The best way I have found is to use an ID, which allows you a higher specificity compared to the default Angular Material styles.
Then, your 'search-form' id can be used to target the input. You can't target the mat-form-field-underline in the component.scss without breaking your view encapsulation. It's easier to do this at the global level, by adding this to your global.scss
global.scss:
I hope the Angular Material team pulls back their specificity in the future, because currently there's no easy way to override their defaults.
For change the styles of material inputs with scss:
Standard:
Focused: (when selected)
Invalid:
DEMO
you can also use
ViewEncapsulation.None
to avoid::ng-deep
which is deprecated: