今日は CSS で、以下のように「どの言語のシンタックスハイライトなのか」を示すボックスを作りたいと思います。
- before
- after
前提
ぼくは Markdown でこの Blog を今書いているんですが、ソースコードを書くと、はてな Blog では以下の HTML でレンダリングが行われます。
$ echo "hello world" hello world
↓
<pre class="code lang-zsh" data-lang="zsh" data-unlink=""> $ <span class="synStatement">echo</span> <span class="synConstant">"hello world"</span> hello world </pre>
まずはボックスをつくる
上記のとおり、ソースコードは <pre class="code">
で記述されているので、まずはこれを利用してボックスを作ります。
CSS には疑似要素という考え方があり、特定の要素の特定の部分を整形することができます。文章の最初の文字、とかは良く見るのではないでしょうか。
ここでは、<pre class="code">
の最初の子要素を意味する ::before
を使って、ソースコードの最初に挿入することを狙います。
pre.code::before { position: absolute; top: 0px; right: 0px; content: attr(data-lang); }
ソースコードの右上に密着させたいので、position: absolute;
で絶対配置にした後、top
、right
をともに 0px
で指定します。
「どの言語なのか」については、はてな Blog の方で data-lang
属性に埋め込んでくれるので、これを取得するために content
を attr(data-lang)
にしています。
この結果が以下。zsh
の文字列が取得・配置できました。
整形
あとは整形します。
ちょっと文字列として右に寄り過ぎなので、padding
で横を 10px 空けます。
background-color
で背景色として黒を透過させ、フォント色とサイズを良いかんじにして出来上がりです。
pre.code::before { position: absolute; top: 0px; right: 0px; content: attr(data-lang); display: block; color: white; padding: 0px 10px; font-weight: bold; font-size: 0.6rem; background-color: rgba(0,0,0,0.3); }