【问题标题】:The use of /deep/ and >>> in Angular 2Angular 2 中 /deep/ 和 >>> 的使用
【发布时间】:2017-06-27 07:46:58
【问题描述】:

我一直在阅读这个选择器,得到的答案相互矛盾。

在:What do /deep/ and ::shadow mean in a CSS selector?

我们看到了:

正如 Joel H. 在 cmets 中指出的那样,Chrome 已经弃用 /deep/ 组合器,它在 IE 中给出了语法错误。

在:https://github.com/Microsoft/vscode/issues/7002

我们看到了:

/deep/ 不再存在,所以我认为我们不应该支持它。 >>> 是 新版本,应该会支持

但是,在 Angular 2 文档中:https://angular.io/docs/ts/latest/guide/component-styles.html

我们看到了:

/deep/ 选择器也有别名 >>>。我们可以使用任何一个 两个可以互换。

显然,相信 Angular 2 文档是明智的,但由于所有这些相互矛盾的信息,我有点犹豫。

事实上,在最新版本的 Microsoft Visual Studio Code 中,/deep/>>> 都会产生错误,尽管尽管出现错误,它们都可以正常工作。

我的问题有两个:

  1. /deep/ 会继续存在吗?我们是否有任何来源、引用或任何规范中的任何内容表明它将被采用?或者如果它已被正式弃用?

  2. 我们能否在不完全禁用语法检查的情况下抑制 Visual Studio Code 中的此错误?

【问题讨论】:

    标签: css angular css-selectors


    【解决方案1】:

    有修复错误的解决方案,在/deep/之前添加:host

    :host /deep/ .mat-slide-toggle-bar{
    
        background-color: #299DFF;
        padding: botton 20px;
    }​
    

    【讨论】:

      【解决方案2】:
      1. /deep/ 会留下来吗?我们是否有任何来源、引用或任何规范中的任何内容表明它将被采用?或者如果它已被正式弃用?

        /deep/ 语法已过时,最后一次出现在 css-scoping in 2014,它的替代 >>> 在大约半年前的 Chrome 45 中被弃用。

        阴影穿透后代组合器的整个概念是slated to be removed from the Shadow DOM entirely。实现可以将其完全删除,也可以将其别名为常规后代组合器(这取决于将来如何实现 Shadow DOM 可能有意义,也可能没有意义)。

      2. 我们能否在不完全禁用语法检查的情况下抑制 Visual Studio Code 中的此错误?

        很遗憾没有。

        出于兼容性目的,Angular 允许在模拟视图封装中进行这两种操作,但强烈建议作者继续使用>>>,因为/deep/ 现在在技术上无效,因此在本机视图封装中不受支持。

      【讨论】:

      • 如果我们不应该使用阴影穿透后代组合器,那么我们如何在我们想要阴影穿透的地方编写规则?
      • 要么不封装(封装:ViewEncapsulation.None),要么不刺穿:)
      • @craigmichaelmartin 我认为在考虑到现实世界的用例时,all or nothing approach 是不好的,尤其是在使用 3rd 方组件时(尽管事情似乎是这样的方式,不幸的是)。 ViewEncapsulation 默认情况下可以很好地避免刺穿 DOM,但它应该允许在需要时刺穿它(使用显式语法)。
      • 在 Angular 博客上,也有一些关于此的消息:blog.angular.io/the-state-of-css-in-angular-4a52d4bd2700 他们描述了两种可以替代使用的替代方案。 (CSS 变量和全局样式表)
      【解决方案3】:

      根据 google 文档,所有主要浏览器都将弃用该功能的所有功能。因此,不推荐使用穿透阴影的后代组合器,并且正在从主要浏览器和工具中删除支持。

      https://angular.io/guide/component-styles

      可以使用更官方且不被弃用的是 ::host() 和 ::host-context

      此外,根据谷歌的说法 ::ng-deep 不会被弃用,并将继续是一个可行的选择。所以使用 ::ng-deep 将是首选。

      /deep/ 组合子也有别名 >>> 和 ::ng-deep。

      仅在模拟视图封装中使用 /deep/、>>> 和 ::ng-deep。 Emulated 是默认和最常用的视图封装。有关详细信息,请参阅控制视图封装部分。 不推荐使用穿透阴影的后代组合器,并且正在从主要浏览器和工具中删除支持。因此,我们计划放弃对 Angular 的支持(对 /deep/、>>> 和 ::ng-deep 的所有 3 个)。在此之前 ::ng-deep 应该是首选,以便与工具更广泛地兼容。

      【讨论】:

      • 我猜它在文档中说::ng-deep 也将被弃用。引用您的回答中的文字(强调我的):“因此,我们计划放弃对 Angular 的支持(对 /deep/、>>> 和 ::ng-deep 的所有 3 个 )。” 还是我错过了什么?
      猜你喜欢
      • 2019-06-22
      • 2016-10-27
      • 2020-08-11
      • 1970-01-01
      • 2019-09-15
      • 2016-06-29
      • 1970-01-01
      • 2020-07-20
      • 1970-01-01
      相关资源
      最近更新 更多