Angular2 模块级样式表

Posted

技术标签:

【中文标题】Angular2 模块级样式表【英文标题】:Angular2 module level stylesheets 【发布时间】:2017-05-02 00:15:21 【问题描述】:

我正在使用sass 以模块化结构设计我的网站,我愿意以这样一种方式组织样式表,即在每个模块级别(而不是组件级别)定义一个样式表,然后将其导入所有组件以保持整个模块的标准布局。

那么这是一个好方法吗?

如果是,是否有将 CSS 从 module.ts 文件导出到所有组件的方法。以非常相似的方式,使用providers 提供服务。这将省去我在所有组件中单独导入相同 CSS 文件的痛苦。

【问题讨论】:

【参考方案1】:

假设我们在 Angular 应用程序中具有以下结构

+-- src
|   +-- app
|   |   +-- customer
|   |   |   +-- customer.scss
|   |   |   +-- customer.module.ts
|   |   +-- product
|   |   |   +-- product.scss
|   |   |   +-- product.module.ts
|   +-- sass
|   |   +-- _common.scss
|   |   +-- app.scss
|   |   +-- project-level-styles.scss

我们可以像这样设置我们的项目级 sass 文件:

@import 'common';

// project level classes
@import 'project-level-styles';

// module level classes
@import '../app/customer/customer.scss'
@import '../app/customer/product.scss'

因此,在这些 customer.scssproduct.scss 中,我将拥有在该模块内的许多组件中通用的类。

应该注意的是,当您创建不在组件级别的样式表并将其放在其他地方(例如模块或项目目录中)时,角度处理这些样式的方式是不同的。

Angular Component Styles

Angular 可以将组件样式与组件捆绑在一起,从而实现比常规样式表更模块化的设计。您放入组件样式的选择器仅适用于该组件的模板。

所以请注意,任何与组件styleUrls 数组无关的样式表都可以应用于您网站中的任何元素(如果您不使用特异性)。它不仅适用于该模块,因此这可能不是适用于所有情况的解决方案,但这是我为我的模块所做的事情,理解这一点我可以在该模块化样式表中编写我的样式,以通过定位根来特定于该模块该模块的元素...

组件与全局

在我的应用程序中,我的 customerModule 有一个名为 customerComponent 的根组件,并且我在该 html 中有一个根元素,它的类为:

customer-container

所以在我的customer.scss 中,我可以像这样添加我所有的样式:

.customer-container .info-heading 
  font-size: 15px; color: #333;


.customer-container .section-divider 
  margin-top: 1em; border-top: 1px solid #dfdfdf;

所以我现在可以实现某种程度的特殊性,防止我的样式渗入其他项目组件。

【讨论】:

【参考方案2】:

那么这是一个好方法吗?

它是主观的。 Angular 模块有助于将应用程序组织成具有凝聚力的功能块。我想要不同的样式用于不同的块功能吗?极不可能。

有没有一种方法可以将 module.ts 文件中的 CSS 导出到所有组件中。

没有。它仅在组件级别受支持。解决方法是让所有模块组件都引用单个 css 文件。另一个好的做法是将 css 模块化并在组件级别使用它们。

【讨论】:

【参考方案3】:

是的。为每个组件设置不同的样式表绝对是好的方法。甚至 Angular CLI 也遵循相同的方法。 你可以看看并上手:LINK

那么这是一个好方法吗?

是的,在为 Angular 应用程序安排文件结构时,这是一个完美的方法。

如果是,是否有将 CSS 从 module.ts 文件导出到的方法 所有组件。

默认情况下,Angular CLI 不会为模块提供任何样式表,它也很有意义。为什么需要模块级别的样式表? 您可以在组件级别样式表中添加与组件​​相关的样式,此外,如果您愿意,您可以在项目级别拥有一个样式表,您可以在其中添加项目的所有常见样式。

【讨论】:

如果我想要模块级别的样式表而不是产品级别的样式表怎么办。由于每个模块都有单独的功能集,我愿意拥有整个模块的相同设计特征集,而不是一个组件或一个项目。 好吧,如果您非常确定在模块级别拥有它并且您有这样的要求。您可以随时添加它。 Angular 不限制在组件级别添加一个。

以上是关于Angular2 模块级样式表的主要内容,如果未能解决你的问题,请参考以下文章

小程序样式表不支持级联选择器

CSS怎样改变行内样式(通过外部级联样式表) css !important用法CSS样式使用优先级判断

使用 CSS 模块全局导入外部样式表

CSS (层叠样式表)

样式表重要的点

如何使用 docx 模块将样式对象中的格式化值添加到 Word 文档表中?