角度2:如何为组件的宿主元素设置样式?


189

我在Angular 2中有一个名为my-comp的组件:

<my-comp></my-comp>

如何在Angular 2中设置此组件的宿主元素的样式?

在Polymer中,您将使用“:host”选择器。我在Angular 2中尝试过。但是它不起作用。

:host {
  display: block;
  width: 100%;
  height: 100%;
}

我也尝试使用组件作为选择器:

my-comp {
  display: block;
  width: 100%;
  height: 100%;
}

两种方法似乎都不起作用。

谢谢。


2
您确定未应用样式吗?我已经完成了一个基本项目,并且确实做到了,而且效果很好。我已经设置好my-selector { color : red}CSS,并且效果很好。
帕坎2015年

1
从beta 7开始,:host选择器对我有用。
乔恩·斯旺森

Answers:


285

有一个错误,但在此同时已修复。:host { }现在工作正常。

还支持

  • :host(selector) { ... }用于selector匹配主机元素上的属性,类...
  • :host-context(selector) { ... }用于selector匹配父组件上的元素,类...

  • selector /deep/ selector(别名selector >>> selector不适用于SASS)以使样式跨元素边界匹配

    • 更新: SASS正在弃用/deep/
      添加了Angular(TS和Dart)::ng-deep作为替代品,该替代品也与SASS兼容。

    • UPDATE2: ::slotted ::slotted现在所有新浏览器都支持UPDATE2:并可以与`ViewEncapsulation.ShadowDom
      https://developer.mozilla.org/en-US/docs/Web/CSS/::slotted

另请参阅将外部CSS样式加载到Angular 2组件中

/deep/>>>不影响通过在Chrome中被弱化了相同的选择组合程序。
Angular模拟(重写)它们,因此不依赖于支持它们的浏览器。

这也是为什么/deep/>>>不起作用的原因,ViewEncapsulation.Native它启用了本地阴影DOM并依赖于浏览器支持。


@Component({selector: 'some-selector', template: 'xxx', styles: [':host { display: block; background-color: green; border: solid 1px red; }']}) export class SomeClass {}
君特Zöchbauer

@OndraŽižka您可以详细说明吗?这是纯CSS,怎么可能与CSS及其本身不一致?
君特Zöchbauer

除非我错过了CSS的一些重要转变,否则/ deep /和>>>都不是CSS。
Ondra参观Žižka

它们已弃用,但这无关紧要。它们由Angular模拟(重写),因此它们仅与ViewEncapsularion.Emulated(默认)一起使用,而不与一起使用Native
君特Zöchbauer

在Angular 2.4.7中,我可以:host { p { font-size: 80%; } }在... component.css文件中工作。一旦我尝试将其与之配合使用,styles: [:host { p { font-size: 80%; } }]便不再可行。很奇怪。
马丁,

39

我找到了一种解决方案,如何仅对组件元素进行样式设置。我还没有找到任何文档,它是如何工作的,但是您可以将属性值放入“ host”属性下的component指令中,如下所示:

@Component({
    ...
    styles: [`
      :host {
        'style': 'display: table; height: 100%',
        'class': 'myClass'
      }`
})
export class MyComponent
{
    constructor() {}

    // Also you can use @HostBinding decorator
    @HostBinding('style.background-color') public color: string = 'lime';
    @HostBinding('class.highlighted') public highlighted: boolean = true;
}

更新:正如GünterZöchbauer提到的那样,存在一个错误,现在您甚至可以在css文件中设置host元素的样式,如下所示:

:host{ ... }

1
我比创建一个虚拟.root元素更好,但是我不喜欢它将这些样式设置为内联(强制!important覆盖)。必须有一个更好的方法:\
Scrimothy

4
不,host{}stylesUrl文件中通过样式设置无效。需要:host
phil294

我们如何访问主机内部的组件变量?如果我想动态决定背景颜色?':host {background-color:this.bgColor; }”
普拉塔普AK

@ PratapA.K您好,您可以使用HostBinding derorator。您将看到以下示例:@HostBinding('style.background-color') private color = 'lime'; Google将为您找到许多示例和文章。
预计

11

看看这个问题。我认为当实施新的模板预编译逻辑时,该错误将得到解决。现在,我认为您能做的最好的就是将模板包装进去<div class="root">并设置样式div

@Component({ ... })
@View({
  template: `
    <div class="root">
      <h2>Hello Angular2!</h2>
      <p>here is your template</p>
    </div>
  `,
  styles: [`
    .root {
      background: blue;
    }
  `],
   ...
})
class SomeComponent {}

看到这个矮人


9

如果您要使用某些常规样式,则可以在Component中将.class添加到host元素。

export class MyComponent{
     @HostBinding('class') classes = 'classA classB';

6

对于希望为a的子元素设置样式的任何人,:host这里都是如何使用的示例::ng-deep

:host::ng-deep <child element>

例如 :host::ng-deep span { color: red; }

正如其他人所说/deep/的那样


4

尝试:host> / deep /:

将以下内容添加到parent.component.less文件中

:host {
    /deep/ app-child-component {
       //your child style
    }
}

用子选择器替换app-child-component


如果您要在其中添加类似引导程序的样式表而不是单个样式,该怎么办?
Aditya Vikas Devarapalli
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.