経緯
react-markdown
は MarkdownをHTMLに変換してくれる便利なライブラリですが、
Tailwind CSS と一緒に使うと、ブラウザ標準のMarkdown用スタイルがリセットされ、
見出しやリストが「ただのテキスト」になってしまうことがあります。
この問題の定番対策は、@tailwindcss/typography
を導入してprose
クラスを当てることです。
しかし、私の環境ではなぜかtypographyがまったく効かないという事態に遭遇…。
そこで発想を変え、Markdown表示用のCSSを自作して当てるというパワー系の方法で解決しました。
解決方法
- Markdown表示用CSSを作る
src/app/globals.css
(Next.jsの場合)に以下を追加します。
.markdown-body {
line-height: 1.6;
color: inherit;
word-break: break-word;
}
/* 見出し */
.markdown-body h1 {
font-size: 2rem;
font-weight: bold;
margin: 1.5rem 0 1rem;
border-bottom: 1px solid #ddd;
padding-bottom: 0.3rem;
}
.markdown-body h2 {
font-size: 1.5rem;
font-weight: bold;
margin: 1.25rem 0 0.75rem;
border-bottom: 1px solid #eee;
padding-bottom: 0.2rem;
}
.markdown-body h3 {
font-size: 1.25rem;
font-weight: bold;
margin: 1rem 0 0.5rem;
}
.markdown-body h4 {
font-size: 1.125rem;
font-weight: bold;
margin: 0.75rem 0 0.5rem;
}
.markdown-body h5 {
font-size: 1rem;
font-weight: bold;
margin: 0.75rem 0 0.5rem;
}
.markdown-body h6 {
font-size: 0.875rem;
font-weight: bold;
color: #666;
margin: 0.75rem 0 0.5rem;
}
/* 段落 */
.markdown-body p {
margin: 0.5rem 0;
}
/* リスト */
.markdown-body ul {
list-style: disc;
padding-left: 1.5rem;
margin: 0.5rem 0;
}
.markdown-body ol {
list-style: decimal;
padding-left: 1.5rem;
margin: 0.5rem 0;
}
.markdown-body li {
margin: 0.25rem 0;
}
/* 引用 */
.markdown-body blockquote {
border-left: 4px solid #ccc;
padding-left: 1rem;
margin: 0.5rem 0;
color: #666;
background: #f9f9f9;
}
/* コード */
.markdown-body pre {
background: #f5f5f5;
padding: 0.75rem;
border-radius: 6px;
overflow-x: auto;
}
.markdown-body code {
background: #f5f5f5;
padding: 0.2rem 0.4rem;
border-radius: 4px;
font-size: 0.9em;
}
/* リンク */
.markdown-body a {
color: #3b82f6;
text-decoration: underline;
}
.markdown-body a:hover {
color: #2563eb;
}
/* 水平線 */
.markdown-body hr {
border: none;
border-top: 1px solid #ccc;
margin: 1.5rem 0;
}
/* 画像 */
.markdown-body img {
max-width: 100%;
height: auto;
}
/* 表 */
.markdown-body table {
border-collapse: collapse;
margin: 1rem 0;
}
.markdown-body th,
.markdown-body td {
border: 1px solid #ccc;
padding: 0.25rem 0.5rem;
}
.markdown-body th {
background: #f3f4f6;
text-align: left;
}
2.ReactMarkdown にクラスを当てる
Markdownを表示するコンポーネントのラッパーにmarkdown-body
クラスをつけます。
<div className="markdown-body">
<ReactMarkdown remarkPlugins={[remarkGfm]}>
{content}
</ReactMarkdown>
</div>
メリット
- Tailwind Typography など外部プラグインに依存しない
- 表示スタイルを完全に自分好みにカスタマイズ可能
- 環境依存の不具合を回避できる