54

私は単純なtablewith 1 TDwith を持ってい vertical-align:middle;ます。これには以下TDが含まれますImage:

table
{
  border:solid 1px red;
  width:300px;
}

td
{
  height:100px;
  vertical-align:middle;
  width:100%;
  border:solid 1px green;
}
img
{
  height:43px;width:43px;
}

span
{
  vertical-align:middle;
}
<!DOCTYPE html>
<html>
  <head>
    <meta charset=utf-8/>
    <title>JS Bin</title>
  </head>
  <body>
    <table>
      <tr>
        <td>
          <img src='http://static.jsbin.com/images/favicon.png'/>
        </td>
      </tr>
    </table>
  </body>
</html>

すべてがOKで、IMG縦に並んでいます。

しかし、その Image の後に別の要素を追加すると (spanたとえば):

table
{
  border:solid 1px red;
  width:300px;
}

td
{
  height:100px;
  vertical-align:middle;
  width:100%;
  border:solid 1px green;
}
img
{
  height:43px;width:43px;
}

span
{
  vertical-align:middle;
}
<!DOCTYPE html>
<html>
  <head>
    <meta charset=utf-8/>
    <title>JS Bin</title>
  </head>
  <body>
    <table>
      <tr>
        <td>
          <img src='http://static.jsbin.com/images/favicon.png'/>
          <span>aaa</span>
        </td>
      </tr>
    </table>
  </body>
</html>

質問

TD の垂直方向の配置は、そのすべての子を垂直方向に配置する必要がありますか?

spanを中央に配置するにはどうすればよいですか?

注意

別の を追加したり、パディング/マージンTDを使用したりしたくありません。floatIE8+。

編集:

望ましい結果:

ここに画像の説明を入力

4

11 に答える 11

7

vertical-align: middle;スパンに使用できます

img
{
  height:43px;width:43px;
  display: inline;
  vertical-align: middle;
}

span
{
  vertical-align:middle;
  display: inline;
  
}

あなたのjsbin


コメント通り


td が指定されているかのように考えるかもしれませんがvertical-align: middle;、この内部のすべてのコンテンツを整列させる必要がありますが、画像と、ブラウザーが画像を理解するスパンを持っているのは何ですか? : これは inline または inline-block であるため、display: inline または inline-block; を設定する必要があります。次に、画像の表示プロパティを適用するだけで動作することがわかります。デモ

編集

img タグ : ソース:インラインとインライン ブロックの表示

これらは、幅と高さを持つ「ブロック」要素です。

確かに、それらは両方です。より正確には、「インライン ブロック」要素です。これは、テキストのようにインラインで流れるだけでなく、ブロック要素のように幅と高さがあることを意味します。

これもチェックしてください:

置き換えられた要素

置き換えられた要素とは、外観と寸法が外部リソースによって定義されている要素です。例としては、イメージ ( タグ)、プラグイン ( タグ)、およびフォーム要素 (、、、および タグ) が含まれます。他のすべての要素タイプは、非置換要素と呼ばれます。

置き換えられた要素は、ドキュメント内の周囲ではなく、要素自体によって定義される固有の寸法 (幅と高さの値) を持つことができます。たとえば、画像要素の幅が auto に設定されている場合、リンクされた画像ファイルの幅が使用されます。固有の寸法は、1 つの寸法のみを指定する必要がある要素の計算された寸法を決定するために使用される固有の比率も定義します。たとえば、画像要素に幅のみが指定されている場合 (たとえば 100px)、実際の画像が幅 200 ピクセル、高さ 100 ピクセルである場合、要素の高さは同じ量だけ 50px にスケーリングされます。

置き換えられた要素には、CSS の制御の範囲外で、要素によって課される視覚的な書式設定要件が含まれる場合もあります。たとえば、フォーム要素用にレンダリングされたユーザー インターフェイス コントロールです。

インライン フォーマットのコンテキストでは、置換された要素は、折り返しとレイアウトのために単一の大きな文字として機能するものと考えることができます。置換されたインライン要素の幅と高さを指定できます。この場合、要素が配置されている行ボックスの高さは、指定されたボックス プロパティを含め、置換された要素を収容するのに十分な高さに設定されます。

于 2013-09-22T06:52:56.633 に答える
4

すべての場合において、vertical-align: middle;td期待どおりの動作をします。つまり、tdをその行の中央に揃え、 の内容全体をtd垂直方向の中央 (デフォルト) に揃えて、上部と下部に等間隔を残します。

W3 仕様の内容は次のとおりです vertical-align: middle

セルの中心は、それがまたがる行の中心に揃えられます。

ここに画像の説明を入力

行の高さの計算:

「table-row」要素のボックスの高さは、ユーザー エージェントが行内のすべてのセルを利用できるようになると計算されます。これは、行の計算された「高さ」、行内の各セルの計算された「高さ」の最大値です。およびセルに必要な最小の高さ (MIN)。

CSS 2.1 では、セル ボックスの高さは、コンテンツに必要な最小の高さです。テーブル セルの 'height' プロパティは、行の高さに影響を与える可能性がありますが (上記参照)、セル ボックスの高さは増加しません。

行の高さよりも小さいセル ボックスには、余分な上部または下部のパディングが適用されます。

上記の結果、 と の高さはtr100px にtdなりますが、セルボックスはコンテンツに必要な高さ (img高さ = 43px) しか占有しません。セル ボックスは行の高さよりも小さいため、上の画像のボックス 5 に示すように余分なパディングが追加され、コンテンツも中央に配置されます。


TDには画像のみがあります:

のみのimg場合、コンテンツの高さは の高さと同じimgです。それで真ん中に配置されます。

ここに画像の説明を入力

