css単一または複数行の垂直方向の整列


80

1行以上のタイトルがあります。

テキストを垂直方向に揃えるにはどうすればよいですか?常に1行の場合は、行の高さをコンテナの高さに設定できます。

JavaScriptを使用してそれを行うことはできますが、私はそれがあまり好きではありません。純粋なCSSの方法を探しています。

また、コンテナが線で拡張できれば完璧なので、常に上下に同じパディングを付けることができます。

ここに画像の説明を入力してください


コンテナの高さが変わる可能性がある場合...では、これはどうですか?jsbin.com/idiqih/edit#preview
Joonas

回答:


113

これには、display:table-cellプロパティを使用できます。

.inline {
  display: inline-block;
  margin: 1em;
}
.wrap {
  display: table;
  height:  100px;
  width:   160px;
  padding: 10px;
  border:  thin solid darkgray;
}
.wrap p {
  display:        table-cell;
  vertical-align: middle;
}
<div class="inline">
  <div class="wrap">
    <p>Example of single line.</p>
  </div>
</div>

<div class="inline">
  <div class="wrap">
    <p>To look best, text should really be centered inside.</p>
  </div>
</div>

ただし、IE8以降では動作します。詳細については、この記事をお読みください:CSSの秘訣:複数行のテキストを垂直方向に中央揃えにします。


私はまったく同じことを望んでいましたが、divが利用可能な高さ全体を消費する必要もありました。これはそれを助けるはずです:stackoverflow.com/a/16837667/260665
Raj Pawan Gumdal 2015

あなたはドン場合は、tがしたい.wrap持っているマジックナンバーをするためにheightそしてwidth、あなたはそれらのそれぞれを設定することができます100%。次に、要素の親にwidthheightを適用します.wrap
ポリワール氏2016年

9

display:tableトリックが気に入らない場合(私は気に入らないことはわかっています)、それなしの解決策は次のとおりです。

.cen {
  min-height:5em; width:12em; background:red; margin:1em 0;
}
.cen p {
  display:inline-block; vertical-align:middle;
  margin:0 0 0 1em; width:10em;
}
.cen::after {
   display:inline-block; vertical-align:middle; line-height:5em;
   width:0; content:"\00A0"; overflow:hidden;
}

HTML付き

<div class="cen">
 <p>Text in div 1</p>
</div>

これにより、コンテンツがより重い場合を除いて、divの高さが5emになり、大きくなります。ここに
実例があります

編集:ああ、これはどのブラウザで動作するはずですか?IE8は協力しません。

(後の編集:Chromeの問題を処理するためにCSSを更新しました)


クールなテクニック。私が遭遇した問題の1つは、ボックス内のテキストが(<br>例に示されているタグではなく)それ自体でラップされたときに、Chromeの各要素の下部にかなりの余分な空白ができてしまったことです。疑似要素が新しい行に折り返されているようです。それを軽減する方法はありますか?
ドミニクP

@DominicPその通りです。どうやら、::afterブロックは(その内容のために)幅があると考えているので、の後には収まりませんp。残念ながら、コンテンツが必要です。そうしないと、完全に崩壊して機能しなくなります。しかし、なぜこれが折り返し行だけで行われ、単一行では行われないのかはわかりませんp
リスター氏2013年

とにかく、私は解決策で答えを更新しました。秘訣はp、divよりも幅を狭くすること::afterです。そのため、その右側にゼロ幅ブロック用のスペースがあります。お役に立てれば!
リスター氏2013年

アクセシビリティが懸念される場合、これは正解です。を<div>として分類しないでtable-itemください。スクリーンリーダーと、もちろんユーザーを混乱させることになります。
クトゥルフ

9

私はこのソリューションが本当に好きです:

<div>
    <span style="display: inline-block; vertical-align: middle; height: --The height of your box here--"></span>
    <span style="display: inline-block; vertical-align: middle;">Put your multi-line content here</span>
</div>

スタイルシートを自由に使用し、高さは100%...

また、これらはインラインブロックであるため、スパンタグ間のスペースをコメントアウトする必要がある場合があります

クレジットはHadesに送られます。ここからもらった

<div style="outline:thin solid red;">
  <span style="display: inline-block; vertical-align: middle; height: 60px;"></span>
  <span style="display: inline-block; vertical-align: middle;">Put your multi-line content here.</span>
</div>

<div style="outline:thin solid red;">
  <span style="display: inline-block; vertical-align: middle; height: 60px;"></span>
  <span style="display: inline-block; vertical-align: middle;">Put your multi-line content here. Put your multi-line content here. Put your multi-line content here. Put your multi-line content here. Put your multi-line content here.</span>
</div>

注:これは、複数行のコンテンツでは機能しないようです。


2
これは素晴らしい解決策です:)ありがとう!私はテーブルに頼るのが嫌いです!
3066d0 2014

