li内のCSS垂直配置テキスト


99

<li>タグから生成された固定の高さと幅のボックスの数を連続して表示しています。次に、テキストを垂直方向の中央に揃える必要があります。CSSのvertical-alignは影響しません。おそらく何か不足していますか???

私は(マージン、パディング、行の高さ)を使用したトリックを探していません。一部のテキストが長く、2行に分割されるため、これらは機能しません。

実際のコードを見つけてください:

CSSコード

ul.catBlock{
  width:960px; 
  height: 270px; 
  border:1px solid #ccc; 
}

ul.catBlock li{
  list-style: none; 
  float:left; 
  display:block; 
  text-align: center; 
  width:160px; 
  height: 100px;
}

ul.catBlock li a{ 
  display: block;  
  padding: 30px 10px 5px 10px; 
  height:60px;
}

HTMLコード

<ul class="catBlock">
 <li><a href="#">IP Phone</a></li>
 <li><a href="#">Dual SIM Switch Server</a></li>
 <li><a href="#">IP PBX</a></li>
</ul>

2
より多くの情報を提供する必要があるかもしれません。箱は同じ高さですか?liのボックス内のテキストを揃えていますか?「一部のテキストが長いので2行です」??? スクリーンショットやフィドルが役立つかもしれません。
KMC、2011

1
スクリーンショットを投稿しようとしましたが、私のアカウントが新しいため許可されません。
AK4668 2011

回答:


100

親の定義display: tableとし、要素自体をvertical-align: middleしてdisplay: table-cell


4
表示テーブル/テーブルセルを使用するための+1。多くの人が自分の存在に気づいていないようです。
powerbuoy 2011

5
これはW3CSchoolからのものです...注:「inline-table」、「run-in」、「table」、「table-caption」、「table-cell」、「table-column」、「table-column- group」、「table-row」、「table-row-group」、および「inherit」は、IE7以前ではサポートされていません。IE8には!DOCTYPEが必要です。IE9は値をサポートしています。
AK4668 2011

20
このソリューションは、マージンの影響を完全に遮断するため、効果がありません。これに対する唯一の解決策は、大量の疑似要素を作成することです。なぜCSSはそんなに吸うのですか?
Muhammad Umer 2013年

何についての<li>sが単一の行に入りますか?
polkovnikov.ph 2015

1
また、実際に表形式のデータを表示していない場合、これはCATOアクセシビリティに準拠していません。
Stevo Perisic 2015年

59

line-heightテキストを垂直に配置する方法です。それはかなり標準的であり、私はそれを「ハック」とは考えていません。に追加line-height: 100pxするだけul.catBlock liで大丈夫です。

この場合ul.catBlock li a、内のすべてのテキストが内にliもあるため、代わりにに追加する必要がある場合がありますa。これを行うと奇妙なことが起こるのを私は見たので、両方を試して、どちらがうまくいくかを見てください。


21
最初は行の高さを使用しましたが、コンテンツが長いと2行に分割され、各行に100pxのギャップがあるとしましょう。他に方法はありますか?
AK4668 2011

2
持っているvertical-align: middleなら持っていく方法があると思いますdisplay: table-cell。私はそれを使ったことがありません。ここを見てください:phrogz.net/css/vertical-align/index.html
ローガンサーマン

優れた解決策-liの「行の高さ」を最小の高さと同じに設定し、テキストを垂直方向に揃えます-少なくとも目視で確認できる程度に近づけます。上記の「テーブル」ソリューションは確かにセマンティックではなく、本質的にハックです。私たちがそれをしているときはいつでも、応答性の高い風景のどこかに壊れた表示や風変わりな動作の可能性を高めています。
CodeFinity、2015

ありがとう!<a>要素でうまく機能します!なんという単純な解決策か:-)値を調整して値を修正すると、垂直方向に完璧に中央揃えになります。
Asle

45

何年も遅れてこの反応があっても、これに遭遇した人はただ試してみたいかもしれません

li {
    display: flex;
    flex-direction: row;
    align-items: center;
}

フレックスボックスのブラウザーサポートは、@ scottjoudryが上記の応答を投稿したときよりもはるかに優れていますが、はるかに古いブラウザーをサポートしようとしている場合は、接頭辞やその他のオプションを検討することをお勧めします。caniuse:flex


これはlist-style-imageChrome ではうまく機能しません-画像が消えます
Benjineer

1
私はこれをブートストラップ4 nav-itemで使用しましたが、完璧に機能しました。どうも。
010110110101

フレックスボックスは常にライブセービング
Arthur Medeiros

16

意外なことに(またはそうではありませんが)、このvertical-alignツールは実際にはこの仕事に最適です。何よりも、Javascriptは必要ありません。

次の例では、outerクラスを本文innerの中央に配置し、outerクラスをクラスの中央に配置しています。

プレビュー:http : //jsfiddle.net/tLkSV/513/

HTML:

<div id="container">
    <span></span><div class="outer">
        <span></span><div class="inner">

        </div>
    </div>
</div>

CSS:

html, body {
    height: 100%;
    margin: 0;
    padding: 0; }
#container {
    text-align: center;
    height: 100%; }
span { 
    height: 100%;
    vertical-align: middle;
    display: inline-block; }
.outer {
    width: 100px;
    height: 200px;
    padding: 0;
    border: 1px solid #000;
    vertical-align: middle;
    display: inline-block; }
.inner {
    background: red;
    width: 30px;
    height: 20px;    
    vertical-align: middle;
    display: inline-block; }

垂直方向の整列は、互いに隣接する要素の中心を整列させることによって機能します。1つの要素に垂直方向の配置を適用しても、まったく何も起こりません。幅はないがコンテナの高さである2番目の要素を追加すると、単一の要素はこの幅のない要素とともに垂直方向に中央に移動し、垂直方向に中央に配置されます。唯一の要件は、両方の要素をインライン(またはインラインブロック)に設定し、それらの垂直配置属性をに設定することvertical-align: middleです。

注:以下のコードで、私の<span>タグと<div>タグが接触していることに気付くかもしれません。どちらもインライン要素であるため、スペースは実際にはno-width要素とdivの間にスペースを追加するので、省略してください。


1
素晴らしいです。私の分の評判は15でなければなりませんので、//私は今、あなたの答えを投票することはできません
AK4668

1
-この技術を探しているあなたのそれらのために、質問に直接適用jsfiddle.net/utGVt/385
WEX

15

将来的には、この問題はflexboxによって解決される予定です。現在のところ、ブラウザーのサポートは悲惨ですが、現在のすべてのブラウザーでは、何らかの形でサポートされています。

ブラウザのサポート:http : //caniuse.com/flexbox

.vertically_aligned {

    /* older webkit */
    display: -webkit-box;
    -webkit-box-align: center;
    -webkit-justify-content: center;

    /* older firefox */
    display: -moz-box;
    -moz-box-align: center;
    -moz-box-pack: center;

    /* IE10*/
    display: -ms-flexbox;
    -ms-flex-align: center;
    -ms-flex-pack: center;

    /* newer webkit */
    display: -webkit-flex;
    -webkit-align-items: center;
    -webkit-box-pack: center;

    /* Standard Form - IE 11+, FF 22+, Chrome 29+, Opera 17+ */
    display: flex;
    align-items: center;
    justify-content: center;
}

フレックスボックスの背景:http ://css-tricks.com/snippets/css/a-guide-to-flexbox/


1
この質問が尋ねられた時点では、これが良い答えであるかどうかはわかりませんが、今日では、95%までの接頭辞付きのサポートがあるため、これは確かに実行可能なオプションだと思います。
Wex

<li>要素を(縮小するのではなく)ラップする場合は、flex-wrap:wrap;を追加します。<ul>レベル
ティエリー

このクラスも追加する要素は何ですか?
マットM.

6

コードや例を提供していないAsafの回答を除いて、ここで提供される完全な回答はありません。そのため、私は私の貢献をしたいと思います...

INORDERを作るためにvertical-align: middle;仕事を、あなたが使用する必要がdisplay: table;あなたのためのul要素とdisplay: table-cell;のためのli要素と、使用できるよりもvertical-align: middle;ためにliの要素。

明示的に提供する必要はありませんmarginspaddingsあなたのテキストを縦真ん中にします。

デモ

ul.catBlock{
    display: table;
    width:960px; 
    height: 270px; 
    border:1px solid #ccc; 
}

ul.catBlock li {
    list-style: none;
    display: table-cell; 
    text-align: center; 
    width:160px; 
    vertical-align: middle;
}

ul.catBlock li a { 
    display: block;
}

これは、あなたがタグにパディングとそれを強制的にダウンするので、そのは、垂直方向に整列された唯一の理由があるので、助けにはならない
STR11

@ Mr.Alienこのソリューションの唯一の問題はマージンルールが無視されることですが、繰り返し述べます。
Thomas

4

ここで説明されているように:https : //css-tricks.com/centering-in-the-unknown/

実際の練習でテストとして、最も信頼性の高いエレガントなソリューションは、バイヤーへのインライン要素を挿入することで<li />、高さは(、その親の身長の100%に設定する必要があります第一子、などの要素<li />)、およびそのvertical-align真ん中にセット。これを実現するには、を置くことができます<span />が、最も便利な方法はli:after疑似クラスを使用することです。

スクリーンショット: ここに画像の説明を入力してください

ul.menu-horizontal {
    list-style-type: none;
    margin: 0;
    padding: 0;
    display: inline-block;
    vertical-align: middle;
}

ul.menu-horizontal:after {
    content: '';
    clear: both;
    float: none;
    display: block;
}

ul.menu-horizontal li {
    padding: 5px 10px;
    box-sizing: border-box;
    height: 100%;
    cursor: pointer;
    display: inline-block;
    vertical-align: middle;
    float: left;
}

/* The magic happens here! */
ul.menu-horizontal li:before {
    content: '';
    display: inline;
    height: 100%;
    vertical-align: middle;
}

1

このソリューションをお試しください

ほとんどの場合に最適です

あなたはそのためにliの代わりにdivを使用する必要があるかもしれません

.DivParent {
    height: 100px;
    border: 1px solid lime;
    white-space: nowrap;
}
.verticallyAlignedDiv {
    display: inline-block;
    vertical-align: middle;
    white-space: normal;
}
.DivHelper {
    display: inline-block;
    vertical-align: middle;
    height:100%;
}
<div class="DivParent">
    <div class="verticallyAlignedDiv">
        <p>Isnt it good!</p>
     
    </div><div class="DivHelper"></div>
</div>


1
なぜ垂直方向に整列するためにdivHelperが必要なのですか?..私は、別のトピックにそれを見たが、それは別のdivせずにそれを自己整列しない理由を私は理解できない
サーシャ・キリコ

0

垂直方向の中央揃えの簡単な解決策...私にとっては魅力のように機能します

ul{display:table; text-align:center; margin:0 auto;}
li{display:inline-block; text-align:center;}
li.items_inside_li{display:inline-block; vertical-align:middle;}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.