【问题标题】:Angular Material custom theme makes popups transparentAngular Material 自定义主题使弹出窗口透明
【发布时间】:2021-08-02 14:39:18
【问题描述】:

我目前正在使用 Material2 在 Angular 中制作仪表板以进行样式设置。我有一个问题,应用程序中的任何弹出窗口都以透明背景显示。

我在StackBlitz 中做了一个问题的例子。

在 stackblitz 中,当我添加 custom material theme 时,问题出现了。

当我从项目angular.json 文件中删除"src/theme.scss" 并使用style.css 中的预构建材料主题时,就像这样;

@import '~@angular/material/prebuilt-themes/deeppurple-amber.css';

弹窗的背景又恢复正常了。

所有弹出窗口(日期选择器、分页器等)都会出现这种情况。

我的~/src/theme.scss 文件如下所示;

@import '~@angular/material/theming';
// always include only once per project

@include mat-core();

// define 3 theme color
// mat-palette accepts $palette-name, main, lighter and darker variants
$dashboard-theme-primary: mat-palette($mat-blue);
$dashboard-theme-accent: mat-palette($mat-grey);
$dashboard-theme-warn: mat-palette($mat-red);

// create theme (use mat-dark-theme for themes with dark backgrounds)
$dashboard-theme: mat-light-theme(
    $dashboard-theme-primary,
    $dashboard-theme-accent,
    $dashboard-theme-warn
);

$dashboard-theme-dark: mat-dark-theme(
    $dashboard-theme-primary,
    $dashboard-theme-accent,
    $dashboard-theme-warn
);

.dashboard-theme {
  @include angular-material-theme($dashboard-theme);
}

.dashboard-theme-dark {
  @include angular-material-theme($dashboard-theme-dark);
}

主题应用于<div> in app.component.html中的项目

非常感谢任何帮助:)

更新

我已经更新了整个项目以使用scss 而不是css,然后我重新构建了我的整个自定义theme.scss 所有材质组件都得到了正确的样式,我可以在明暗主题之间动态切换,我什至可以设置样式非物质成分。但除非我使用如上所述的预建主题,否则我的弹出窗口会保持透明。

为了确定,我还更新了所有依赖项;

package.json

{
  "name": "DiagnosisDashboard",
  "version": "0.0.0",
  "scripts": {
    "ng": "ng",
    "start": "ng serve",
    "build": "ng build",
    "test": "ng test",
    "lint": "ng lint",
    "e2e": "ng e2e"
  },
  "private": true,
  "dependencies": {
    "@angular/animations": "^6.1.7",
    "@angular/cdk": "^6.4.7",
    "@angular/common": "^6.1.0",
    "@angular/compiler": "^6.1.0",
    "@angular/core": "^6.1.8",
    "@angular/forms": "^6.1.8",
    "@angular/http": "^6.1.8",
    "@angular/material": "^6.4.7",
    "@angular/material-moment-adapter": "^6.4.7",
    "@angular/platform-browser": "^6.1.8",
    "@angular/platform-browser-dynamic": "^6.1.8",
    "@angular/router": "^6.1.8",
    "core-js": "^2.5.4",
    "moment": "^2.22.2",
    "rxjs": "^6.0.0",
    "zone.js": "~0.8.26"
  },
  "devDependencies": {
    "@angular-devkit/build-angular": "~0.8.2",
    "@angular/cli": "^6.1.5",
    "@angular/compiler-cli": "^6.1.0",
    "@angular/language-service": "^6.1.8",
    "@types/jasmine": "~2.8.6",
    "@types/jasminewd2": "~2.0.3",
    "@types/node": "~10.10.1",
    "codelyzer": "~4.4.4",
    "jasmine-core": "~3.2.1",
    "jasmine-spec-reporter": "~4.2.1",
    "karma": "~3.0.0",
    "karma-chrome-launcher": "~2.2.0",
    "karma-coverage-istanbul-reporter": "^2.0.4",
    "karma-jasmine": "~1.1.1",
    "karma-jasmine-html-reporter": "^1.3.1",
    "protractor": "^5.4.1",
    "ts-node": "~7.0.1",
    "tslint": "~5.11.0",
    "typescript": "~2.7.2"
  }
}

angular.json

