タグをCSSで描く
カテゴリーで分類するアレです。
はじめに図解します。
元となる<a>
要素
display: inline-block
を設定することで幅・高さを設定出来、なおかつ改行せずに親要素の幅に合わせて流れ込んでくれます。
inline-block
の要素は流れこむ
inline-block inline-block inline-block inline-block inline-block
位置を調整していきます。
position: relative
を設定します、これによりtop
、left
などが効くようにしておきます。
僅かに空いた隙間は、改行やインデントなどの連続した空白文字が、半角スペース1文字分に変換されて出来たものです。
inline-block inline-block inline-block inline-block inline-blockleft: 5px
で本来の位置より右に5px
表示をずらします、左側に幅10px
のタグの菱型部分がくっつくので合計で左右5px
ずつ本来の幅より大きくなります。
inline-block inline-block inline-block inline-block inline-blockmargin-right
に8px
で隣り合うタグが重ならないようにします。
13px
にしないと計算が合わないような気がしますが、半角スペース分の隙間が初めからあるのでその分を考慮すると大体8px
になるということにしておきます。
なんとも頼りない計算ですが、そのためだけにスクリプトを走らせて改行・スペース・タブを除去するのも反映までのラグがあるのが嫌なので我慢します。
inline-block inline-block inline-block inline-block inline-block
その他もろもろ設定するとだいたいこんな感じになります。
後でホバー時の変化を付ける為にtransition: 200ms background-color
も設定しておきます。
inline-block inline-block inline-block inline-block inline-block
a { position: relative; display: inline-block; width: auto; height: 20px; line-height: 20px; font-size: 12px; color: #fff; background: #ccd; margin: 0.1em 8px 0.1em 0; padding: 0 4px; border-radius: 0px 2px 2px 0px; left: 5px; white-space: nowrap; transition: 200ms background-color; }
左側の菱型の部分
この部分はborder
を使って斜めの線を表現します。
上下左右で違う色を設定するとそれぞれの堺が斜めになるのを利用しています。
display: block
の幅・高さを0
に設定するとこんな感じになります。
.diagonal { display: block; width: 0; height: 0; border-top : 50px solid crimson; border-right : 50px solid darkblue; border-bottom: 50px solid darkcyan; border-left : 50px solid khaki; }
これを応用してタグの左側を作ります。
border-right
を#ccd
に変えます。
border-top
とborder-bottom
の色を透明色transparent
にします。
border-left
の幅を0px
にします。
出来ました。
これを小さくしてタグに応用します。
新しく要素を用意するのではなく、<a>
の::before
要素にスタイルを適用します。
position: absolute
を設定することで、元の<a>
タグの位置に影響を与えないようになります。
::before
、::after
要素はcontent
を設定しないと有効にならないので注意。*1
top: 0
、left: 0
の状態、分かりやすく色を赤くしています。
inline-block inline-block inline-block inline-block inline-blockleft
に-10px
を指定して<a>
要素の左に持ってくる。
inline-block inline-block inline-block inline-block inline-block
まとめるとこんな感じになります。
これも後でホバー時の変化を付ける為にtransition: 200ms border-right-color
を設定しておきます、background-color
ではないので注意。
a::before { content: ""; position: absolute; display: block; width: 0; height: 0; margin: 0; padding: 0; top: 0; left: -10px; border-top : solid 10px transparent; border-right : solid 10px #ccd; border-bottom: solid 10px transparent; border-left : 0px; transition: 200ms border-right-color; }
タグの穴の部分
::after
要素を使います、これも同じようにposition: absolute
で<a>
要素に影響を与えずに配置出来ます。
4px
の正方形を作る、<a>
の高さ20px
から4px
を引いて2
で割ると8px
。
top: 8px
で真ん中に配置する。
隠れないようにz-index
も高めに設定しておく。
inline-block inline-block inline-block inline-block inline-blockborder-radius: 50%
を設定して円を作る。
位置を調整する、下はleft: -4.8px
に設定したところ。
inline-block inline-block inline-block inline-block inline-block
まとめるとこんな感じになります。
a::after { content: ""; position: absolute; display: block; width: 4px; height: 4px; margin: 0; padding: 0; top: 8px; left: -4.8px; border-radius: 50%; background: white; z-index: 100; }
ホバー時の変化を付ける
擬似クラス:hover
を使います。
本体の<a>
要素にホバーした時に::before
、::after
にも変化を適用するにはa:hover::before
のようにすれば大丈夫です。
クラスセレクタの時も.tag:hover::before
で適用されます。
inline-block inline-block inline-block inline-block inline-block
a:hover { background: #88a; } a:hover::before { border-right-color: #88a; }
IE11で見たら幾つかのタグは<a>
要素と左の三角の間に切れ目が見えちゃったけど、何かいい方法あるのかな?
とりあえず今は放置してます。
*1:いぃぃっっつも忘れる。