问题
I'm trying to customize mat-select with multiple checkboxes. for some reason the panel get wrong min-width as below:
and I don't know where its calculating this min-width. also I tried to add panelClass and override the min-width from this class, for example:
<mat-select #multipleSelect (selectionChange)="selectItem($event.value)" panelClass="multiple-panel" multiple>
&.multiple-panel {
min-width: 200px !important;
}
but when opening the dropdown its open with the original width (like in the pic) and after few millisecond"jump" to the custom min-width defined on the panel class.
I find the mat-select very hard to style. anybody knows how to solve this problem?
回答1:
You can style your mat-select
dialog box by giving a panel class (as you mentioned).
Please follow this demo : https://stackblitz.com/edit/angular-matselect-style?file=src/styles.css
to see the styled mat-select
components.
Reason :
- Reason for the delay is that angular for dialog-boxes, create a
cdk-overlay-pane
inside thecdk-overlay-container
container, So in case ofmat-select
it provides a min-width of 180px, which is overridden by our panel class in the slight delay. - Yes, there is a slight delay in opening of dialog box and customizing its width to the specified width provided in the panel class. But the delay is acceptable in the project that i was working on.
So, you can find the demo for styling themat-select
component, as i have provided 2 components and you can modify any css properties. - Try to use styles using
::ng-deep
or:host >>>
, if not finding any luck,
please paste the styles instyle.css
.
Update 1 :
Tried css animations
, and opacity
for making smooth opening of the mat-select
options.
.panel-class-applied-on-mat-select {
animation-name: opacityDelay !important;
animation-duration: 0.3s !important;
}
@keyframes opacityDelay {
0% {opacity: 0;}
25% {opacity: 0;}
50% {opacity: 0;}
75% {opacity: 0;}
100% {opacity: 1;}
}
Updated StackBlitz Demo
回答2:
I used another approach. Just added this piece of code to global style.
.mat-select-panel {
// some your code
&.ng-animating {
visibility: hidden;
}
}
You can try this solution on
DEMO StackBlitz.
Hack with opacity did not fix jumping width when select is closing.
回答3:
You'll need to change viewEncapsulation to none at your component decorator.and then add following css to remove the transition effect.Have a look at viewencapsulation in angular docs https://angular.io/guide/component-styles#view-encapsulation.
@Component({
selector: 'app-selector',
templateUrl: './template.html',
styleUrls: ['./template.css'],
encapsulation: ViewEncapsulation.None
})
//CSS
.cdk-overlay-connected-position-bounding-box .cdk-overlay-pane .mat-select-panel.ng-animating {
display: none;
}
回答4:
Try this way : define a panel class for your mat-select in the code and then in the global/app styling file just add:
.panel-class-name .mat-select-panel {
// add your styling here
}
It worked for me to add some component specific styling for material components.
来源:https://stackoverflow.com/questions/53092399/mat-select-panel-min-width