このブログでは、プログラミングの用語など、少し専門的な言葉が出てくることがよくあります。
そのときに、いちいち言葉の意味を解説すると、
書き手としても、その分野の用語をよく知っている読み手としても、くどくなってしまいます。
かといって解説を書かないのも初学者に不親切です。
そのため、その言葉の意味を知らない人はマウスオーバー(スマホやタブレットならタップ)で
言葉の簡単な説明が見られるようにしています。
これはツールチップというそうです。
今回は、
がどのように実装できるかお話していきます。コーディング
こちらを参考にさせていただきました。
HTML
文中にも書くため、<span>
タグを使っています。
1<span class="tooltip" ontouchstart="">2<span class="tooltip-base">(もとの文字列)</span>3<span class="fukidashi">(吹き出しに表示される文字列)</span>4</span>
ontouchstart というのは、スマホなどのタッチデバイスで指が触れたときに発生するイベントです。
念のためつけています。
CSS
SCSS で書いています。
1.tooltip {2position: relative;3cursor: help; // マウスカーソルを変更4color: #f48b7b; // 文字色5a {6color: #f48b7b;7}8}910.fukidashi {11transition: .5s; // アニメーション秒数12z-index: -1; // 他と重なったときの上からの順番13opacity: 0; // 不透明度14min-width: 10em; // 最小の幅1516// 位置調整17position: absolute;18left: -1em;19bottom: 100%;20padding: 0.5em;21margin-bottom: 1em;2223font-size: 0.6em; // フォントサイズ24border-radius: 0.6em; // 角を丸く25background: #fff0f0; // 背景色2627&::after {28content: ""; // 内容2930// 位置調整31position: absolute;32left: 25%;33bottom: -1em;3435// 三角形の描画36border-top: solid 1em #fff0f0;37border-left: solid 0.5em transparent;38border-right: solid 0.5em transparent;39}40}4142.tooltip:hover .fukidashi {43z-index: 0; // 他と重なったときの上からの順番44opacity: .96; // 不透明度45}
修飾が多いですが、最低限必要となるのは黄色でマークした部分だけです。
after
疑似要素によって、fukudashi
の要素直後に三角形を描いています。
最初は CSS で三角形だなんて何事だと思いました笑が、
こちらのサイトを読んでいたらなんとなくわかりました。
→ CSSだけで三角形を作ろう!その1:borderプロパティの仕組みをマスター | 株式会社グランフェアズ
ちなみにこの状態では表示された吹き出しにマウスポインタを移動させても表示され続けますが、
42行目を.tooltip-base:hover + .fukidashi
とすれば、
文字からマウスポインタを離すと吹き出しは消えてしまいます。
.tooltip-base:hover + .fukidashi
は.tooltip-base
にマウスオーバーしたときに.fukudashi
に適用されるスタイルを指定します。
Hugo ショートコードとあわせて
記事内で多用するので、ショートコードを作りました。
ショートコードを使うには、/layouts
以下にshortcodes
フォルダを作り、
ショートコード名と同名のファイルを作成します。
/layouts/shortcodes/tooltip.html1{{- $inner := .Inner -}}2{{- $split := split $inner `((` -}}3{{- $tooltip_base := index $split 0 -}}4{{- $fukidashi := index $split 1 -}}56<span class="tooltip" ontouchstart="">7<span class="tooltip-base">{{ $tooltip_base | markdownify }}</span>8<span class="fukidashi">{{ $fukidashi | markdownify }}</span>9</span>
.Inner
には
{{< shortcode_name >}}{{< /shortcode_name >}}
で挟まれた部分が渡されます。
例えば{{< tooltip >}}やっほー((**太字**だよ{{< /tooltip >}}
と書けば、
.Inner
にやっほー((**太字**だよ
が変数$inner
に渡されます。
split
は指定した分割記号で文字列を分離したリスト(スライス)を返します。
((
の前の内容が$tooltip_base
に、後の内容が$fukidashi
に渡されます。
例えばやっほー((**太字**だよ
はやっほー
と**太字**だよ
に分けられ、
後者は最終的には<strong>太字</strong>だよ
となります。
markdownify
はマークダウンとして処理をするということです。
今回は((
で前後を分けていますが、より複雑な分け方をしたい場合は正規表現を使うとよいでしょう。
tooltip.html1...2{{- $pattern := `^(.+)\\(\\((.+)$` -}}3{{- $tooltip_base := replaceRE $pattern `$1` $inner -}}4{{- $fukidashi := replaceRE $pattern `$2` $inner -}}5...
ところで、ここでは{{}}
の中の-
は必須です。
これがないとこの行が空行とみなされてしまいます。
ここはマークダウンファイルの中なので、その空行を見つけてマークダウン処理がなされ、
表示がおかしくなってしまいます。
吹き出しは難しそうに見えますが、表示させるだけなら比較的簡単に実装できます。
お役に立てたらうれしいです。
それでは