ブログのCSSをTailwindで書き直した


DE-TEIUです。 今日はこのブログのソースのレイアウト微調整(というかほぼリファクタリング)を実施しました。 やったこととしては、単純にTailwindを導入してstyleタグ内に定義した諸々のCSSを消してTailwindのクラスをhtmlのclass属性に設定していっただけです。

AstroにTailwind導入

公式ドキュメントに書いてあるんですが、実質的には以下のコマンドを実行するだけ。

$ npx astro add tailwind

これを実行するだけで、Tailwindの導入が完了し、astro.config.mjsにそれっぽい設定が追記されます。以上。簡単。

ソース内に定義されているCSSをTailwindに置き換えてみる

変更前のトップページには、こんな感じでstyleタグの中にCSSがずらっと定義されていました。 (ほぼAstroのブログテンプレートにあったものをそのまま使ってました)

main {
  width: 960px;
}
ul {
  display: flex;
  flex-wrap: wrap;
  gap: 2rem;
  list-style-type: none;
  margin: 0;
  padding: 0;
}
ul li {
  width: calc(50% - 1rem);
  margin-bottom: 1rem;
}
ul li * {
  text-decoration: none;
  transition: 0.2s ease;
}
ul li:first-child {
  width: 100%;
  margin-bottom: 1rem;
}
ul li:first-child img {
  width: 100%;
}
ul li:first-child .title {
  font-size: 2.369rem;
}
ul li img {
  margin-bottom: 0.5rem;
}
ul li a {
  display: block;
}
.title {
  margin: 0;
  color: rgb(var(--black));
  line-height: 1;
}
.date {
  margin: 0;
  color: rgb(var(--gray));
}
ul li a:hover h4,
ul li a:hover .date {
  color: rgb(var(--accent));
}
ul a:hover img {
  box-shadow: var(--box-shadow);
}
@media (max-width: 720px) {
  ul {
    gap: 0.5em;
  }
  ul li {
    width: 100%;
  }
  ul li:first-child {
    margin-bottom: 0;
  }
  ul li:first-child .title {
    font-size: 1.563em;
  }
}

ここに定義されているスタイルを少しずつ消して、対応するタグにTailwindのクラスを設定してきます。 (一気に消そうとすると「どこをどう直すんだっけ」って途中でわからなくなるので危険)

そして最終的にできたソースのhtml部分はこちら。

<main class="mx-auto">
  <section>
    <ul class="flex flex-wrap gap-8 list-none p-0 m-0 max-[720px]:gap-4">
      {
        posts.map((post, index) => (
          <li
            class={`mb-4 max-[720px]:w-full ${index === 0 ? "w-full" : "w-[calc(50%-1rem)]"}`}
          >
            <div class="window">
              <a href={`/blog/${post.id}/`} class="title-bar block">
                <div class="title-bar-text">{post.data.title}</div>
              </a>
              <a href={`/blog/${post.id}/`} class="window-body block">
                <img
                  class={`${index === 0 ? "w-full" : "mb-2"}`}
                  width={720}
                  height={360}
                  src={
                    post.data.heroImage === ""
                      ? "/default_eye_catch.png"
                      : post.data.heroImage
                  }
                  alt=""
                />
              </a>
              <div class="status-bar">
                <p class="status-bar-field text-gray-900">
                  <FormattedDate date={post.data.pubDate} />
                </p>
              </div>
            </div>
          </li>
        ))
      }
    </ul>
  </section>
</main>

…なんかまだリファクタリングの余地は全然ありそうだが、これでstyleタグを消してもほぼ同じレイアウトになった。ひとまず当初の目的は達成。 あとで他のページも同様に直していきます。以上。