Tailwind CSS v1 で Typography プラグインを使う

CSS
公開日:

Tailwind CSS Typography は、CMS などから得られる素の HTML をスタイル付けする prose クラスを提供するプラグインです。

この記事では、Tailwind CSS v1.9.6 を使っている場合の導入の仕方を解説します。

インストール

Tailwind CSS v1.9.6 に対応する v0.2.0 をインストールします。

$ npm i -D @tailwindcss/typography@0.2.0

インストールできたら、tailwind.config.jsplugins に追記します。

// tailwind.config.js
module.exports = {
  //...
  plugins: [
    require('@tailwindcss/typography'),
  ],
  //...
}

使い方

prose クラスを付けた要素の中に、CMS などから得られた HTML を入れるだけです。

<!-- Vue.js -->
<article class="prose" v-html="vanillaHTML"></article>

<!-- vanilla HTML -->
<article class="prose">
  <h1>記事タイトル</h1>
  <h2>見出し</h2>
  <p>段落</p>
  <ul>
    <li>リスト</li>
  </ul>
</article>

レスポンシブにするには、prose クラスを付けつつ他の prose 系クラスを使います。

<article class="prose prose-sm md:prose" v-html="vanillaHTML"></article>

CSS ファイルサイズを節約したい

prose 系クラスによるレスポンシブは確かに読みやすいのですが、例えば上記の設定だと prose-smmd:prose 以下にもセレクタ群が生成されてしまい、ファイルサイズが大きくなります。

見た目は劣りますが、font-sizeline-height を調整することでもレスポンシブに対応することができます。

Typography のデフォルトは line-height: 1.75 ですが、Tailwind CSS にはこれにあたるクラスがないので追加します。他のブレイクポイントで使うものがあればついでに持ってきます。

// tailwind.config.js
const { 'default': prose, 'sm': proseSm } = require('@tailwindcss/typography/src/styles')
module.exports = {
  //...
  theme: {
    extend: {
      lineHeight: {
        prose: prose.css[1].lineHeight,
        'prose-sm': proseSm.css[0].lineHeight,
      },
    },
  },
  //...
}

prose-smtext-sm leading-prose-sm に、md:prosemd:text-base md:leading-prose に置き換えます。

<article class="prose text-sm md:text-base leading-prose-sm md:leading-prose"></article>

カスタマイズする

tailwind.config.js から Typography のスタイルを変更することができます。theme.typographytheme を引数に取るメソッドにすることで、Tailwind CSS のスタイルを参照することもできます。

theme.typography.default.css 内で指定できるセレクタ名は、node_modules/@tailwindcss/typography/src/styles.js で確認できます。

// tailwind.config.js
module.exports = {
  //...
  theme: {
    extend: {
      spacing: {
        '0.5': '.125rem',
        '1.5': '.375rem',
        '2.5': '.625rem',
        '3.5': '.875rem',
      },
    },
    typography: theme => ({
      default: {
        css: {
          // .prose の max-width を削除
          maxWidth: false,
          h4: {
            // h4 の font-weight を 600 に変更
            fontWeight: theme('fontWeight.semibold'),
            // h4 の margin-bottom を 0.75em に変更
            marginBottom: theme('spacing.3').replace('rem', 'em'),
          },
          code: {
            backgroundColor: theme('colors.gray.100'),
            color: '#964a91',
            // セレクタ内のプロパティを削除
            fontWeight: false,
            // 自分で設定した値も参照できる
            padding: `${theme('spacing[0.5]')} ${theme('spacing.1')}`,
            borderRadius: theme('borderRadius.sm'),
          },
          // セレクタ自体を削除
          'code::before': false,
          'code::after': false,
          'pre code::before': false,
          'pre code::after': false,
        },
      },
    }),
  },
  //...
}