上の画像からわかるように、はコンテンツを中央に配置するため、明示的vertical-align: middleに on を必要としません。imgtd


TD にはインライン データのみがあります。

にまたはと inlinetdしかない場合、コンテンツの高さはテキストのデフォルト (または指定された任意の )と等しくなります。この場合も、正しく位置合わせされます。spanspandivline-heightline-heighttd

ここに画像の説明を入力

テキスト コンテンツが最初の行を超えると (デモを参照)、 が(シアンの背景でマークされた) をtd自動的に上に押し上げfirst-lineて、コンテンツ全体が (1 行だけでなく) 中央に配置されるようにします。 )。


TD にはイメージとスパンがあります。

内に animgと a span(インラインテキスト)を入れるとtd、コンテンツの高さは 2 行目以降の the の高さと同じになりimgますline-height

この状況では、次の 2 つのケースが考えられます。

ケース 1 - img タグが指定されていませ vertical-align

この場合、は(デフォルト)imgに揃えられます。baseline次に、tdコンテンツ全体を中央に揃えます。これは、コンテンツの上部と下部でtd28.5px (= (100-43)/2) のギャップを意味します。繰り返しますが、vertical-alignontdはジョブを実行し、内容を中央に配置します (つまり、上下に均等なギャップを残します)。imgただし、高さが大きいため、テキストが押し下げられます。

ここに画像の説明を入力

img高さを行の高さ (たとえば 10px) より小さくすると、 img+を指定してもspan中央に配置されることがわかります。


ケース 2 - img タグがある vertical-align: middle

この場合もvertical-aligntdはケース 1 で行ったことと同じことを行います。ただし、この場合のテキストは、行の にも配置されているため、中央近くにあります。imgmiddle

ここに画像の説明を入力

table {
  border: solid 1px red;
}
td {
  height: 100px;
  width: 200px;
  vertical-align: middle;
  border: solid 1px green;
}
img {
  height: 43px;
  width: 43px;
  border: solid 1px green;
}
.one td + td img {
  vertical-align: middle;
}
.three td + td img {
  height: 10px;
  width: 10px;
}
.four img {
  vertical-align: middle;
}
.five img + img{
  height: 50px;
  width: 50px;
}
td:first-line {
  background-color: cyan;
}
div {
  display: inline;
}
<table>
  <tr class='one'>
    <td>
      <img src='http://static.jsbin.com/images/favicon.png' />
    </td>
    <td>
      <img src='http://static.jsbin.com/images/favicon.png' />
    </td>
  </tr>
  <tr class='two'>
    <td>
      <div>aaa</div>
      <span>aaa</span>
    </td>
    <td>
      <div>aaa</div>
      <span>aaa aaaaaaa aaaaaaaa aaaaaaaa</span>
    </td>
  </tr>
  <tr class='three'>
    <td>
      Case 1
      <img src='http://static.jsbin.com/images/favicon.png' />
      <span>Image + Span</span> 
    </td>
    <td>
      Case 1
      <img src='http://static.jsbin.com/images/favicon.png' />
      <span>Image + Span</span> 
    </td>
  </tr>
  <tr class='four'>
    <td>
      Case 2
      <img src='http://static.jsbin.com/images/favicon.png' />
      <span>Image + Span</span> 
    </td>
    <td>
      <img src='http://static.jsbin.com/images/favicon.png' />
      <span>Image + Span + more text.......</span> 
    </td>
  </tr>
  <tr class='five'>
    <td>
      Case 3
      <img src='http://static.jsbin.com/images/favicon.png' />
      <img src='http://static.jsbin.com/images/favicon.png' />
      <span>Image + Span text...</span> 
    </td>
    <td>
      <img src='http://static.jsbin.com/images/favicon.png' />
      <span>Image + Span + more text.......</span> 
    </td>
  </tr>  
</table>

于 2013-09-25T08:58:00.380 に答える
0

このCSS 属性は、他の種類の要素には適用されません。初心者の開発者が通常のブロック要素 (標準のような) に vertical-align を適用すると、ほとんどのブラウザーは、その要素のすべてのインラインの子に継承する値を設定します。

クラスに追加vertical-align: middleするだけです。<img>

CSS は次のようになります...

table
{
  border:solid 1px red;
  width:300px;
}

td
{
  height:100px;
  vertical-align:middle;
  width:100%;
  border:solid 1px green;
}
img
{
  height:43px;width:43px;
  vertical-align: middle;
}

あなたは見ることができますSample Fiddle...

于 2013-09-24T13:46:34.777 に答える
0

デモ

このクラスを追加するだけです:

td *{
  vertical-align:middle
}

編集:

問題は、テキストに写真を追加すると、写真のtd下部になり、td の中央に移動しない理由です。

これが私の答えです:

に設定td vertical-alignしても、middleすべてのコンテンツvertical-alignをに設定する必要はありません。テキストに写真を追加すると、行の高さが画像の高さまで上がり、テキストはこの高さの下部になるため、この問題を解決するには に設定する必要があります。middlebaselinevertical-alignmiddle

ここで私が言ったことを見ることができます:DEMO

私の悪い英語について申し訳ありません

于 2013-09-24T07:31:29.560 に答える
0

これはあなたが意味するものですか?http://jsfiddle.net/JFVNq/

その理由は、スパンがインラインとして扱われるため、ブロックする必要があるためです。

スパンの CSS:

td.vert span
{
    vertical-align: middle;
    display: block;
}
于 2013-09-22T06:43:55.420 に答える
0

私たちは皆、ほぼそこにいると思いますが、

td img,
td span {
display:inline-block;
vertical-align:middle;
}

動作するようです。

コードペンの例

または、何か不足していますか?

于 2013-09-24T11:24:51.737 に答える