如何将自定义样式应用于 mat-menu 内容?
How can I apply custom styles to the mat-menu content?
我使用垫子菜单过滤自定义 table 组件中的列。在垫子菜单中,我有一个我想要设置样式的搜索输入。
我试过:
class
panelClass
backdropClass
但没有成功。我想指出,如果我将样式放在主 style.scss 文件中,css 将应用于输入字段。但我想用另一种方式解决它,将 css 放在组件文件中。
这是我的代码:
<mat-menu #menu>
<div fxLayout="row wrap" fxFlex="100">
<div stop-propagation fxFlex="90" fxFlexOffset="5">
<div class="input-container">
<input id="inputSearch" class="search-input" type="text" autocomplete="off"
placeholder="{{ 'Ricerca...' | translate }}" [(ngModel)]="searchValue" (keyup)="filterValue(col.key)">
</div>
<mat-selection-list class="selectList" #select [id]="col.key"
(selectionChange)="selecteChange($event, col.key)" class="maxHeight300">
<ng-container *ngIf="conditionsList && conditionsList.length > 0; else noOptions">
<mat-list-option color="primary" [checkboxPosition]="'before'" *ngFor="let condition of conditionsList"
[value]="condition">
{{ condition }}
</mat-list-option>
</ng-container>
<ng-template #noOptions>
<span fxLayoutAlign="center center" [innerHTML]="'Nessun risultato' | translate"></span>
</ng-template>
</mat-selection-list>
</div>
<div fxFlex="90" fxFlexOffset="5" fxLayout="row" fxLayoutAlign="space-between center"
*ngIf="conditionsList && conditionsList.length > 0" class="marginBottom10">
<button fxFlex="49" mat-raised-button (click)="clearColumn(col.key)">Pulisci</button>
<button fxFlex="49" mat-raised-button color="primary" (click)="applyFilter(col.key)">Filtra</button>
</div>
</div>
</mat-menu>
和css
.search-input {
width: 100%;
-webkit-transition: -webkit-box-shadow 0.3s;
transition: -webkit-box-shadow 0.3s;
transition: box-shadow 0.3s;
transition: box-shadow 0.3s, -webkit-box-shadow 0.3s;
font-size: 16px;
line-height: 22px;
padding: 10px;
background-color: white;
border-radius: 6px;
-webkit-box-sizing: border-box;
box-sizing: border-box;
display: block;
border: 1px solid grey;
box-shadow: 0px 4px 8px 0px rgb(0 0 0 / 10%), 0px 2px 5px 0px rgb(0 0 0 / 8%);
}
根据问题的评论:
由于 MatMenu(以及通常在下面使用的 CdkOverlay)的实例化方式,样式必须在全局范围内才能影响覆盖层中呈现的内容。它们可以放在不同的文件中,但它们必须以某种方式穿透组件级别。
这意味着可以使用以下之一设置样式:
- 使用
::ng-deep
(已弃用,但仍然有效)选择器刺穿组件
- 使用
ViewEncapsulation.None
将组件样式表提升到全局级别
- 在全局中放置样式 styles.scss
stacblitz here 中提供了使用 ::ng-deep
和问题样式的示例。
我使用垫子菜单过滤自定义 table 组件中的列。在垫子菜单中,我有一个我想要设置样式的搜索输入。 我试过:
class
panelClass
backdropClass
但没有成功。我想指出,如果我将样式放在主 style.scss 文件中,css 将应用于输入字段。但我想用另一种方式解决它,将 css 放在组件文件中。 这是我的代码:
<mat-menu #menu>
<div fxLayout="row wrap" fxFlex="100">
<div stop-propagation fxFlex="90" fxFlexOffset="5">
<div class="input-container">
<input id="inputSearch" class="search-input" type="text" autocomplete="off"
placeholder="{{ 'Ricerca...' | translate }}" [(ngModel)]="searchValue" (keyup)="filterValue(col.key)">
</div>
<mat-selection-list class="selectList" #select [id]="col.key"
(selectionChange)="selecteChange($event, col.key)" class="maxHeight300">
<ng-container *ngIf="conditionsList && conditionsList.length > 0; else noOptions">
<mat-list-option color="primary" [checkboxPosition]="'before'" *ngFor="let condition of conditionsList"
[value]="condition">
{{ condition }}
</mat-list-option>
</ng-container>
<ng-template #noOptions>
<span fxLayoutAlign="center center" [innerHTML]="'Nessun risultato' | translate"></span>
</ng-template>
</mat-selection-list>
</div>
<div fxFlex="90" fxFlexOffset="5" fxLayout="row" fxLayoutAlign="space-between center"
*ngIf="conditionsList && conditionsList.length > 0" class="marginBottom10">
<button fxFlex="49" mat-raised-button (click)="clearColumn(col.key)">Pulisci</button>
<button fxFlex="49" mat-raised-button color="primary" (click)="applyFilter(col.key)">Filtra</button>
</div>
</div>
</mat-menu>
和css
.search-input {
width: 100%;
-webkit-transition: -webkit-box-shadow 0.3s;
transition: -webkit-box-shadow 0.3s;
transition: box-shadow 0.3s;
transition: box-shadow 0.3s, -webkit-box-shadow 0.3s;
font-size: 16px;
line-height: 22px;
padding: 10px;
background-color: white;
border-radius: 6px;
-webkit-box-sizing: border-box;
box-sizing: border-box;
display: block;
border: 1px solid grey;
box-shadow: 0px 4px 8px 0px rgb(0 0 0 / 10%), 0px 2px 5px 0px rgb(0 0 0 / 8%);
}
根据问题的评论:
由于 MatMenu(以及通常在下面使用的 CdkOverlay)的实例化方式,样式必须在全局范围内才能影响覆盖层中呈现的内容。它们可以放在不同的文件中,但它们必须以某种方式穿透组件级别。
这意味着可以使用以下之一设置样式:
- 使用
::ng-deep
(已弃用,但仍然有效)选择器刺穿组件 - 使用
ViewEncapsulation.None
将组件样式表提升到全局级别 - 在全局中放置样式 styles.scss
stacblitz here 中提供了使用 ::ng-deep
和问题样式的示例。