Angular 6替代全局css的方式

Posted

技术标签:

【中文标题】Angular 6替代全局css的方式【英文标题】:Angular 6 alterante way to global css 【发布时间】:2019-04-03 07:56:56 【问题描述】:

我在我的一个组件中使用 Handsontable,它迫使我将它的 css 全局包含在我的 angular.json 文件中

"styles": [
         "./src/styles.scss",
          "./node_modules/handsontable/dist/handsontable.full.css"
       ],

它会影响整个应用程序中的日历组件。 我怎样才能只为那个可动手做的组件包含这个 css 并为所有其他组件禁用它。

在handsontable组件scss文件中写入导入不起作用。

提前致谢。

【问题讨论】:

为什么会影响日历组件?如果您在日历中重用handsontable 样式,在callendar 的样式中覆盖它们是否更容易? 【参考方案1】:

这工作如下。关注encapsulation: ViewEncapsulation.None。这将禁用默认的Emulated DOM,因此该组件的样式也将适用于子组件。否则,默认情况下 Emulate DOM 会保护每个组件的范围(这就是它在您的情况下不起作用的原因)。

另请参阅documentation。

但是,这实际上并不能解决您的问题。因为,根据文档:

[ViewEncapsulation] None 意味着 Angular 没有视图封装。 Angular 将 CSS 添加到全局样式中。前面讨论的范围规则、隔离和保护不适用。这与将组件的样式粘贴到 html 中基本相同。

实际上意味着,输出将以任何方式在全局范围内。

所以在你的主styles.scss 中添加一次可能更容易:

@import '~/handsontable/dist/handsontable.full.css';

使用ViewEncapsulation.None 封装。

// component.ts
@Component(
  selector: 'app-table',
  template: `<hot-table ....></hot-table>`,
  styleUrls: ['./table.component.scss'],
  encapsulation: ViewEncapsulation.None
)
export class TableComponent 
...


// component.scss
@import '~/handsontable/dist/handsontable.full.css';

【讨论】:

【参考方案2】:

你可以试试下面的

@Component(
    selector: 'app-home-component',
    template: '<div></div>',
    styleUrls: [
        'path/handsontable.full.css',
        './home.component.css'
    ], 
)
export class HomeComponent

【讨论】:

这行不通。由于ViewEncapsulation 以及路径指定不正确,node_modules 在目录结构上的一些级别,它应该类似于:../../node_modules....,具体取决于组件的深度级别。 @muradm 问题只想将 css 应用于特定组件,而不是整个应用程序 是的,但是该组件也是 Angular 组件,并且由于 Emulated DOM,您无法从当前组件中设置父组件或子组件的样式。那就是问题的问题:writing import in handsontable component scss file doesn't work

以上是关于Angular 6替代全局css的方式的主要内容,如果未能解决你的问题,请参考以下文章

如何将全局样式添加到 Angular 6/7 库

前端小白之每天学习记录----angula2--

AngularJS 配哪个 CSS 框架好?SemanticUI,Bootstrap,还是其他

AngularJS 配哪个 CSS 框架好?SemanticUI,Bootstrap,还是其他

将 Angular 2 (click) 属性全局添加到 CSS

Angular 6 如何将 PrimeNG 全局过滤器移到 <p-table> 之外?