dcg*_*dcg 1 angular-material angular
我正在显示 a mat-selectinside a ngx-smart-dialog,当我打开它时,select它显示在对话框后面。我用这个解决方案找到了这个和这个:
.cdk-global-overlay-wrapper, .cdk-overlay-container {
z-index: 9999!important;
}
Run Code Online (Sandbox Code Playgroud)
如果我将其放入全局文件中,问题就解决了.scss。我想知道的是(因为在我读到的内容中我没有找到解释)为什么将它放在组件的视图(即模态组件的视图)中它不起作用。
提前致谢!
默认情况下, Angular使用 Angular 自动创建的特殊属性选择器将组件的 CSS / SCSS 范围限定为组件。这意味着组件样式仅影响该组件视图中的 DOM 元素。换句话说,组件的样式仅影响作为组件子级的 DOM 元素。
mat-select使用CDK 覆盖包(我认为它本身使用CDK 门户)呈现覆盖窗格。CDK 覆盖包在Angular 应用程序的根组件(附加到文档)之外呈现 mat-select 的覆盖窗格body。这意味着,尽管mat-select位于组件的模板内,并且该mat-select元素是 DOM 中组件的子元素,但 mat-select 的覆盖窗格并不是 DOM 中组件的子元素。这意味着您的组件的样式不会触及覆盖窗格(或不属于您组件的子元素的任何其他元素)。
我自己之前就遇到过这个问题。就我个人而言,我认为这种行为是 Angular模拟css 作用域功能中的一个错误。然而,Angular 团队意识到了这个问题,并将其视为其实施的可接受的限制。我想我记得看到一位 Angular 维护者的评论,他们目前不知道如何以高性能的方式解决这个问题(所以我认为这不会改变)。类似地,原生 Shadow DOM 封装仅允许组件的 CSS 影响组件的子组件,因此这会在渲染覆盖时导致相同的问题(我相信规范也出于性能原因做出了此决定)。
综上所述,有两种方法可以将 css 放置在组件的 css 文件中,并且仍然可以正常工作(而不需要将 css 放置在“全局”css 文件中)。
@Component({encapsulation: ViewEncapsulation.None})。这会禁用组件的 css 作用域,从而使组件的所有 css 成为“全局”。与普通的“全局”css 不同,组件的 css 在创建/销毁组件时从 DOM 中添加和删除(因此,如果组件存在,则组件的 css 只会在 DOM 中)。
将组件的 css 范围设置为ViewEncapsulation.Emulated(默认值),并使用角度自定义::ng-deep伪选择器有选择地从组件的 css 文件中的某些 css 样式中删除范围。
例子:
::ng-deep { .cdk-global-overlay-wrapper, .cdk-overlay-container { z-index: 9999!important; } }
::ng-deep器在 Angular 中已被弃用,但 Angular 团队当前没有删除选择器的计划,他们仍然建议您暂时使用它(如果需要)。ViewEncapsulation.Native并且ViewEncapsulation.ShadowDom不支持::ng-deep选择器(并且不支持穿透选择器)。| 归档时间: |
|
| 查看次数: |
6713 次 |
| 最近记录: |