Angular2+のコンポーネント間のスタイル

提供:Dev Guides
移動先:案内検索

Angular 2+では、コンポーネントスタイルが保護され、デフォルトで他のコンポーネントにブリードすることはありません。 これは、ShadowDOMまたはShadowDOMエミュレーションを使用したViewEncapsulationのおかげです。 ただし、コンポーネントのスタイルを:host :host-context / deep / (現在は[ X173X] :: ng-deep )。 ビューカプセル化の動作を変更する方法もあります。

:亭主

特別な:host 疑似クラスセレクターを使用して、現在のコンポーネントの親となるホストコンポーネントのテンプレートにスタイルを適用できます。

:host {
  background-color: #545454;
  color: white;
  font-size: 1.5em;
}

:host(selector)でセレクターを指定して、ホストコンポーネントに存在するセレクターのスタイルのみを適用します。 この例では、ホストに.darkクラスがある場合にのみスタイルが適用されます。

:host(.dark) {
  background-color: #545454;
  color: white;
  font-size: 1.5em;
}

:host-context

:host-context を使用すると、コンポーネントツリーでそれ自体の上にある任意のコンポーネントまたはhtml要素の条件に基づいて、現在のコンポーネントにスタイルを適用できます。 一般的なユースケースは、たとえば特定のクラスがbody要素に存在する場合にスタイルを適用することです。 これは、テーマ設定に非常に役立ちます。

次の例では、クラス.infoのspan要素は、.deep-purpleが上流のどこかにある場合にのみスタイル設定されます。

:host-context(.deep-purple) span.info {
  border: 3px solid hotpink;
  border-radius: 12px;
}

::ng-深い

 :: ng-deep を使用すると、スタイルが現在のコンポーネントに適用されますが、コンポーネントツリーの現在のコンポーネントの子であるコンポーネントにも細流化されます。

Angular 4.3より前は、::ng-deepの代わりに/ deep/または>>>が使用されていました。 どちらの表記もブラウザによって廃止されたため、 ::ng-deepが一時的な回避策になりました。


次の例では、 span.info は、現在のコンポーネントとその子コンポーネントにスタイルがあります。

::ng-deep span.info {
  border: 3px solid hotpink;
  border-radius: 12px;
}

これらすべての疑似クラスを組み合わせて、最大限の制御を行うこともできます。

:host-context(.deep-purple) ::ng-deep span.info {
  border: 3px solid hotpink;
  border-radius: 12px;
}

カプセル化を表示

ビューのカプセル化は、次のように、コンポーネントのデコレータで Native Emulated (デフォルト)、またはNoneのいずれかに設定できます。

@Component({
  selector: 'my-app',
  ...,
  encapsulation: ViewEncapsulation.None
})
  • Native は、ブラウザーのネイティブShadowDOM機能を使用します。 ブラウザのサポートは、ネイティブサポートに対してまだ非常に制限されています。
  • Emulated はデフォルトの動作であり、エミュレートされたShadowDOMを使用します。 一般的に使用されているブラウザの大部分がShadowDOMをサポートしていないため、現在最も適切です。
  • None はビューのカプセル化を適用せず、1つのコンポーネントに適用されたスタイルも、アプリ全体にグローバルな影響を及ぼします。