リストのaタグを親要素いっぱいにして、さらにテキストを上下中央にしたい
リストのaタグを親要素いっぱいにして、さらにテキストを上下中央にしたいのですが、うまくいきません。
レスポンシブサイトなので下記のように特殊なやり方で上下左右中央にテキストをもってきています。
.u-centaring-all-item-height-flexible {
position: absolute;
top: 50%;
left: 0;
right: 0;
-webkit-transform: translateY(-50%);
transform: translateY(-50%);
}
https://codepen.io/anon/pen/QdEYyZ
このような特殊なことをしなければdisplay:block;で親要素いっぱいになりますが、
上記のような場合はどのようにすれば実現できますか?
height:100%;にすると親いっぱいにはできますが、今度はテキストが上にずれてしまいます。
その後下記のようにしたところだいたい真ん中に来たのですが原理がよくわかりません。
なぜheightを100%にするとtop: 80%;に変更しないといけないのでしょうか?
.u-centaring-all-item-height-flexible {
position: absolute;
top: 80%;
left: 0;
right: 0;
-webkit-transform: translateY(-50%);
transform: translateY(-50%);
}
transform: translateY(-50%)
が要素の高さの半分だけ上に移動するということですよね。
aの高さを100%にすると上記のままだと親要素の高さ割る2分aが上に移動するので、
aの高さが大きくなった分上にずれすぎるのが原因ということですね。
何となく理論はわかったのですが、
transform: translateY(-25%);にしてもまだ上にずれ
transform: translateY(-20%); */にしたらだいたい真ん中に来ました。
aの中のテキストがaの上ぞろえになってしまっているのですが、vertical-align: middle;をつけてもなぜ上下中央にならないのでしょうか?
height: 100%;
vertical-align: middle;
transform: translateY(-20%);
・
>>>
また、ブロックボックス内のテキストなどの縦方向の配置を制御することはできません。
これはとっても大事な情報ですね。
テキストならブロック要素内でも効くと思っていました。
インライン要素内のテキストしか上下中央にできないのですね。
例
spanの中のテキスト 〇
divの中のてきすと ×
・インライン要素に適用した場合には、行ボックスの高さの範囲内での縦方向の位置を指定します。
これはおそらく親要素をはみ出るような指定はできないということですかね?
結論
vertical-align プロパティを適用できるのは、インライン要素とテーブルセルのみ。
ブロック要素自体やその中にあるテキストやインライン要素には効かない。
・下記をulにつけてaにheight:100%;を付けたのですが、それでもうまくいきません。
.u-flexiblebox-centaring-all {
display: flex;
align-items: center; /* 縦方向中央揃え /
justify-content: center; / 横方向中央揃え */
}
やはりdislpey:table;出ないとだめなのでしょうか?