{
  "$schema": "./node_modules/@angular/cli/lib/config/schema.json",
  "version": 1,
  "newProjectRoot": "projects",
  "projects": {
    "my-app": {
      "root": "",
      "sourceRoot": "src",
      "projectType": "application",
      "prefix": "app",
      "schematics": {},
      "architect": {
        "build": {
          "builder": "@angular-devkit/build-angular:browser",
          "options": {
            "outputPath": "dist/my-app",
            "index": "src/index.html",
            "main": "src/main.ts",
            "polyfills": "src/polyfills.ts",
            "tsConfig": "src/tsconfig.app.json",
            "assets": [
              "src/favicon.ico",
              "src/assets"
            ],
            "styles": [
              "src/styles.scss",
              "src/app/theme.scss"
            ],
            "scripts": []
          },
          "configurations": {
            "production": {
              "fileReplacements": [
                {
                  "replace": "src/environments/environment.ts",
                  "with": "src/environments/environment.prod.ts"
                }
              ],
              "optimization": true,
              "outputHashing": "all",
              "sourceMap": false,
              "extractCss": true,
              "namedChunks": false,
              "aot": true,
              "extractLicenses": true,
              "vendorChunk": false,
              "buildOptimizer": true
            }
          }
        },
        "serve": {
          "builder": "@angular-devkit/build-angular:dev-server",
          "options": {
            "browserTarget": "my-app:build"
          },
          "configurations": {
            "production": {
              "browserTarget": "my-app:build:production"
            }
          }
        },
        "extract-i18n": {
          "builder": "@angular-devkit/build-angular:extract-i18n",
          "options": {
            "browserTarget": "my-app:build"
          }
        },
        "test": {
          "builder": "@angular-devkit/build-angular:karma",
          "options": {
            "main": "src/test.ts",
            "polyfills": "src/polyfills.ts",
            "tsConfig": "src/tsconfig.spec.json",
            "karmaConfig": "src/karma.conf.js",
            "styles": [
              "src/styles.scss",
              "src/app/theme.scss"
            ],
            "scripts": [],
            "assets": [
              "src/favicon.ico",
              "src/assets"
            ]
          }
        },
        "lint": {
          "builder": "@angular-devkit/build-angular:tslint",
          "options": {
            "tsConfig": [
              "src/tsconfig.app.json",
              "src/tsconfig.spec.json"
            ],
            "exclude": [
              "**/node_modules/**"
            ]
          }
        }
      }
    },
    "my-app-e2e": {
      "root": "e2e/",
      "projectType": "application",
      "architect": {
        "e2e": {
          "builder": "@angular-devkit/build-angular:protractor",
          "options": {
            "protractorConfig": "e2e/protractor.conf.js",
            "devServerTarget": "my-app:serve"
          },
          "configurations": {
            "production": {
              "devServerTarget": "my-app:serve:production"
            }
          }
        },
        "lint": {
          "builder": "@angular-devkit/build-angular:tslint",
          "options": {
            "tsConfig": "e2e/tsconfig.e2e.json",
            "exclude": [
              "**/node_modules/**"
            ]
          }
        }
      }
    }
  },
  "defaultProject": "my-app",
  "schematics": {
    "@schematics/angular:component": {
      "styleext": "scss"
    }
  }
}

新的StackBlitz

【问题讨论】:

  • 您的基本调色板在某处定义了吗? mat-palette 希望您的 mat-blue、mat-gray 等在某处有一个颜色图作为您的基本调色板。看着你的 stackblitz 虽然有些东西似乎不对,因为我没有看到应用过背景颜色,并且在期待输出时我不希望看到一些奇怪的覆盖。你在编译 sass 时收到任何警告或任何东西吗?
  • 你好@ChrisW.,不,我还没有定义我自己的调色板。我的印象是 Material 提供了一些默认调色板,就像它们提供默认主题一样。我没有阅读任何关于需要在文档中自己定义的内容 (material.angular.io/guide/theming)。我将把这个调色板的定义放在哪里?在 sass 文件中?
  • 顺便说一句,我没有收到任何编译错误。
  • 可能会逐步浏览tutorial 并确保您没有遗漏任何内容。
  • @ChrisW。我只是重做了整个主题,现在在整个项目中使用 sass 而不是 css 和 sass 混合。主题应用正常,我可以在深色/浅色主题之间切换,我可以设置自定义组件的样式,但弹出窗口仍然是透明的。

标签: angular sass datepicker angular-material2


【解决方案1】:

“弹出窗口”包含在覆盖容器中,它是<body> 的直接子级。应用于基础应用程序组件的任何样式都不会应用于覆盖容器 - 您必须明确应用它。请参阅theming docs 的“多个主题和基于覆盖的组件”部分。例如:

import {OverlayContainer} from '@angular/cdk/overlay';

export class AppComponent {

    constructor(overlayContainer: OverlayContainer) { }

    applyTheme(theme: string) {
        this.overlayContainer.getContainerElement().classList.add(theme);
    }
}

【讨论】:

  • 非常感谢您,我在文档中没有看到,立即解决了问题。 +1
猜你喜欢
  • 1970-01-01
  • 2015-07-15
  • 1970-01-01
  • 2015-08-15
  • 1970-01-01
  • 2020-05-09
  • 2015-12-25
  • 2019-10-07
  • 1970-01-01
相关资源
最近更新 更多