自動生成されるpreタグとcodeタグのスタイルをCSSだけで切り分ける方法
対象読者
- Markdownから自動的にHTMLを生成しているがゆえに、コードブロックのインラインコードのスタイリングの切り分けをできずに困っている人
- わざわざpreタグとcodeタグの構造を意識しなくてもいい感じにスタイリングを切り分けたい人
どういった場面で発生するか
MarkdownからHTMLを自動生成してくれるJavaScriptライブラリはいくつか存在しています。例えばremark
やreact-markdown
、marked
といったものがあげられます。
それぞれのライブラリで挙動に違いはあると思いますが、基本的にコードブロックとインラインコードの入出力は下記のようになると思います。
コードブロック
入力(Markdown)
``` console.log('Hello World!') ```
出力(HTML)
<pre> <code> console.log('Hello World!) </code> </pre>
インラインコード
入力(Markdown)
`console.log('Hello World!')`
出力(HTML)
<code>console.log('Hello World!)</code>
pre
タグとcode
タグのCSSの設定に困る
pre
タグにはコードブロックとしてのスタイルを、code
タグにはインラインコードのスタイルを与えようとして、下記のようにCSSを設定したとします。
pre { background: black; } code { background: light-gray; }
しかし、こうしてしまうとコードブロックにもcode
タグが使われているため、結果的に、コードブロックとインラインコードのどちらにもbackground: light-gray
が適用されてしまいます。
pre
タグとcode
タグのCSSを切り分ける方法
ではどのように指定すれば良いかというと、下記のようにpre
タグの下にあるcode
タグは無視するようにCSSを設定してあげれば良いです。
pre { background: black; } *:not(pre) code { background: light-gray; }
*:not(pre) code
を言葉で説明をするならば、「pre
タグを除く全ての要素の配下にあるcode
タグ」という指定になります。
詳しくはMDNを参考にしてみてください。(最近MDNのデザインがカッコ良くなってちょっと嬉しい)
- https://developer.mozilla.org/ja/docs/Web/CSS/Universal_selectors
- https://developer.mozilla.org/ja/docs/Web/CSS/:not
最後に
CSSは無限大なので、今回紹介した方法以外にも回避策はたくさんあると思います。ただ、その中でもこの方法を紹介した理由として、コードブロックにはシンタックスハイライトを導入するためのライブラリを使いたいという人が多いかと思います。
そこで、pre
タグなどのコードブロックは自動的にスタイリングされてしまいます。そのためcode
タグに着目した回避策を紹介させていただきました。
ぜひ参考にしてみてください。