Angular 2:コンポーネントのホスト要素をスタイルする方法は?


188

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に設定しましたが、うまくいきます。
Pacane、2015

1
ベータ7の時点では、:hostセレクターが機能しています。
ジョンスワンソン、2016年

回答:


284

バグがありましたが、それまでは修正されました。: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すべての新しいブラウザーでサポートされるようになり、 `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ジシュカ

それらは非推奨ですが、それは問題ではありません。これらは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({
    ...
    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{ ... }

1
私は、ダミーの.root要素を作成するよりもこれが好きですが、これらのスタイルをインラインとして設定するのは好きではありません(強制的!importantにオーバーライドする)。より良い方法があるはずです:\
Scrimothy

4
いいえ、ファイルでのスタイル設定host{}stylesUrl機能しません。必要:hostです。
phil294 2016

ホスト内のコンポーネント変数にアクセスするにはどうすればよいですか?背景色を動的に決定したい場合は?':host {background-color:this.bgColor; } '
Pratap 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

適用したいいくつかの一般的なスタイルがある場合は、コンポーネントで.classをホスト要素に追加できます。

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

6

:hosthereの子要素のスタイルを検討している人にとっては、使用方法の例です::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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.