【问题标题】:In Angular 7 - How do I style HTML thats projected using ng-content在 Angular 7 中 - 如何设置使用 ng-content 投影的 HTML 样式
【发布时间】:2019-09-29 17:52:49
【问题描述】:

在 Angular 7 中 - 如何设置使用 ng-content 投影的 HTML 样式。

技术:Angular 7、Angular CLI、SASS、HTML5、Webpack。

我的代码:

注意:我的组件 html 带有嵌入/投影。 该组件有一个 scss 文件,并且只有在使用 ng-deep 时才能对来自 ng-content 的 html 进行样式设置,例如:host::ng-deep

<table>
  <ng-content></ng-content>
</table>

这是我对上述组件的 sass html:

:host::ng-deep {
  table {
    background-color: map-get($theme-brand, flat);
    display: flex;
    flex-direction: column;
    border: 1px solid map-get($theme-contrast, contrast-8);
    border-radius: 5px;

    tr {
      display: flex;
      justify-content: flex-end;
    }

    th, td {
      @extend %p-2;
      word-break: break-all;
      align-items: center;
      display: flex;
      text-align: right;
      width: 250px;
      color: map-get($theme-typography-color, regular);

      &:first-child {
        text-align: left;
        border: none;
        width: 100%;
      }
    }
  }
}

注意:因此上述用于 tr 和 th, td 的 css 不会得到样式,因为投影会阻止样式,除非我使用 ng-deep。

尝试过的事情

  • ng-deep(它可以工作,但不想被浏览器很快弃用)。

【问题讨论】:

标签: css angular sass angular-cli angular7


【解决方案1】:

根据this question,您有两种不同的方法:

1:使用::slotted 伪选择器,新浏览器开始支持该选择器。要使用它,您需要将@Componentencapsulation 属性更改为ViewEncapsulation.ShadowDom

2:一种蛮力方式,将@Componentencapsulation属性设置为ViewEncapsulation.None。这样,样式将应用于所有页面,而无需 Angular 处理。

您可以在此处查看有关 ViewEncapuslation 的更多详细信息:https://angular.io/api/core/ViewEncapsulation

还有一个discussion in Github 与此有关。

【讨论】:

  • 显然 ShadowDom 在 Safari 中为开槽选项设置样式时存在问题。而对于 ViewEncapsulation.None 对我来说不是一个选项,因为 css 的范围出血
  • ViewEncapsulation.None 没有任何蛮力。当您需要在 CSS 的 global 范围内设置组件视图的样式时,这是正确的 setting。在需要的时候使用它并不是什么大问题。
  • @cgTag 当然可以。这只是为了强调它需要谨慎完成,因为您正在处理全局样式。但是,正如您所说,它在某些情况下是一个很好的解决方案。
猜你喜欢
  • 1970-01-01
  • 2017-04-26
  • 2021-10-14
  • 2020-11-19
  • 2022-01-11
  • 2019-09-23
  • 2018-11-04
  • 2017-02-04
  • 1970-01-01
相关资源
最近更新 更多