これがうまくいったなんて信じられない!うまくいった唯一の解決策です!
keji 2015

1
これは私の好みの最もクリーンなソリューションです。CSSの仕様は、私の生涯でそれを行うためのハックのない方法を提供するのだろうかと思います。
dannyB 2015年

4

vertical-align: centerandを使用する代わりに、CSS displayflexdisplay: table-cellと呼ばれるはるかに単純な新しいメソッドを確認することをお勧めします。

.box {
    width: 200px;
    height: 50px; 
    padding: 10px;
    margin-bottom: 20px;
    background-color: red;
    
    /* Only add these 2 lines */
    display: flex;
    align-items: center;
  }
<div class="box">Lorem ipsum dolor</div>
<div class="box">Lorem ipsum dolor sit amet ipsum dolor</div>


うまく機能しますが、行数に制限するのは難しいです、それはオーバーフローします
ラッキーな

新しいブラウザのベストアンサー!この新しいフレックスソリューションを古い質問に追加していただきありがとうございます。
カイノアック

3

このような何か

HTML

<div>
    <p>
       Lorem Ipsum is simply
    </p>
</div>

CSS

div {
   display: table;
}
p {
   display:table-cell;
   vertical-align: middle;
}

3

テキストをレスポンシブにしたい場合は、幅が動的に変化するため、単語を1行から複数​​行に折り返します。 inline-block折り返す必要があります。ヘルパーを使用した(ここで最高の互換性があります)では、.inlinehelper折り返しテキストを下に押し下げるだけでは不十分です。
このような単純なタスクの完全なソリューションは次のとおりです。

HTML:

<div id="responsive_wrap">
    <span class="inlinehelper"><span id="content">        
</div>

CSS:

#responsive_wrap {   
   display: block;    
   height: 100%; //dimensions just for   
   width: 100%;  //example's sake
   white-space: nowrap;
}

#content {   
   display: inline-block;        
   white-space: initial;
}

.inlinehelper {
   height: 100%;    
   width: 0;
   vertical-align: middle;
   display: inline-block;
}

注意してくださいwhite-space:nowrap防止財産、.inlinehelperおよび#content相互に関連してラップするが。 white-space:initialオン#contentspan自分でラップする機能をリセットます。

別のオプション: 個人的な好みの問題。の代わりに疑似要素を使用できます.inlinehelper。を削除します.inlinehelpercssルールと要素を次の疑似要素cssセレクターを追加します。

#responsive_wrap:before {
    content: "";
    display: inline-block;
    vertical-align: middle;
    height: 100%;
    width: 0px;
}

PS:これは本当に古い質問では遅すぎることがわかったので、この答えを聞かせてください。誰かにとって役立つかもしれません。


1

スタイリングに関しては、テーブルがコンテンツをレイアウトするための最良の方法です(CSSにスタイルタグを配置します)。

<table style="border:1;collapse;width:300px;padding:5px;background-color:red;">
<tr>
    <td style="width:250px;vertical-align:middle;">Lorem ipsum dolor sit amet ipswum dolor</td>
    <td style="width:50px;vertical-align:top;color:white;">1 Line</td>
</tr>

行数にはJSスクリプトが必要です。こちらをご覧ください:

http://www.webdeveloper.com/forum/archive/index.php/t-44333.html


0

私はそのような解決策が好きです。私はstackoverflowのどこかでこのトリックを見ましたが、正確にどこを覚えていません。非常に便利です!:)

ul {
background: #000; 
  padding-left: 0;
}
ul li {
  height: 130px;
  position: relative;
  -webkit-box-sizing: border-box;
          box-sizing: border-box;
  border-bottom: 3px solid #F7F7F7;
}
ul li:last-of-type {
  border-bottom: none;
}
ul li:after {
  color: #333;
  position: absolute;
  right: 35px;
  font-size: 40px;
  content: ">";
  top: 50%;
  margin-top: -24px;
  color: #FFDA00;
  -webkit-transition: 0.25s all ease;
  transition: 0.25s all ease;
}
ul li a {
  font-size: 35px;
  font-family: Arial;
  color: #fff;
  -webkit-box-sizing: border-box;
          box-sizing: border-box;
  padding-left: 40px;
  height: 100%;
  line-height: 38px;
  display: inline-block;
  width: 100%;
  text-align: left;
  text-decoration: none;
}
ul li a:before {
  display: inline-block;
  vertical-align: middle;
  content: " ";
  height: 100%;
}
ul li a span {
  display: inline-block;
  vertical-align: middle;
}
<ul>
	<li class="dn">
		<a href="kapec.ru.php"><span> Lorem ipsum 1 LINE</span></a>
		</li>
		<li>
			<a href="varianti.ru.php"><span>Lorem ipsum <br> 2 lines </span></a>
		</li>

	</ul>

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.