CSSとスタイル
AstroはスタイリングやCSSの記述を簡単にするために設計されました。Astroコンポーネントの内部に直接CSSを記述したり、Tailwindなどのお気に入りのCSSライブラリをインポートできます。SassやLessなどの高度なスタイリング言語もサポートされています。
Astroでのスタイリング
セクションタイトル: AstroでのスタイリングAstroコンポーネントのスタイリングは、コンポーネントまたはページテンプレートに<style>
タグを追加するだけで簡単です。Astroコンポーネント内に<style>
タグを設置すると、AstroがCSSを検出し、スタイルを自動で処理します。
スコープされたスタイル
セクションタイトル: スコープされたスタイルAstroの<style>
CSSルールは、デフォルトで自動的にスコープされます。スコープされたスタイルは、その同じコンポーネントの内部に書かれたHTMLにのみ適用されるように内部でコンパイルされます。Astroコンポーネント内に記述したCSSは、自動的にそのコンポーネントの中にカプセル化されます。
このCSSは、
このようにコンパイルします。
スコープされたスタイルはリークしないので、サイトの他の部分に影響を与えることはありません。Astroでは、h1 {}
やp {}
のようなユニークではないセレクタを使用しても問題ありません。なぜなら、最終的な出力ではスコープされてコンパイルされるからです。
また、スコープされたスタイルは、テンプレート内に含まれる他のAstroコンポーネントには適用されません。子コンポーネントにスタイルを設定する必要がある場合、そのコンポーネントを<div>
(または他の要素)でラップしてからスタイルを付与するか検討してください。
スコープされたスタイルの詳細度は維持され、他のCSSファイルやCSSライブラリと一緒に一貫して動作でき、スタイルがコンポーネント外に適用されるのを防ぐ境界は維持されます。
グローバルスタイル
セクションタイトル: グローバルスタイルほとんどのコンポーネントではスコープされたスタイルを使うことをおすすめしますが、いずれはグローバルでスコープされていないCSSを書くまっとうな理由が見つかるかもしれません。この場合、<style is:global>
属性を使って、CSSの自動的なスコープを無効にできます。
また、:global()
セレクタを使用すると、同じ<style>
タグ内にグローバルなスタイルとスコープ付きのスタイルを混在させられます。これは、コンポーネントの子要素にスタイルを適用するための強力なパターンになります。
これは、ブログの投稿や、CMSを使用したドキュメントなど、コンテンツがAstroの外にあるものをスタイルするのに最適な方法です。ただし、特定の親コンポーネントを持つかどうかで外観が異なるコンポーネントは、トラブルシューティングが困難になる可能性があるので注意が必要です。
できるだけスコープされたスタイルを使用してください。グローバルなスタイルは、必要なときだけ使うべきです。
class:list
によるクラスの結合
セクションタイトル: class:listによるクラスの結合要素上のクラスを動的に組み合わせる必要がある場合、.astro
ファイルのclass:list
ユーティリティ属性を使用できます。
📚 class:list
の詳細については、ディレクティブのリファレンスページを参照してください。
CSS変数
セクションタイトル: CSS変数astro@0.21.0
Astroの<style>
は、ページ上で利用可能なあらゆるCSS変数を参照できます。また、define:vars
ディレクティブを使用して、コンポーネントのfrontmatterから直接CSS変数を渡せます。
📚 define:vars
については、ディレクティブのリファレンスのページをご覧ください。
子コンポーネントへのclass
の受け渡し
セクションタイトル: 子コンポーネントへのclassの受け渡しAstroでは、class
のようなHTML属性は子コンポーネントには自動で伝わりません。
その代わり、子コンポーネントでclass
プロパティを受け取り、それをルート要素に適用します。class
はJavaScriptの予約語なので、分割代入を利用して名前を変更する必要があります。
このパターンでは、子コンポーネントに直接スタイルを設定できます。Astroは、親のスコープ付きクラス名(例:astro-hhnqfkh6
)をclass
プロパティを通して自動的に渡し、その子を親のスコープに含めます。
class
プロパティは親のスコープに子を含むので、親から子へスタイルがカスケードされる可能性があります。このような意図しない副作用を避けるには、子コンポーネントでユニークなクラス名を使用するようにします。
インラインスタイル
セクションタイトル: インラインスタイルHTML要素は、style
属性を使ってインラインでスタイルを設定できます。これは、CSS文字列またはCSSプロパティのオブジェクトで指定できます。
外部スタイル
セクションタイトル: 外部スタイル外部のグローバルなスタイルシートを参照する方法は2つあります。プロジェクトのソース内にあるファイルの場合はESMのインポート、public/
ディレクトリにあるファイルやプロジェクトの外部でホストされているファイルの場合は絶対URLリンクになります。
📚 詳しくはpublic/
やsrc/
にある静的アセットの使い方をご覧ください。
ローカルスタイルシートのインポート
セクションタイトル: ローカルスタイルシートのインポートnpmパッケージからインポートする場合、astro.config
を更新する必要があるかもしれません。以下のスタイルシートをnpmパッケージからインポートするをご覧ください。
ESMのインポート構文を使用して、Astroコンポーネントのfrontmatterでスタイルシートをインポートできます。CSSのインポートは、Astroコンポーネント内の他のESMのインポートのように動作し、コンポーネントからの相対パスを、ほかのimportと同様にコンポーネントスクリプトの先頭に記述しなければなりません。
ESMによるCSSのimport
は、ReactやPreactのようなJSXコンポーネントを含む、あらゆるJavaScriptファイル内でサポートされています。 これは、Reactコンポーネントに対して、コンポーネント単位できめ細かいスタイルを記述するのに便利です。
npmパッケージからスタイルシートをインポートする
セクションタイトル: npmパッケージからスタイルシートをインポートするまた、外部のnpmパッケージからスタイルシートを読み込む必要がある場合もあります。これは特にOpen Propsのようなユーティリティでよくあることです。パッケージがファイル拡張子の使用を推奨している場合(例:package-name/styles
の代わりに package-name/styles.css
)、これは他のローカルスタイルシートと同様に動作するはずです。
パッケージがファイル拡張子の使用を推奨していない場合(例: package-name/styles
)は、まずAstroの設定を更新する必要があります!
package-name
からnormalize
という名前のCSSファイルをインポートしているとします(ファイル拡張子は省略されています)。ページを正しくプリレンダリングするために、package-name
をvite.ssr.noExternal
配列に追加してください。
これで、package-name/normalize
を自由にインポートできるようになりました。これは、他のローカルスタイルシートと同様に、Astroによってバンドルされ、最適化されます。
“link”タグで静的スタイルシートを読み込む
セクションタイトル: “link”タグで静的スタイルシートを読み込むまた、<link>
要素を使用して、ページにスタイルシートを読み込めます。これは、/public
ディレクトリにあるCSSファイルへの絶対URLパスか、外部のウェブサイトへのURLである必要があります。<link>
のhref値を相対パスで指定することはサポートされていません。
この方法ではpublic/
ディレクトリを使用するため、Astro が提供する通常のCSS処理、バンドル、最適化はスキップされます。これらの変換が必要な場合は、上記のローカルスタイルシートのインポートの方法を使用してください。
カスケード順序
セクションタイトル: カスケード順序Astroのコンポーネントは、複数のCSSのソースを評価しなければならないことがあります。たとえば、コンポーネントはCSSスタイルシートをインポートし、それ自身の<style>
タグを含み、CSSをインポートするレイアウトの中でレンダリングされるかもしれません。
同じ要素に相反するCSSルールが適用される場合、ブラウザはまず詳細度、次に出現順のルールにしたがって、どちらの値を使って表示するか決定します。
あるルールが他のルールよりも詳細度が高い場合、CSSルールがどこに書かれていても、その値が優先されます。
2つのルールが同じ詳細度を持つ場合、出現順序が評価され、最後のルールの値が優先されます。
Astro CSSのルールは、つぎの出現順で評価されます。
- head内の
<link>
タグ (最も低い優先順位) - インポートされたスタイル
- scoped styles (最優先)
スコープされたスタイル
セクションタイトル: スコープされたスタイルスコープされたスタイルを使用しても、CSSの詳細度が高まるわけではありませんが、常に登場順が最後になります。したがって、同じ比重の他のスタイルよりも優先されます。たとえば、スコープされたスタイルと競合するスタイルシートをインポートした場合、スコープされたスタイルの値が適用されます。
インポートされたスタイルの詳細度をあげると、スコープされたスタイルより優先されます。
インポート順序
セクションタイトル: インポート順序Astroコンポーネントで複数のスタイルシートをインポートする場合、CSSルールはインポートされた順番に評価されます。CSSがいつ評価されるかにかかわらず、より高い詳細度によって、表示するスタイルが常に決定されます。しかし、競合するスタイルが同じ比重を持つ場合、最後にインポートされたものが優先されます。
<style>
タグはスコープされ、それを宣言したコンポーネントにのみ適用されますが、インポートしたCSSは「リークする」ことがあります。コンポーネントをインポートすると、そのコンポーネントが使用されない場合でも、インポートしたCSSがすべて適用されます。
Astroでよくあるパターンは、Layoutコンポーネントの中にグローバルCSSをインポートすることです。Layoutコンポーネントは必ず他のインポートより先にインポートして、優先順位を一番低くしてください。
link
タグ
セクションタイトル: linkタグlinkタグで読み込まれたスタイルシートは、Astroファイル内の他のどのスタイルよりも先に、順番に評価されます。したがって、これらのスタイルは、インポートされたスタイルシートやスコープされたスタイルよりも優先順位が低くなります。
CSSインテグレーション
セクションタイトル: CSSインテグレーションAstroには、Tailwindなど、人気のCSSライブラリやツール、フレームワークをプロジェクトに追加するための仕組みがあります!
Tailwind
セクションタイトル: TailwindプロジェクトでTailwindを使用するには、公式のAstro Tailwindインテグレーションを、パッケージマネージャーのastro add
コマンドを使ってインストールします。
📚 Astroインテグレーションのインストール、インポート、設定の手順については、インテグレーションガイドを参照してください。
CSSプリプロセッサ
セクションタイトル: CSSプリプロセッサAstroは、Viteを通じて、Sass、Stylus、LessといったCSSプリプロセッサをサポートしています。
SassとSCSS
セクションタイトル: SassとSCSS.astro
ファイルで<style lang="scss">
または<style lang="sass">
を使用します。
Stylus
セクションタイトル: Stylus.astro
ファイルで<style lang="styl">
または<style lang="stylus">
を使用します。
Less
セクションタイトル: Less.astro
ファイルで<style lang="less">
を使用します。
フレームワークコンポーネントにおいて
セクションタイトル: フレームワークコンポーネントにおいて上記のCSSプリプロセッサは、JSフレームワークの中でも使用できます。ただし、各フレームワークが推奨するパターンに従ってください。
- React / Preact:
import Styles from './styles.module.scss'
; - Vue:
<style lang="scss">
- Svelte:
<style lang="scss">
PostCSS
セクションタイトル: PostCSSAstroには、Viteの一部としてPostCSSが同梱されています。プロジェクトにPostCSSを設定するには、プロジェクトルートにpostcss.config.cjs
ファイルを作成します。プラグインはrequire()
を使ってインポートできます。
フレームワークとライブラリ
セクションタイトル: フレームワークとライブラリ📘 React / Preact
セクションタイトル: 📘 React / Preact.jsx
ファイルはグローバルCSSとCSS Modulesの両方をサポートしています。後者を有効にするには、.module.css
拡張子を使用します。(Sassを使用している場合は.module.scss
/.module.sass
)。
📗 Vue
セクションタイトル: 📗 VueAstro内のVueは、vue-loader
と同じメソッドをサポートしています。
📕 Svelte
セクションタイトル: 📕 SvelteAstro内のSvelteも期待通りに動作します。Svelte Styling Docs
Markdownのスタイル
セクションタイトル: MarkdownのスタイルAstroのスタイル方法は、Markdownレイアウトコンポーネントで利用可能ですが、それぞれの方法には異なったスタイリングへの影響があります。
ページコンテンツを包むレイアウトにインポートしたスタイルシートを追加することで、Markdownコンテンツにグローバルスタイルを適用できます。
また、レイアウトコンポーネントに、<style is:global>
タグがついたMarkdownでスタイルを追加することも可能です。追加されたスタイルは、アストロのカスケード順序
に沿っていることを確認し、スタイルが意図した通りに適用されているか慎重にチェックしてください。
加えて、Tailwindを含むCSSのインテグレーションの追加もできます。 Tailwindを使用している場合、Markdownのスタイリングにはtypographyプラグインが便利です。
本番環境
セクションタイトル: 本番環境バンドルの調整
セクションタイトル: バンドルの調整Astroが本番環境向けにサイトをビルドする際、CSSはミニファイされチャンクへと結合されます。サイト上の各ページはそれぞれ独自のチャンクを取得し、さらに複数のページ間で共有されるCSSは、再利用のために独自のチャンクに分割されます。
しかし、複数のページでスタイルを共有している場合、共有される一部のチャンクが非常に小さくなる場合があります。それらがすべて別々に送信された場合、スタイルシートへのリクエストが増加し、サイトのパフォーマンスに影響を与える可能性があります。そのため、Astroはデフォルトでは、HTML内の4kB以上のスタイルシートのみを<link rel="stylesheet">
タグとしてリンクし、それ以外のものは<style type="text/css">
にインライン化します。このアプローチにより、追加のリクエストの数と、ページ間でキャッシュされるCSSの量のあいだのバランスをとることができます。
ViteのassetsInlineLimit
ビルドオプションを使用して、スタイルシートが外部にリンクされるサイズをバイト単位で設定できます。このオプションは、スクリプトと画像のインライン化にも影響することに注意してください。
すべてのスタイルシートを外部リンクとしたい場合は、inlineStylesheets
ビルドオプションを設定します。
このオプションを'always'
に設定すると、すべてのスタイルシートがインライン化されます。
アドバンスド
セクションタイトル: アドバンスドAstroの組み込みCSSバンドル機能をバイパスする場合は注意が必要です!スタイルはビルド後のアウトプットに自動的には含まれません。参照されたファイルが最終的なページ出力に、ちゃんと含まれることを確認しましょう。
?raw
CSSインポート
セクションタイトル: ?raw CSSインポート高度なユースケースでは、Astroによってバンドルまたは最適化されることなく、CSSをsrc
ディレクトリ内から直接読み込めます。これは、CSSのスニペットを完全に制御する必要がある場合や、Astroの自動CSS処理をバイパスする必要がある場合に便利です。
これはほとんどユーザーにおすすめされません。
詳しくはViteのドキュメントをご覧ください。
?url
CSSインポート
セクションタイトル: ?url CSSインポート高度な使い方をする場合、プロジェクトのsrc/
ディレクトリ内にあるCSSファイルを直接のURL参照でインポートできます。これは、CSSファイルがどのようにページに読み込まれるかを完全に制御する必要がある場合に便利です。しかし、この場合、そのCSSファイルをページの残りのCSSと一緒に最適化することはできません。
これはほとんどのユーザーにはおすすめできません。代わりに、CSSファイルをpublic/
内に配置し、一貫したURLの参照を得られるようにしましょう。
?url
を指定して小さいCSSファイルをインポートすると、Base64でエンコードされたCSSファイルの内容がデータURLとして返されることがありますが、これは最終的なビルドのときだけです。エンコードされたデータURL(data:text/css;base64,...
)をサポートするようにコードを書くか、この機能を無効にするためにvite.build.assetsInlineLimit
設定オプションを 0
にセットする必要があります。
詳しくはViteのドキュメントをご覧ください。
Learn