見出し画像

GatsbyウェブサイトをCSS-in-JSでデザインする

個人的にCSSってすごく読みにくいんですよね。

そんな時にはCSS-in-JSを使うことで、スタイルのコンポーネントを新しく作成することで、ちょっと読みやすくすることができます。

作成したコンポーネントをインポートすれば、他のページでも同じようなデザインができるようにもなって便利です。

CSS-in-JSライブラリであるEmotionを使う

まずは必要なパッケージのインストールから始めます。

npm install gatsby-plugin-emotion @emotion/react @emotion/styled

続いてgatsby-config.jsにプラグインを追加して、使えるようにします。

plugins: [
   "gatsby-plugin-emotion",
   ...

あとは、各ページのデザインで、これらを使っていきます。

src/pagesにemotion.jsを作成し、Emotionを利用したページを作成します。

import * as React from 'react'
import Layout from '../components/layout'

import styled from "@emotion/styled"

const Headline = styled.h1`
   font-size: 2.5rem;
   background: lightpink;
   text-align: center;
`
const EmotionPage = () => {
 return (
   <Layout pageTitle="Emotion Page">
     <Headline>ヘッドラインはこうなります</Headline>
   </Layout>
 )
}
export default EmotionPage

最初にimport styled from "@emotion/styled"でstyledを使えるようにします。

そしてスタイルしたコンポーネントに名前(Headline)をつけて、styled.{htmlのタグ}などでcssの内容を定義していきます。

注意点としては、コンポーネントにスタイルを追加する場合は、styled(Link)のように丸括弧()で囲むようにします。

import {Link} from "gatsby"

const StyledLink = styled(Link)`
   font-size: 0.8rem;
   text-decoration: underline;
   color: blue;
`

これでコンポーネントが作成されたので、あとはページの中で使うだけです。上記のコードを実装して、ローカル開発環境を起動してみましょう。

以下のように、Headlineを使うことで、文字が大きくなり背景がピンク色になりました。

スクリーンショット 2021-11-16 12.47.12

実装結果

TailwindCSSを使うためにtwin.macroを使う

TailwindCSSを一緒に使いたい場合は、twin.macroとtailwindcssを追加でインストールします。emotionも必要になるので一緒にインストールします。

npm install twin.macro tailwindcss @emotion/react @emotion/styled gatsby-plugin-emotion

まだgatsby-config.jsにgatsby-plugin-emotionを追加していない場合は、追加しておきます。

  plugins: [
   "gatsby-plugin-emotion",

後はtwとstyledをtwin.macroからインポートして利用します。

使い方はemotionとほとんど変わりませんが、tailwindCSSのクラスを利用する場合は以下のようにtwを利用して書きます。

tailwindCSSのドキュメンテーションは以下にあります。

import tw, { styled } from "twin.macro"

const Button = styled.button`
 ${tw`bg-blue-500 hover:bg-blue-800 text-white p-2 rounded`}
`

スクリーンショット 2021-11-16 13.00.41

スクリーンショット 2021-11-16 13.00.49

マウスカーソルをあてると、色が変わるボタンをtailwindCSSを利用して作成できました。

実装結果

ブログ記事のMDXファイルをデザインする

以下の記事までに作成したブログ記事を利用します。

MDXファイルで作成しているブログ記事を、デザインしたいこともあると思います。そんなときはMDXProviderを利用します。src/pages/blogs/{mdx.slug}.jsに以下を追加します。

# src/pages/blogs/{mdx.slug}.js

import { MDXProvider } from "@mdx-js/react"

...中略...

まずはemotionやtwin.macroでデザインを作成します。とりあえず今回は、先ほど作成したHeadlineをそのまま使います。

# src/pages/blogs/{mdx.slug}.js

...中略...

import { styled } from "twin.macro"

const Headline = styled.h1`
   font-size: 2.5rem;
   text-align: center;
   background: lightpink;
 `
 
...中略...

続いて作成したコンポーネントを、MDXProviderに渡してMDXRendererを囲みます。

# src/pages/blogs/{mdx.slug}.js

...中略...

<MDXProvider components={{Headline}}>
    <MDXRenderer>
        {data.mdx.body}
    </MDXRenderer>
</MDXProvider>

...中略...

最後にブログ記事のMDXファイル内でこのコンポーネントを利用します。

# blogs/blog6.mdx

---
title: "RとPythonでデータ分析"
date: "2021-10-24"
category: "データ分析"
---

<Headline>RとPythonでデータ分析</Headline>
RとPythonの良いところを組み合わせて分析するよ!

これを実際に表示して見ると、以下のようになります。HeadlineのCSSが反映されていますね。

スクリーンショット 2021-11-16 13.06.57

MDXファイルの中身のデザインがちゃんと変更されました。

実装結果

まとめ

Gatsbyのデザインを作成するには、CSSよりCSS-in-JSを使った方が色々と便利です。個人的にはこっちの方がCSSのクラスがたくさん並んでいるよりみやすくなっています。


ここまで読んでいただけたなら、”スキ”ボタンを押していただけると励みになります!(*´ー`*)ワクワク



この記事が気に入ったらサポートをしてみませんか?