AMP HTML のスタイルとレイアウト
今回は AMP HTML で独自のスタイルでデザインする方法についてです。
AMP はモバイルページを高速表示するプロジェクトやフレームワークです。
AMP では高速表示を実現する為に実装のルールがあり、スタイルに関しても AMP ならではのルールがあります。CSS の制約やレイアウトの為の機能が用意されており、それは外部リソースに制限や読み込みの処理をかけているからです。詳しい AMP の仕組みは下記の記事で紹介しています。
AMP | fff
AMPはモバイルページを高速表示する技術です。AMPの特徴や高速表示の仕組み、AMPを実装する方法やルールを紹介します。
カスタムスタイル
AMP で独自のカスタムスタイルを適応する時のルールがあります。CSS はstyle
要素に記述し、外部ファイルのスタイルシートの読み込みやインラインのstyle
属性の記述はできません。
<head>
<style amp-custom>
amp-img {
border: 1px solid #666;
}
</style>
</head>
style
要素にはamp-custom
属性を設定しhead
要素内に記述します。また<style amp-custom></style>
は複数記述することはできず、一度だけ記述します。
また AMP ではパフォーマンスを向上させる為に一部のスタイルを制限しています。スタイルの制限は下記のようなものがあります。
スタイル | 説明 |
---|---|
外部ファイルのスタイルシート読み込み | AMP では外部ファイルのスタイルシートを読み込むことができません。 例外としてカスタムフォントの読み込みは可能です。 |
インラインのstyle 属性 | AMP ではインラインのstyle 属性は使用できません。CSS は前述の <style amp-custom></style> に記述します。 |
!important | AMP では!important を使用できません。 |
-amp-* クラスi-amp-* タグ | -amp- で始まるクラス名は AMP ランタイムが使用する予約語です。ユーザーのカスタムスタイルで-amp- で始まるクラス名、i-amp- で始まるタグを CSS セレクタで参照することはできません。 |
translation | GPU アクセラレーションが可能なプロパティopacity transform -vendorPrefix-transform のみが使用できます。 |
@keyframes | GPU アクセラレーションが可能なプロパティopacity transform -vendorPrefix-transform のみが使用できます。 |
一部の制限はありますが AMP でも CSS を使うことでカスタムスタイルを適応し好きなデザインを実装することが可能です。
レイアウトとレスポンシブ
amp-img
要素をはじめ AMP の要素ではパフォーマンスを高める為に予めheight
属性やwidth
属性でサイズを指定します。AMP では要素のサイズを指定してもデバイスに合わせサイズが可変するレスポンシブになるようlayout
属性が用意されています。
レイアウト | height | width | 説明 |
---|---|---|---|
fixed | 必要 | 必要 | 指定した高さと幅のサイズで表示します。 |
fixed-height | 必要 | 不要 auto | 高さは指定したサイズですが幅は親要素の使用可能なスペースを占有して表示します。 |
responsive | 必要 | 必要 | 指定した高さと幅のアスペクトを保ちながら表示します。 |
fill | 不要 | 不要 | 親要素のサイズに合わせて使用可能なスペースを占有して表示します。 |
container | 不要 | 不要 | サイズは子要素により定義され、指定した要素はコンテナとしてのみ機能すると見なされます。 |
flex-item | 不要 | 不要 | 親要素がフレキシブルの場合、指定した要素と兄弟要素でスペースを占有します。 |
intrinsic | 必要 | 必要 | 指定した高さと幅のアスペクト比を保ちながら表示しますが、高さは要素本来のサイズより大きくなることはありません。 |
nodisplay | 不要 | 不要 | 要素を表示しません。 |
レイアウトにfixed
を指定した時は下記のようになります。
<amp-img src="sample.png" height="126px" width="240px" layout="fixed"></amp-img>
fixed
は高さ幅ともにサイズを固定しレスポンシブに可変しないので上記のように指定通りのサイズになります。その為、画像の左右には余白ができています。
レイアウトにfixed-height
を指定した時は下記のようになります。
<amp-img src="sample.png" height="126px" layout="fixed-height"></amp-img>
fixed-height
は親要素のサイズに合わせスペースを占有しますが、高さは指定したサイズに固定されます。width
属性は指定しないかauto
にします。上記では幅は親要素のスペースを占有していますが高さは指定した 126px になります。
レイアウトにresponsive
を指定した時は下記のようになります。
<amp-img src="sample.png" height="126px" width="240px" layout="responsive"></amp-img>
responsive
は指定したサイズのアスペクト比を保ちながら、幅は親要素のサイズに合わせてスペースを占有します。
レイアウトにfill
を指定した時は下記のようになります。
<amp-img src="sample.png" layout="fill"></amp-img>
fill
は親要素の使用可能なスペースを占有し、親要素と同じサイズになります。親要素のposition
はrelative
かabsolute
を指定します。上記では高さは親要素のpadding
20px、幅は横いっぱいにスペースを占有して画像を表示しています。
レイアウトにcontainer
を指定した時は下記のようになります。
<amp-layout layout="container">
<amp-img src="sample.png" height="126px" width="240px" layout="container"></amp-img>
</amp-layout>
container
はサイズが子要素により定義されます。div
要素のようになり、container
を指定した要素はコンテナとしてのみ機能すると見なされます。上記ではのエリアが<amp-layout layout="container"></amp-layout>
のエリアです。
レイアウトにflex-item
を指定した時は下記のようになります。
<amp-img src="sample.png" height="126px" width="240px" layout="flex-item"></amp-img>
<amp-img src="sample.png" height="126px" width="240px" layout="flex-item"></amp-img>
<amp-img src="sample.png" height="126px" width="240px" layout="flex-item"></amp-img>
<amp-img src="sample.png" height="126px" width="240px" layout="flex-item"></amp-img>
<amp-img src="sample.png" height="126px" width="240px" layout="flex-item"></amp-img>
flex-item
は親要素がフレキシブルの場合、レイアウトを指定した要素と兄弟要素で使用可能なスペースを占有します。その為、各要素の幅は要素数に影響されてサイズが決まります。
レイアウトにintrinsic
を指定した時は下記のようになります。
<amp-img src="sample.png" height="126px" width="240px" layout="intrinsic"></amp-img>
intrinsic
は指定したサイズのアスペクト比を保ちながら使用可能なスペースを占有します。responsive
と異なり高さが要素本来のサイズよりも大きくなることはなく、上記も幅はまだ占有可能なスペースが残っていますが高さが 126px になりこれ以上大きくなりません。
レイアウトにnodisplay
を指定した時は下記のようになります。
<amp-img src="sample.png" layout="nodisplay"></amp-img>
nodisplay
は要素を表示しないので上記のように画像は表示されません。
AMP ではメディアに関する要素のサイズを明示的に指定する必要がありますが、このようにlayout
属性でレイアウトを指定することでレスポンシブにも対応したデザインを実装できるようになります。