昨日までに作成した資産 の見栄えを整えてみたいと思います。 Emotion を使用します。

Emotionを使うと以下のことができます。

  • css属性とcssタグ関数によるスタイルシート記述
  • styledタグ関数によるコンポーネント生成

後者については gatsby-plugin-styled-componentsと全く同じ感覚で利用できます。

1.プラグインのインストール

gatsby-plugin-emotion と必須コンポーネントをインストールします。

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

あわせて gatsby-config.js に gatsby-plugin-emotion のプラグイン設定を行います。

module.exports = {
  plugins: [
    `gatsby-plugin-emotion`,
    ()
}

2.Emotionの利用

例えば

const Article = ({ info }) => {
  const {title, slug, date} = info
  return (
    <div>
      <h1><Link to={slug}>{title}</Link></h1>
      <h2>{date}</h2>
    </div>
  )
}

この記述に対して

  • div に css属性を追加
  • h1 はスタイル記述を追加適用した Title コンポーネントとする。
  • h2 もスタイル記述を追加適用した Date コンポーネントとする。

といった変更を行うと、こんな感じになります:

import styled from "@emotion/styled"
import { css } from "@emotion/react"

const Title = styled.h1`
  font-size: 1.5rem;
  margin: 0px;
`

const Date = styled.h2`
  font-size: 1.0rem;
  margin: 0px;
  color: gray;
`

const Article = ({ info }) => {
  const {title, slug, date} = info
  return (
    <div css={css`
      margin: 10px;
      padding: 8px 12px;
      background-color: white;
    `}>
      <Title><Link to={slug}>{title}</Link></Title>
      <Date>{date}</Date>
    </div>
  )
}

Globalの利用

全体に影響を与えるCSS記述を行いたい場合は以下のように Global を使用します。

import { Global, css } from "@emotion/react"

const globalStyle = css`
  html {
    font-size: 10pt;
    background-color: #f0f0f0;
    padding: 20px;
  }
`


const Index = ({ data }) => {
  return (
    <>
      <Global styles={globalStyle}/>
      <div>
        {data.allMdx.edges.map(e => <Article info={e.node.frontmatter}/>)}
      </div>
    </>
  )
}

3.表示例

スタイル適用前:

スタイル適用前

スタイル適用後:

スタイル適用後

コードこちら:

かわかみしんいち。島根県津和野町在住のフリーランスエンジニア。複合現実(Mixed Reality)と3DUXでおもちゃを作るのが趣味。 https://github.com/ototadana