うまくいかないのはなぜvertical-align: middle
ですか?それでも、vertical-align: top
機能します。
span{
vertical-align: middle;
}
<div>
<img src="https://via.placeholder.com/30" alt="small img" />
<span>Doesn't work.</span>
</div>
うまくいかないのはなぜvertical-align: middle
ですか?それでも、vertical-align: top
機能します。
span{
vertical-align: middle;
}
<div>
<img src="https://via.placeholder.com/30" alt="small img" />
<span>Doesn't work.</span>
</div>
以下に、垂直方向に揃えるための簡単なテクニックをいくつか示します。
これは簡単です: テキスト要素の行の高さをコンテナの行の高さと同じに設定します
<div>
<img style="width:30px; height:30px;">
<span style="line-height:30px;">Doesn't work.</span>
</div>
コンテナーに対して内側の div を絶対に配置する
<div style="position:relative;width:30px;height:60px;">
<div style="position:absolute;bottom:0">This is positioned on the bottom</div>
</div>
<div style="display:table;width:30px;height:60px;">
<div style="display:table-cell;height:30px;">This is positioned in the middle</div>
</div>
これを全面的に正しく機能させるには、CSS を少しハックする必要があります。幸いなことに、私たちに有利に働く IE のバグがあります。top:50%
コンテナとtop:-50%
内部 div で設定すると、同じ結果が得られます。IE がサポートしていない別の機能である高度な CSS セレクターを使用して、この 2 つを組み合わせることができます。
<style type="text/css">
#container {
width: 30px;
height: 60px;
position: relative;
}
#wrapper > #container {
display: table;
position: static;
}
#container div {
position: absolute;
top: 50%;
}
#container div div {
position: relative;
top: -50%;
}
#container > div {
display: table-cell;
vertical-align: middle;
position: static;
}
</style>
<div id="wrapper">
<div id="container">
<div><div><p>Works in everything!</p></div></div>
</div>
</div>
transform: translateY
このソリューションでは、プロパティを利用するため、他のソリューションよりも若干最新のブラウザーが必要です。( http://caniuse.com/#feat=transforms2d )
次の 3 行の CSS を要素に適用すると、親要素の高さに関係なく、親要素内で垂直方向に中央揃えになります。
position: relative;
top: 50%;
transform: translateY(-50%);
vertical-align: middle
完全に中央に配置するには、両方の要素に適用する必要があります。
<div>
<img style="vertical-align:middle" src="http://lorempixel.com/60/60/">
<span style="vertical-align:middle">Perfectly centered</span>
</div>
受け入れられた答えは、アイコンをその隣のテキストの x 高さの約半分の中央に配置します ( CSS 仕様で定義されているように)。これで十分かもしれませんが、テキストの上部または下部にアセンダーまたはディセンダーが目立つ場合は、少し見栄えが悪くなります。
左側のテキストは整列されていません。右側は上の図のようになっています。ライブ デモは、vertical-align に関するこの記事にあります。
vertical-align: top
シナリオで機能する理由について誰かが話しましたか? 問題の画像はおそらくテキストよりも背が高いため、行ボックスの上端を定義しています。vertical-align: top
スパン要素で、それをラインボックスの一番上に配置します。
vertical-align: middle
との動作の主な違いは、最初の要素はボックスのベースライン (すべての垂直方向の配置を満たすために必要な場所に配置されるため、かなり予測不可能top
に感じられる) に対して相対的に移動し、2 番目の要素はライン ボックスの外側の境界に対して相対的に移動することです (つまり、より具体的に)。
受け入れられた回答で使用されている手法は、単一行のテキスト ( demo ) でのみ機能しますが、複数行のテキスト ( demo ) では機能しません。
複数行のテキストを画像に対して垂直方向に中央揃えする必要がある場合は、いくつかの方法があります (方法 1 と 2 は、この CSS トリックの記事に触発されたものです) 。
CSS:
div {
display: table;
}
span {
vertical-align: middle;
display: table-cell;
}
CSS:
div {
height: 200px; /* height of image */
}
div:before {
content: '';
display: inline-block;
height: 100%;
vertical-align: middle;
margin-right: -0.25em; /* Adjusts for spacing */
}
img {
position: absolute;
}
span {
display: inline-block;
vertical-align: middle;
margin-left: 200px; /* width of image */
}
CSS (上記のフィドルにはベンダー プレフィックスが含まれています):
div {
display: flex;
align-items: center;
}
img {
min-width: 200px; /* width of image */
}
このコードは IE でも FF でも機能します。
<div>
<img style="width:auto; height:auto;vertical-align: middle;">
<span>It does work on all browsers</span>
</div>
line-height
これを機能させるには、をdivの高さに設定する必要があるためです。
記録のために、アライメント「コマンド」はSPANで機能しないはずです。これは、ブロックレベルのタグではなくインラインタグであるためです。インラインのポイントはテキストの流れを妨げることではないため、整列、マージン、パディングなどはインラインタグでは機能しません。
CSSは、HTMLタグをインラインとブロックレベルの2つのグループに分割します。「cssblockvsinline」を検索すると、すばらしい記事が表示されます...
http://www.webdesignfromscratch.com/html-css/css-block-and-inline/
(コアCSSの原則を理解することは、それほど煩わしくないための鍵です)
基本的に、CSS3 に取り掛かる必要があります。
-moz-box-align: center;
-webkit-box-align: center;
他にできることは、テキストline-height
を 内の画像のサイズに設定することです<div>
。次に、画像をvertical-align: middle;
それは真剣に最も簡単な方法です。
line-height:30px
テキストが画像と整列するようにスパンに使用します。
<div>
<img style="width:30px; height:30px;">
<span style="line-height:30px;">Doesn't work.</span>
</div>
margin
これらの回答のいずれにもまだ解決策が見られていないため、この問題に対する私の解決策を次に示します。
このソリューションは、画像の幅がわかっている場合にのみ機能します。
<div>
<img src="https://placehold.it/80x80">
<span>This is my very long text what should align. This is my very long text what should align.</span>
</div>
div {
overflow:hidden;
}
img {
width:80px
margin-right:20px;
display:inline-block;
vertical-align:middle;
}
span {
width:100%;
margin-right:-100px;
padding-right:100px;
display:inline-block;
vertical-align:middle;
box-sizing:border-box;
-moz-box-sizing:border-box;
-webkit-box-sizing:border-box;
}
これらのスパン プロパティを書き込みます
span{
display:inline-block;
vertical-align:middle;
}
プロパティを使用するdisplay:inline-block;
場合に使用します。vertical-align
それらは関連付けられたプロパティです
background:url(../images/red_bullet.jpg) left 3px no-repeat;
通常、代わりに 3px を使用しますtop
。その値を増減することで、画像を必要な高さに変更できます。
たとえば、jQuery mobileのボタンでは、次のスタイルを画像に適用することで、ボタンを少し微調整できます。
.btn-image {
vertical-align:middle;
margin:0 0 3px 0;
}
複数行ソリューション:
<div style="display:table;width:30px;height:160px;">
<img style="display:table-cell;width:30px;height:60px;padding:50px" src='...' />
<div style="display:table-cell;height:30px;vertical-align:middle">
Multiline text centered vertically
</div>
</div>
<!-- note: img (height + 2x padding) must be equal to root div height -->
すべてのブラウザと ie9+ で動作します
あなたはおそらくこれが欲しいでしょう:
<div>
<img style="width:30px; height:30px;">
<span style="vertical-align:50%; line-height:30px;">Didn't work.</span>
</div>
他の人が示唆しているようvertical-align
に、画像を試してみてください:
<div>
<img style="width:30px; height:30px; vertical-align:middle;">
<span>Didn't work.</span>
</div>
CSSは迷惑ではありません。ドキュメントを読まないだけです。; P