Angular TIPS

Angular TIPS

コンポーネントにスタイルシートを適用するには?(styles/StyleUrlsパラメーター)

2017年12月18日

@Componentデコレーターのstylesパラメーターを利用してコンポーネントにスタイルシートを適用する基本的な方法を解説。また、スタイルを外部ファイルにする方法も説明する。

  • このエントリーをはてなブックマークに追加

【対応バージョン】 Angular 5以降。v5時点で執筆しました。

 コンポーネントにスタイルを適用するには、まず、@Componentデコレーターのstylesパラメーターを利用するのがシンプルです。例えば以下は、AppComponentコンポーネント配下の要素に対して、スタイルを適用する例です。

TypeScript
import { Component } from '@angular/core';

@Component({
  selector: 'app-root',
  template: `
    <h1>{{title}} TIPS</h1>
    <p>目的別にまとめた{{title}}の解説記事</p>
  `,
  styles: [`
    h1 {
      color: #f00;
      background-color: #ffc;
      font-style: italic;
    }

    p {
      color: #f0c;    
      font-weight: bold;
    }
  `]
})
export class AppComponent {
  title = 'Angular';
}
コンポーネントに対してスタイルを適用する例(app.component.ts)
HTML
<!doctype html>
<html lang="en">
……中略……
<body>
  <app-root></app-root>
  <p>サクッと学ぼう!</p>
</body>
</html>
コンポーネントに対してスタイルを適用する例(index.html)
コンポーネント配下の<h1>/<p>要素に対してのみスタイルが適用された
コンポーネント配下の<h1>/<p>要素に対してのみスタイルが適用された

 メインコンポーネント(AppComponent)を呼び出すindex.htmlファイルにも<p>要素を追加しているのは、コンポーネントで宣言したスタイルがコンポーネントの外には影響を及ぼさないことを確認するためです。

 複数形であることからも分かるように、stylesパラメーターはスタイル定義(文字列)を配列として指定する点にも注目してください。ここではスタイル定義は1つだけですが、定義全体を[...](配列リテラル)でくくっている点に注目です。

 ちなみに、サンプルでは複数のスタイルを1つの文字列としていますが、以下のように複数の文字列に分離しても構いません。

TypeScript
styles: [`
  h1 {
    color: #f00;
    background-color: #ffc;
    font-style: italic;
  }
  `,`
  p {
    color: #f0c;    
    font-weight: bold;
  }
`]
複数のスタイルを配列として指定した例(app.component.tsから抜粋)

スタイルを外部ファイル化する

 上では、簡単化のためにスタイルをコンポーネントファイルにまとめて記述しましたが、一般的には.cssファイルとして分離した方が保守性には優れるでしょう。その場合、外部ファイル化したスタイルシートは、styleUrlsパラメーターで指定します。

TypeScript
@Component({
  selector: 'app-root',
  template: `
    <h1>{{title}} TIPS</h1>
    <p>目的別にまとめた{{title}}の解説記事</p>
  `,
  styleUrls: ['./app.component.css']
})
スタイルシートを外部ファイル化した例(app.component.tsから抜粋)

 スタイルシートの名前は、コンポーネントとの対応関係が明確になるよう、「コンポーネント名.css」とするのが慣例的です。

 styleUrlsパラメーターも複数形になっていることから分かるように、ファイル名の配列として指定する点にも注目です。

参考:コンポーネントローカルなスタイルの仕組み

 冒頭サンプルの結果を見ても分かるように、stylesstyleUrlsパラメーターで指定されたスタイルは、コンポーネント内部でのみ適用されます。その理屈を確認しておきます。

 以下は、冒頭のサンプルを実行した後、生成されたコードをブラウザーの開発者ツール*1から確認したものです。

  • *1 Chromeであれば、[Elements]タブから確認できます。
HTML
<html lang="en">
<head>
……中略……
<style>
  h1[_ngcontent-c0] {
    color: #f00;
    background-color: #ffc;
    font-style: italic;
  }

  p[_ngcontent-c0] {
    color: #f0c;    
    font-weight: bold;
  }
</style>
</head>
<body>
  <app-root _nghost-c0="" ng-version="5.0.3">
    <h1 _ngcontent-c0="">Angular TIPS</h1>
    <p _ngcontent-c0="">目的別にまとめたAngularの解説記事</p>
  </app-root>
  <p>サクッと学ぼう!</p>
  ……中略……
</body>
</html>
コンポーネントによって生成されたコード

 stylesパラメーターで指定されたスタイルには、セレクター式にも[_ngcontent-~]のような属性宣言が付与されていることが見て取れます。また、テンプレートで定義された要素にも、対応する_ngcontent-~属性が付与されます。

 「_ngcontent-」以降は、コンポーネントによって生成されたランダムな文字列です。これら属性を持つ要素はコンポーネント配下に限定されるはずなので、コンポーネントで宣言されたスタイルはコンポーネントの外には適用されないわけです。

処理対象:コンポーネント(Component) カテゴリ:基本
API:@Component|styles|styleUrls カテゴリ:@angular > core > Component decorator(コンポーネントデコレーター)

※以下では、本稿の前後を合わせて5回分(第32回~第36回)のみ表示しています。
 連載の全タイトルを参照するには、[この記事の連載 INDEX]を参照してください。

32. 数値(単数/複数)によって表示を切り替えるには?(ngPlural)

Angularで数値によってテキスト表示内容を切り替えるための、ngPluralディレクティブの基本的な使い方を説明する。

33. 複数のスタイルクラスをまとめて操作するには?(ngClass)

スタイルシートとして定義した複数の対象クラスのスタイルを、任意の要素のclass属性にまとめて着脱できるngClassディレクティブの基本的な使い方を説明する。

34. 【現在、表示中】≫ コンポーネントにスタイルシートを適用するには?(styles/StyleUrlsパラメーター)

@Componentデコレーターのstylesパラメーターを利用してコンポーネントにスタイルシートを適用する基本的な方法を解説。また、スタイルを外部ファイルにする方法も説明する。

35. 複数のスタイルプロパティをまとめて操作するには?(ngStyle)

ngStyleディレクティブを使って、要素に対して複数のスタイルプロパティをまとめて設定する方法を説明する。

36. 入力フォームに検証機能を実装するには?(form/input)

Angularにより拡張されている標準的な<form>/<input>要素を使って、検証機能付きの入力フォームを実装する方法を説明する。

サイトからのお知らせ

Twitterでつぶやこう!