CSSでボックスの内容物を上下中央揃えにする方法3種。

上下中央揃えのサンプル画像

↑CSSだけでこんな感じに上下中央揃えを実現させるテクニックです。下記の3つの方法を紹介します。

1行のみのテキストを中央揃えにする場合

<!-- HTML -->
        <div>
            <p>1行のみのテキストに有用</p>
        </div>
/* CSS */
    div{
        width: 200px;
        height: 100px;
        background: #DDDDFF;
        text-align: center;
    }
    p{
        line-height: 100px;
    }

→1行のみのテキストを中央揃えにするサンプル

line-heightは行間のスペースを制御するプロパティです。なので、2行以上の文などには利用できません。1行だけの場合には簡単に実装できる有用な方法です。

2行以上のテキストまたは画像を中央揃えにする場合

<!-- HTML -->
    <div>
        <p class="text">2行以上のテキストを中央揃えにする</p>
    </div>
/* CSS */
    div{
        width: 200px;
        height: 100px;
        background: #DDDDFF;
        position: relative;
    }
    p {
        position: absolute;
        top: 50%;
        margin-top: -1em;
    }

→2行以上のテキストまたは画像を中央揃えにするサンプル

margin-topには行数の半分をマイナスで指定します。(2行のテキストなら-1em、3行なら-1.5em)
画像の場合は、画像の高さの半分をマイナスで指定します。

ただ、この方法だとテキストの行数や画像の高さが変わった場合に、中央に揃わなくなります。 テキストの行数や画像の高さの可変に対応するには次の方法が良いと思います。

高さが決まっていない要素を中央揃えにする場合

<!-- HTML -->
    <div class="wrap">
        <div class="box1">
            ボックス1<br />
            ボックス1<br />
            ボックス1<br />
            ボックス1<br />
            ボックス1
        </div>
        <div class="box2">
            ボックス2<br />
            ボックス2
        </div>
    </div>
/* CSS */
    div.wrap {
        border: 1px solid #666666;
        width: 350px;
    }
 
    div.wrap div {
        display: table-cell;
        width: 100px;
        vertical-align: middle;
        font-size: 1.2em;
    }
    div.wrap div.box1 {
        background-color: #FFDDDD;
    }
    div.wrap div.box2 {
        background-color: #DDFFDD;
    }
 
    /* IE 6 */
    * html div.wrap div {
        display: inline;
        zoom: 1;
    }
 
    /* IE 7 */
    *:first-child+html div.wrap div {
        display: inline;
        zoom: 1;
    }
 
    /*\*//*/
    * html div.wrap div {
        display: inline-block;
    }
    /**/

→高さが決まっていない要素を中央揃えにするサンプル

中央揃えにする為にvertical-alignを使っていますが、これはインライン要素のみに効果があります。FireFox・Operaなどはtable-cellを使ってできますが、IEはtable-cellに対応していません(大丈夫かIE・・・)
IEにも適応させるには「インライン要素」で且つ「レイアウト情報を持った(hasLayoutをTrueにする)オブジェクトにさせればいいんです。 display: inline; でインライン要素にし、zoom: 1; でレイアウト情報をもたせるって訳です。
単純な事なんですが、なかなか思いつかない方法ですよね。

TRACKBACK URL トラックバック用URL

1
cssで画像と文字の上下真ん中
ググっていたら、displayをtable-cellにしてvertical-alignをcenterにするやり方の記事を発見しました。IE用にdisplayはinlineでhaslayoutをtrueにするためにzoom: 1;ハックで記述。ここまでしてテーブルタグを使わないでやるのかと言うのもあるけど、構造的には意味のないテーブルなるべく避けた方がいいのかな。widthをしてした要素には左右のpaddingやborderをIE6の互換モードで指定しないほうがいいというのがありましたが、標準モードだと問題
とりあえずブログ on 2010/05/21 10:41:14
2
CSSでIMGの横のテキストを上下中央揃えに出来ない対処
イメージの横のテキストを上下中央に表示するには親コンテナに設定するのが一般的です。今回なぜか上手く表示されない不具合が生じたので、
ハッケンブログ(発見部LOG) on 2010/04/09 15:33:26

COMMENT LIST

No.1

 

ともこ

Re:

ずっとわからなかった縦方向に対するセンタリングの方法が、このページでの解説でやっとわかりました!ありがとうございます。

2010.04.30 14:31

No.2

 

webbibo管理人

Re:

説明が分かりにくいかなと思ったのですが、理解していただけて良かったです。

2010.05.10 12:51

No.3

 

Takuzoo

box1で・・・

はじめまして
高さが決まっていない要素を中央揃えにする場合
を使ってbox1に画像を入れてつかっ追うと思うのですがこの画像のほうだけセンタリングしたいんですが
思うように反映しません
中の画像は縦幅だけ固定で行きたいんですが
box1の中にtext-align: center;じゃダメでした
今cssはbox1を
div#s_picup div.pu_article div.pu_image {
height: 100px;
width: 108px;
text-align: center;
}
div#s_picup div.pu_article div.pu_image img {
height: 75px;
}
に変更して使ってます
横のセンタリングはできないのでしょうか

2010.06.12 14:17

No.4

 

webbibo管理人

Re:

box1にtext-align:center;をすればbox1の中にある画像はセンタリングになりましたよ。画像の横幅がbox1の横幅を越えて、センタリングに見えてないとか。どのブラウザで確認されました?

2010.06.14 12:55

No.5

 

つつ

Re:

縦方向の中央揃えの仕方が分からなかったのでとても助かりました!
お忙しい中、申し訳ないのですが、「高さが決まっていない要素を中央揃えにする場合」の方法で二つのboxにそれぞれmarginやpaddingを設定したいのですが、firefoxで何故か反映されなかったのですが、この方法だと中のboxには入れられないの仕様なのでしょうか・・・

2010.06.18 20:36

7 件中 1 - 5 件を表示

POST YOUR COMMENT

送信内容
vericode

おすすめCSSサイト

あわせて読みたいブログパーツ

TopPageへ

更新情報RSSアイコン

閉じる