【问题标题】:How do I override the style of primeng components?如何覆盖primeng组件的样式?
【发布时间】:2017-03-01 01:56:35
【问题描述】:

我想根据组件级别而不是整个应用程序来改写primeng组件的样式。我必须更改主 theme.css 文件中的样式或内联样式,但似乎内联有时无法按预期工作。例如,我必须使用

<p-dropdown [options]="cities" formControlName="selectedCity"></p-dropdown>

我必须根据文档更改类 ui-dropdown-item 类名的样式。

我需要具有两种不同样式的相同组件,这样做的正确方法是什么?

【问题讨论】:

  • 确保style.scss在angular.json的最底线,然后覆盖primeng提供的styleClass。例如 和 styles.scss 使用 .dropdown-style 覆盖现有的primeng样式
  • 这个关于在angular.json 列表中将styles.css 排在最后的提示让我可以从之前开发者的CSS 中删除很多!important,并编写更简洁的CSS 规则。

标签: angular primeng


【解决方案1】:

由于不推荐使用&gt;&gt;&gt;,因此必须使用::ng-deep。 与material2 v6primeng v5.2.*

:host {
    ::ng-deep .prime-slider-override {
        background-color: #26A3D1;
        background-image:none;
        border:none;
        color:white;

        .ui-slider-range {
            background: red;
        }
    }    
}
<p-slider [(ngModel)]="rangeValues"
              styleClass="prime-slider-override"></p-slider>

【讨论】:

  • 不是都弃用了吗?
【解决方案2】:

尝试使用

:host &gt;&gt;&gt; .ui-dropdown-item {...}

您不需要任何包围的 div 或将样式添加到主 style.css

【讨论】:

【解决方案3】:

禁用组件中的视图封装,然后添加样式,

@Component({
 selector: 'new-employee-flow',
 templateUrl: './app/components/my.html',
 styleUrls: ['./app/components/my.css'],
 encapsulation: ViewEncapsulation.None
})

【讨论】:

  • 这样做你必须在每次使用的时候给每个组件设置样式,这个过程太冗长而且不适合。
  • 如果你这样做了,你将分享风格并可能导致不良行为
  • 我认为之前评论中的“不良行为”的意思是:您失去了封装,这意味着您的样式将应用于您的所有应用程序。这对于组件来说通常是不受欢迎的,而这正是封装首先存在的原因之一。
  • 是的,我同意大多数 cmets,这是我使用的临时修复。我最终使用了 host 和 /deep/ 这应该是理想的使用方式。
  • 我认为关闭封装没有任何问题。如果它关闭,那不是坏行为,那只是传统的 CSS。只需像在任何其他网站中一样确定您的样式。
【解决方案4】:

我知道的唯一方法是使用 :host 和 ::ng-deep,称为“阴影穿透 CSS 组合器”

您可以启用 ViewEncapsulation.Native 以使用 Shadow DOM,但我的理解是它尚未得到广泛支持。 Chrome 和 Safari 都支持它,我认为 Firefox 可能在那里,但 IE 距离添加该功能还有一段距离。

关于角度视图封装的好文章here,还有一篇关于阴影穿孔的好文章here。你也可以从 Angular 团队here查看文档。

在我的应用程序中,我也使用 PrimeNG。由于我将一个 primeNG 组件导入其中,我们将其称为 MyComponent,这意味着应用于 MyComponent 的样式将被封装,并且不会应用于我合并的 primeNG UI 元素。 Shadow piercing 组合器允许我“穿透”Angular 的“模拟”Shadow DOM 来设置 PrimeNG 的样式,但它看起来有点凌乱且不理想。我一直在寻找解决此问题的方法,但我什么都不知道。

【讨论】:

    【解决方案5】:

    您希望将组件包装在具有特定类的 div 中。

    <div class="myOverride">
    

    现在在您的 style.css 中,您以这种方式定位primeng 组件:

    .myOverride .ui-dropdown-item {...} 
    

    这种方式只有被包装的组件才会被样式化。

    【讨论】:

    • 首先感谢您的回答,实际上这不起作用,这也不是最好的方法,还有其他相同的选择吗?
    • 由于 Angular 现在使用模拟的 ViewEncapsulation,因此该方法在某些情况下不起作用,包括组件在运行时生成元素时。我已经通过使用 :host 和 /deep/ 选择器解决了这个问题。 :host 选择组件的根元素,并且 /deep/ 将子选择器应用于每个子元素。有关 :host 和 /deep/ 的更多详细信息:angular.io/docs/ts/latest/guide/… 在实践中,这看起来只是简单地将 :host: /deep/ 添加到组件的 .scss 文件中的父选择器中。
    • @jmcmichael 我正在尝试在我的自定义组件中覆盖预定义组件的样式,正如您所指出的,预定义组件正在运行时生成元素。如何从我的组件中覆盖这些元素的样式?
    • 这对我有用。建议 :host 和 ::ng-deep 的其他答案我很确定这些已经/将被弃用。
    【解决方案6】:

    每个组件都提供了一组样式类,使用它们可以修改样式,例如

     <p-dropdown [options]="cities" [(ngModel)]="selectedCity"></p-dropdown>
    

    而对应的样式会为

    .ui-dropdown    {
      background-color:black;
    }
    .ui-dropdown-label  {
      color:white;
    }
    
    .ui-dropdown-label:hover{
      color:red
    }
    .ui-dropdown-item   {
      color:white;
      background-color:black;
    }
    

    LIVE DEMO

    【讨论】:

    • 如何让 Primeng 组件,如包含在 元素上的下拉菜单和文本框透明? td 背景颜色将为primeng组件提供颜色
    • 您的解决方案不起作用,新样式在主 style.css 中,我也希望从 angular 样式文件组件中更改primeng样式,该组件将样式注入头部
    • 你有机会看看Live Demo
    【解决方案7】:
    <p-menubar [model]="items" [style]="{'background-color': 'red'}">
    </p-menubar>
    

    【讨论】:

      【解决方案8】:

      我们可以使用以下代码覆盖 PrimenNg 组件的样式。

      [style]="{'width':'285px'}" [inputStyle]="{'width':'285px'}"
      

      这仅适用于内联样式。在上述情况下,我将自动完成下拉菜单的宽度更改为 285 像素。它对我有用。

      【讨论】:

        猜你喜欢
        相关资源
        最近更新 更多
        热门标签