2016-05-20 pixiv社内勉強会 LT
@hakatashi
「おっこれ
でいけんじゃん」
は、ひとことで言うと
inline要素と
block要素の中間
<div class="wrap">
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
</div>
.item {
display: inline-block;
width: 80px;
height: 60px;
background: darkcyan;
}
何pxかの隙間ができる
は、ひとことで言うと
「でかい1文字」
<div class="wrap">
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
</div>
<div class="wrap">
A
A
A
A
</div>
<div class="wrap">
A
A
A
A
</div>
HTML上の文字間の空白文字や改行は、
表示される際にスペースひとつに置き換えられる
この挙動は white-space 属性で制御される
さっきのは、仮想的にこういう状態
つまり、この「謎の隙間」はスペース文字1つぶんの空白
文字サイズやフォントによって幅が左右される!!!
<div class="wrap">
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
</div>
.wrap {
width: 350px;
padding: 5px;
text-align: justify;
text-align-last: justify;
background: skyblue;
.child {
display: inline-block;
height: 50px;
vertical-align: bottom;
background: darkcyan;
&:nth-child(3n+1) {width: 60px;}
&:nth-child(3n+2) {width: 80px;}
&:nth-child(3n+3) {width: 30px;}
}
}
「文字」なので
text-align: justify; で
均等割り付けもできる
<div class="wrap">
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
</div>
.wrap {
white-space: pre-line;
}
.item {
display: inline-block;
width: 80px;
height: 60px;
background: darkcyan;
}
white-spaceの値を変更すると
横に並びすらしなくなる
inline-blockは
「でかい1文字」
<div class="wrap">
<div class="small"></div>
<div class="big"></div>
<div class="small"></div>
</div>
.wrap {
padding: 5px;
width: 300px;
font-size: 0;
background: skyblue;
& > div {
display: inline-block;
width: 100px;
vertical-align: top;
}
.small {
height: 50px;
background: darkcyan;
}
.big {
height: 100px;
background: green;
}
}
横幅300pxの要素に
横幅100pxのinline-block要素が
3つ詰め込まれている
これにもう1つ
.small を詰め込んだら
どこに来る?
ここです。
この一連の「流れ」のことを、CSSでは
と呼ぶ。
inline要素と
block要素の違いは、
この inline formatting context の流れの中に
「存在するか」
「存在しないか」
の違いである。
それぞれのinline-blockは、
本当にただの文字だと思ったほうがいい。
inline-blockは「行」を形成し、
端まで行ってあふれたinline-blockは
折り返して次の行に進む。
inline-blockは
「行」を形成する
block要素に指定してもまったく無意味
vertical-alignは
「行」内での位置を
決める
<div class="wrap">
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
</div>
.wrap {
display: inline-block;
padding: 5px;
background: skyblue;
}
.item {
display: inline-block;
width: 100px;
height: 100px;
background: darkcyan;
}
inline-blockが空っぽなら
普通の横並びになる
<div class="wrap">
<div class="item"></div>
<div class="item">hogehoge</div>
<div class="item"></div>
</div>
baseline
vertical-alignの仕様によると、
baseline
Align the baseline of the box with the baseline of the parent box. If the box does not have a baseline, align the bottom margin edge with the parent's baseline.
※下線引用者
baseline
<div class="wrap">
<div class="item"></div>
<div class="item">hogehoge</div>
<div class="item"></div>
</div>
.wrap {
display: inline-block;
padding: 5px;
background: skyblue;
}
.item {
display: inline-block;
width: 100px;
height: 100px;
vertical-align: bottom;
background: darkcyan;
}
vertical-alignに
baseline以外の値を指定すると
ちゃんと横に並ぶ
vertical-alignの
初期値は
すごくキモい
inline-blockでできることは
だいたいflexboxでできる
Emojiの画像polyfillやiconなど