如何将样式应用于 Angular 中的自定义组件内容?

Posted

技术标签:

【中文标题】如何将样式应用于 Angular 中的自定义组件内容?【英文标题】:How to apply Style to custom component content in Angular? 【发布时间】:2019-11-03 03:12:02 【问题描述】:

我正在尝试将样式应用于自定义组件的子组件。

选择器:

<custom-component-example></custom-component-example>

custom-component-example.html 内部:

<button>
    <ng-content></ng-content>
</button>

如果我要使用这样的风格:

<custom-component-example style="color: green">some text</custom-component-example>

或者像这样:

<custom-component-example [ngStyle]="'color': green">some text</custom-component-example>

按钮文本不会变绿。样式可以是任何东西(例如字体粗细或大小或任何东西)。

我也试过这个话题的解决方案:

Best way to pass styling to a component

但这也不适用于子元素(上例中的按钮)。

如何传递任何给定的样式并将其应用于子元素,在示例的情况下,我将如何传递样式(通过 custom-component-example 选择器)并将其应用于按钮和按钮的文本?

提前致谢。

【问题讨论】:

由于它是 Angular 2+,每个自定义组件都应该在定义时分配一个 CSS 文件或内联样式。这些样式可能是静态的。为什么我们要在运行时注入它? 我猜,Angular 2+ 中的每个组件都应该是独立的。 我认为这两种方法都没有问题,您能否检查一下,从样式到按钮的位置,样式可能存在重量/优先级问题。当您编写样式属性时,它独立于 angular/javascript。它只是 HTML 和 CSS 【参考方案1】:

你不应该改变父级的子样式,而是你应该做的:

将一个类应用到父级(比如说绿色按钮)。 在孩子的 css 中,您需要检查我的父母是否有一个类绿色按钮,如果是,那么它应该改变它的颜色。

在孩子的css文件中->

:host-context(.green-button) button
color : green

您不应该将样式从父级转移到子级,因为它破坏了 Angular 引以为豪的 ViewEncapsulation 优点。 这里有一些参考。 :Link

此外,子组件应该负责按钮的外观。父母应该关心自己。将来,如果您将有两个孩子给您的父母,将很难管理将哪种风格传给哪个孩子。 使用这种方法,改变风格不仅容易,而且易于管理。

如果我能提供帮助,请点赞并标记为已解决。干杯。

【讨论】:

您好,我使用了您的解决方案来解决我的问题。效果很好,我也尝试了其他一些解决方案,但我无法让它们正常工作。也欣赏解释。【参考方案2】:

您需要使用@Input() 之类的方式将样式属性传递给子组件

您的子组件 HTML 代码应如下所示

<div [className]="tableCss">
</div>

你的子组件 ts 文件代码应该是这样的

@Input() tableCss: string;

你的父组件应该看起来像

<app-list [tableCss]="'table-responsive table-borderless table-grid mt-4 border-top border-primary'"></app-list>

【讨论】:

【参考方案3】:

尝试将styles改成[styles]

custom-component-example.html

<button [ngStyle]="styles">
    <ng-content></ng-content>
</button>

custom-component-example.ts

@Input() styles: any = ;

使用,

<custom-component-example [styles]="color: green">some text</custom-component-example>

【讨论】:

【参考方案4】:

如果您想使用输入和样式而不像这样对 css 进行深度选择:

a > b > c 
    color: green;

把这个类改成这个:

class CustomComponentExample 
    @Input() styles;

为此输入设置样式:

<custom-component-example [styles]="'color': green">some text</custom-component-example>

在你的组件中使用这个属性:

<button [ngStyle]="styles">
    <ng-content></ng-content>
</button>

【讨论】:

以上是关于如何将样式应用于 Angular 中的自定义组件内容?的主要内容,如果未能解决你的问题,请参考以下文章

我如何将 CSS 应用于 VAADIN 8 中的组件

React-Bootstrap 的下拉菜单组件上的自定义样式

将预定义的验证器添加到 Angular 中的自定义组件

Angular Materials 不会将样式应用于组件

如何在 Angular 中使用带有 SASS 的 Bootstrap 4

如何将 DOM 附加到 Angular 2 组件并仍然获得封装样式