SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Astroで始める静的サイト作成入門

Astroにおけるコンポーネントの基本~初心者もベテランも欲しかった! 最適化されたCSSスコープ~

AstroコンポーネントのスタイルとCSSの便利なスコープ化

 次に、Astroコンポーネントにおけるスタイリング、およびCSSの影響範囲についてご紹介します。

 Astroコンポーネントに記述したマークアップを装飾したい場合は、同ファイル内で<style>タグを追加して、直接CSSを記述することができます。

<header class="header">
  <a href="/"><img src="/favicon.svg" alt="Astro" width="40" height="40"></a>
  <nav>
    <ul class="menu">
      <li><a href="/">Home</a></li>
      <li><a href="/about">About</a></li>
    </ul>
  </nav>
</header>

<style>
  .header {
    display: flex;
    gap: 1rem;
    align-items: center;
  }
  .menu {
    display: flex;
    gap: 1rem;
    margin: 0;
    padding: 0;
    list-style-type: none;
  }
</style>

 上記のように、ヘッダー用のコンポーネントであるHeader.astroを一部修正し、classの付与と<style>タグ内にレイアウトを調整するCSSを記述しました。

 開発サーバーで、ヘッダーに対してスタイルが適用されていることが確認できます。

ヘッダーコンポーネントに対してスタイルを適用する
ヘッダーコンポーネントに対してスタイルを適用する

 このように、Astroコンポーネントは、HTMLとCSSをひとまとめにしたUIパーツとして、見通しの良いコーディングを行うことができます。

 ここで先ほどHeader.astro内で記述した<style>の内容を振り返ってみましょう。

<style>
  .header {
    display: flex;
    gap: 1rem;
    align-items: center;
  }
  .menu {
    display: flex;
    gap: 1rem;
    margin: 0;
    padding: 0;
    list-style-type: none;
  }
</style>

 .header.menuなど、いかにも汎用的で、どこかでバッティングしそうなclass名が使われていることが気になるのではないでしょうか?

 CSSを記述するうえでの注意点の一つ、「同名のclass指定により、スタイルが上書きされる」を気にしなければならないところですが、Astroコンポーネント内の<style>で記述されたCSSは、同コンポーネント内に記述されたマークアップにのみ適用されるように、自動的に影響範囲が限定されるようになっています。

 ブラウザの開発ツールを用いてHTML上のヘッダー要素を確認してみましょう。

<header class="header" data-astro-cid-3ef6ksr2>
  <a href="/" data-astro-cid-3ef6ksr2><img src="/favicon.svg" alt="Astro" width="40" height="40" data-astro-cid-3ef6ksr2></a>
  <nav data-astro-cid-3ef6ksr2>
    <ul class="menu" data-astro-cid-3ef6ksr2>
      <li data-astro-cid-3ef6ksr2><a href="/" data-astro-cid-3ef6ksr2>Home</a></li>
      <li data-astro-cid-3ef6ksr2><a href="/about" data-astro-cid-3ef6ksr2>About</a></li>
    </ul>
  </nav>
</header>

 <header class="header" data-astro-cid-3ef6ksr2>のように、ユニークなdata属性(data-***)が自動的に付与されていることがわかります。

 そして、適用されているCSSを見ると、

.header[data-astro-cid-3ef6ksr2] {
  display: flex;
  gap: 1rem;
  align-items: center;
}

 HTMLに付与されたdata属性(data-***)を使って、そのコンポーネント内の要素に範囲を限定してスタイルが適用されるようになっています。

 仮に別のAstroコンポーネント内で同名の.headerが使われたとしても、そのコンポーネント内の要素に限定されたCSSとして機能するため、意図しないスタイルの上書きを防ぐことができます。

 注意点として、グローバルに読み込まれたCSSファイル内に同名のclassがあれば、上書きや追加の対象となります。

 AstroによるCSSのスコープ化は非常に便利ですが、それを過信し過ぎず、適度な命名規則を心がけるようにしましょう。

外部スタイルの利用

 Astroでは、コンポーネント内でスコープされたCSSの他に、外部のグローバルなスタイルシートを読み込んで使用することもできます。

 準備として、src/cssフォルダーを作成し、中にglobal.cssファイルを作成します。

src/css/global.cssを作成する
src/css/global.cssを作成する

 global.cssにすべてのページに適用されるCSSを記述します。

:root {
  --color-primary: #1e40af;
}

body {
  margin: 0;
  padding: 2rem;
  background-color: #eff6ff;
}

 そして、index.astroで、global.cssを読み込む記述を追加します。

---
import "../css/global.css";
import Header from '../components/Header.astro';
---
<!DOCTYPE html>
<html lang="ja">
  <head>...(略)...</head>
  <body>
    ...(略)...
    <main class="main">
      <article class="article">
        <h1 class="title">Astro</h1>
        <p>Homeページです。</p>
      </article>
    </main>
  </body>
</html>

 修正箇所は以下のとおりです。

  • コンポーネントスクリプト内で、global.cssをimportする(読み込むページから見た相対パスで記述) import "../css/global.css";

 開発サーバーで、Homeページにglobal.cssで記述したスタイルが適用されていることが確認できます。

Astroコンポーネントに外部スタイルを適用する
Astroコンポーネントに外部スタイルを適用する

 このように、いわゆるリセットCSSや、CSSカスタムプロパティ、ベースとなるマークアップのスタイルなどを、外部のCSSファイルとして管理・運用することができます。

次のページ
Astroコンポーネントのprops

この記事は参考になりましたか?

Astroで始める静的サイト作成入門連載記事一覧

もっと読む

この記事の著者

池原健治(イケハラ ケンジ)

 ゲーム会社のUXデザイナー。デザイン、プロトタイピング、コーディングなどを担当する他、SNSでの情報発信や、登壇活動など、幅広く活動している。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/18715 2023/12/15 11:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー