【问题标题】:CSS in angular project don't apply unless placed in /src directory除非放在 /src 目录中,否则 Angular 项目中的 CSS 不适用
【发布时间】:2019-08-26 18:33:22
【问题描述】:

问题:


我有一个有很多组件和子组件的 Angular 应用程序。这些是通过运行ng generate component <component-name> 生成的,因此每个都具有相同样式的组件标签:

@Component({
    selector: 'app-<component-name>',
    templateUrl: './<component-name>.component.html',
    styleUrls: ['./<component-name>.component.css']
})

我的理解是所有与这个组件相关的CSS都应该放在src/&lt;component-name&gt;/&lt;component-name&gt;.component.css中,并且应该在组件渲染的时候自动应用到该组件上。

但情况似乎并非如此,因为当我在该 CSS 文件中放入某些指令时,它们似乎被忽略了。到目前为止,最引人注目的违规者是 text-align 和任何类型的 color 标签,而像 font-familyvw/vh 这样的标签可以正常工作。

另一方面,当我将我的 CSS 放入像 src/styles.css 这样的文件中并为此文件在 index.html 中导入时,我在那里的任何 CSS 都会正确应用,但会应用到所有组件。这不会是一个问题,除非某些组件必须共享命名约定,而且我无法指定我的意思不是 table2.component.ts 中的 [col-id="car"] 而是 table5.component.ts 中的 [col-id="car"]

编辑:

下面是我所说的一个例子:

我当前的网格如下所示:

给定列中的所有单元格共享col-id 标签的值:

我的slab-grid.component.css 文件包含网格本身的大小说明和字体说明符:

.slab-grid {
    width: 45vw;
    height: 80vh;
    font-family: monospace;
}

我知道这些都适用,因为如果我删除大小定义,网格变为 1px x 1px,如果我删除 font-family,整个网格会变回正常字体,如下所示。列“Thk”没有变回,因为应用程序另一部分的另一个网格具有相同的col-id,并且总体styles.css 文件包含[col-id="thk"] 的定义:

所以在我的理解中,如果我将以下语句添加到slab-grid.component.css

[col-id="yard_seq"] {
    text-align: right;
}

我希望我会看到具有col-id="yard_seq" 的列Yard Seq 右对齐。实际上,当我将此语句添加到 slab-grid.component.css 时,没有任何变化。但是,如果我转到位于 src/styles.css 的项目的主 css 文件并添加相同的语句,我会得到以下结果:

问题:


  • 如果我的 CSS 放在 src/&lt;component-name&gt;/&lt;component-name&gt;.component.css 中,为什么我的 CSS 并不总是适用于相关组件?

  • 有没有办法让src/styles.css 的元素仅在渲染某些组件时才应用于页面?

解决方案:


我找到了一个可接受的解决方案来解决这个问题。如果我从[col-id="thk"] 修改我自己的/src 样式选择器以使用后代选择器.slab-grid [col-id="thk"],那么我可以使用!important 使我的样式覆盖冲突的样式,而无需编辑冲突的文件。

【问题讨论】:

  • 全局样式表中的东西应该被全局应用,如果你需要定位它,你需要使用适当的选择器。你能提供一个minimal reproducible example 一些没有被应用的作用域组件CSS吗?
  • 当你有嵌套组件时,也许你应该在某些 css 文件中使用 :host /deep/
  • @jonrsharpe 如果您可以向我指出一个在线资源,它可以让我在 plunkr 或 jsfiddle 之类的东西上使用“ag-grid-angular”包,那么我绝对可以。但我没有看到其中一个可以使用“ag-grid-angular”。
  • @WalterWhite 看起来像 /deep/ 已经过时了,并且 :host() 不能解决问题
  • 您对 css 应该放在该文件中并自动应用的理解是正确的。你可以在angular.io/tutorial/toh-pt2 的 TourOfHeroes 教程中看到一个这样的例子(包括颜色)。因此,正如@johnrsharpe 所说,您需要将您的特定案例缩小到最小完整可验证示例。

标签: javascript html css angular ag-grid


【解决方案1】:

如果您想在多个组件之间共享相同的样式,则每个组件都有自己的样式,您必须创建一个共享的 CSS 文件,然后在 styles.css 上导入该文件,或者更好的解决方案是在 angular 上添加共享的 CSS 文件。 json 配置文件。

父组件的样式不适用于子组件。

仅当您在 styles.css 上添加相同的样式或在 angular.json 中包含文件时

示例

            "styles": [
              "src/styles.scss",
              "src/scss/theme.d.scss",
              "src/scss/global-scrollbar.d.scss",
              "src/scss/acrylic.scss",
              "src/scss/buttons.scss",
            ],
            "scripts": [
              "./node_modules/moment/min/moment.min.js"
            ]

【讨论】:

  • 这与我想要达到的目标完全相反。目前 CSS 适用于比我想要的更多的内容,我想减少每个部分适用的内容。
  • 那么你必须有全局样式。您应该检查适用的样式,我无法帮助您,这是简单的 CSS
猜你喜欢
  • 1970-01-01
  • 2019-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-25
  • 2017-06-10
相关资源
最近更新 更多