position: absolute; + display: table;の謎を解きたい
10/23 追記: absolute + tableの謎が解けた!!!! - エンジニアをリングする
CSSでちょっと前から悩んでいる挙動があります。
- heightプロパティを%指定するときには、包含ブロックにheightの値が指定されている必要がある
- しかし、絶対配置(positionがabsoluteかfixed)されている要素は包含ブロックにheightの値がなくてもheightを%指定できる。
- 該当の仕様: Visual formatting model details (緑色のNoteのところ)
- 仕様日本語:視覚整形モデル詳細
ある要素の高さがcssではなく内包物によって保たれているような場合、その子要素にheightを%指定しようとしてもできなくてautoの扱いになるよ、 でもその子要素がposition: absolute;だったら特別にheightを%指定してもいいよ、親要素(包含ブロック)の内側の高さを基準にして計算してあげるよ、みたいな感じです。
実際に挙動をみてみましょう。
.wrapper
(赤)が外側の要素。縦横200px。 その中に.inner
(黄)と.spacer
(見えない)があります。
.wrapper
の高さが200pxなのは、子となる.spacer
のheightに200pxを指定しているためなので、.wrapper
にはheightの指定がありません。
この場合、子となる.inner
にheight: 50%;を指定しても効きません。
でも、.inner
のpositionがabsoluteであれば、height: 50%;が効いて.inner
の高さは100pxになります。
上のfiddleがその状態です。
ここまでは仕様通りです。
ではここで.inner
のdisplayをblockからtableに変更してみましょう。
height効いてないよ!!なんで!!!
※ この状態で.wrapper
にheight: 200px;
を指定すると.inner
のheightもちゃんと効きます。
この挙動の元となる仕様はどこで定義されてるんでしょうか・・・?
どなたかご存知でしたら教えてください><
今日CSS仕様書もくもく会に参加してきたので id:nxdebiru さんに質問してみたのですが、検証しているうちにさらに恐ろしいことが・・・
とりあえず恐ろしい挙動を共有しておきますね https://t.co/EH1ZoTYR7w
— debiru (@debiru) October 21, 2015
謎い!!!!!!!
ちなみにCSS仕様書もくもく会は毎月第三週開催、場所はGoodpatchですので是非!
そして前述の謎挙動(absoluteで効くはずのheightの%指定がtableにすると効かなくなる)、どなたかおしえてくださいっ!!