divブロック内のCSS中央テキスト(水平および垂直)


862

(と)のdivセットがあり、中にテキストがあります。display:block90px heightwidth

テキストを垂直方向と水平方向の両方の中央に揃える必要があります。

試してみましたtext-align:centerが、横の部分は動かないので試してみましたvertical-align:middleがうまくいきませんでした。

何か案は?


25
もしかしてtext-align:center「垂直部」を行っていませんか?
非極性

2
私はようやく、相対的なサイズで機能し、高さが固定されていないソリューションを見つけました:stackoverflow.com/a/16195362/1301331
cirrus

3
要素を中央/中央に配置する方法を知ることは非常に重要です。以下のドキュメントは非常に明確な画像を提供しています。w3.org/Style/Examples/007/center.en.html
shibualexis

:センターは水平、垂直、divタグ内のオブジェクトまたはその両方(純粋なCSS)にここでは2つの簡単な方法があるstackoverflow.com/a/31977476/3597276
マイケル・ベンジャミン

回答:


1385

1行のテキストや画像の場合は、簡単に実行できます。ただ使用する:

text-align: center;
vertical-align: middle;
line-height: 90px;       /* The same as your div height */

それでおしまい。複数行になる可能性がある場合は、多少複雑になります。しかし、http://pmob.co.uk/に解決策があります 。「vertical align」を探します。

彼らはハックや複雑なdivを追加する傾向があるので...私は通常、それを行うために単一のセルを持つテーブルを使用します...それを可能な限り単純にするために。


2020年の更新:

Internet Explorer 10などの以前のブラウザーで動作させる必要がない限り、フレックスボックスを使用できます。現在のすべての主要ブラウザで広くサポートされています。基本的に、コンテナーはフレックスコンテナーとして指定する必要があり、主軸と交差軸に沿ってセンタリングする必要があります。

#container {
  display: flex;
  justify-content: center;
  align-items: center;
}

「フレックスアイテム」と呼ばれる子の固定幅を指定するには:

#content {
  flex: 0 0 120px;
}

例:http : //jsfiddle.net/2woqsef1/1/

コンテンツをシュリンクラップするには、さらに簡単です。flex: ...フレックスアイテムから行を削除するだけで、自動的にシュリンクラップされます。

例:http : //jsfiddle.net/2woqsef1/2/

上記の例は、MS EdgeやInternet Explorer 11などの主要なブラウザでテストされています。

カスタマイズする必要がある場合の1つのテクニカルノート:フレックスアイテムの内部。このフレックスアイテムはフレックスコンテナー自体ではないため、CSSの古い非フレックスボックスの方法は期待どおりに機能します。ただし、現在のフレックスコンテナーにフレックスアイテムを追加すると、2つのフレックスアイテムが水平に配置されます。垂直に配置するには、flex-direction: column;をflexコンテナーに追加します。これは、フレックスコンテナーとその直接の子要素の間で機能する方法です。

センタリングを行う別の方法がありcenterます。フレックスコンテナーの主軸と交差軸での分布を指定せず、代わりmargin: autoにフレックスアイテムで4方向すべての余分なスペースと均等に分布されたマージンを占めるように指定します。フレックスアイテムを全方向の中央に配置します。これは、複数のflexアイテムがある場合を除いて機能します。また、この手法はMS Edgeでは機能しますが、Internet Explorer 11では機能しません。


2016/2017の更新:

これはでより一般的に実行できtransform、Internet Explorer 10やInternet Explorer 11などの古いブラウザーでもうまく機能します。複数行のテキストをサポートできます。

position: relative;
top: 50%;
transform: translateY(-50%);

例:https : //jsfiddle.net/wb8u02kL/1/

幅をシュリンクラップするには:

上記のソリューションでは、コンテンツ領域に固定幅を使用しました。シュリンクラップされた幅を使用するには、

position: relative;
float: left;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);

例:https : //jsfiddle.net/wb8u02kL/2/

Internet Explorer 10のサポートが必要な場合、フレックスボックスは機能せず、上記のline-height方法と方法が機能します。そうでなければ、フレックスボックスが仕事をします。


58
そのdisplay: table-cellためのプロパティがあります、FYI。これを使用すると、要素が表のセルのように動作し、許可されますvertical-align: middle;
Shauna

1
font:これらを使用している場合は、高さよりも前にline-配置してください。
user1135469 2013

4
これは、divに<br/>要素が含まれている場合、意図したとおりに機能しない可能性があります。
Martin Meeser 2014年

7
身長を%で表すとどうなりますか?
CandleCoder 2016

1
このアプローチでは、テキストテキストは1行にする必要があります。そうしないと、2行目が最初に90px下になります。
Tomasz Mularczyk 16

454

2014年現在の一般的な手法:


  • アプローチ1- transform translateX/ translateY

    ここの例 /全画面の例

    サポートされているブラウザ(それらのほとんど)は、使用することができますtop: 50%/ left: 50%と組み合わせて translateX(-50%) translateY(-50%)動的に垂直/水平方向の要素を中央に。

    .container {
        position: absolute;
        top: 50%;
        left: 50%;
        transform: translateX(-50%) translateY(-50%);
    }
    

  • アプローチ2-フレックスボックス方式:

    ここの例 /全画面の例

    ではサポートされているブラウザ、設定display対象の要素へのflexおよび使用をalign-items: center垂直センタリング用とjustify-content: center水平センタリングのために。追加のブラウザーサポートのためにベンダープレフィックスを追加することを忘れないでください(例を参照)。

    html, body, .container {
        height: 100%;
    }
    .container {
        display: flex;
        align-items: center;
        justify-content: center;
    }
    

  • アプローチ3- table-cell/ vertical-align: middle

    ここの例 /全画面の例

    場合によっては、html/ body要素の高さがに設定されていることを確認する必要があります100%

    垂直方向の配置については、親要素のwidth/ heightをに設定し100%て追加しdisplay: tableます。次に、子要素について、をに変更しdisplaytable-cell追加しvertical-align: middleます。

    水平方向のtext-align: center中央揃えの場合、テキストとその他のinline子要素を中央揃えに追加できます。または、margin: 0 auto要素がblockレベルであると想定して使用することもできます。

    html, body {
        height: 100%;
    }
    .parent {
        width: 100%;
        height: 100%;
        display: table;
        text-align: center;
    }
    .parent > .child {
        display: table-cell;
        vertical-align: middle;
    }
    

  • アプローチ4- 50%上から絶対的に配置して変位:

    ここの例 /全画面の例

    このアプローチでは、テキストの高さがわかっていることを前提としています18px。この例では、50%親要素を基準にして、要素を上から絶対的に配置します。margin-top要素の既知の高さの半分である負の値を使用します-9px。この場合は- です。

    html, body, .container {
        height: 100%;
    }
    .container {
        position: relative;
        text-align: center;
    }
    .container > p {
        position: absolute;
        top: 50%;
        left: 0;
        right: 0;
        margin-top: -9px;
    }
    

  • アプローチ5- line-heightメソッド(柔軟性が最も低い-推奨されません):

    ここの例

    場合によっては、親要素の高さが固定されます。垂直方向の中央揃えの場合、必要なことline-heightは、親要素の固定高さに等しい値を子要素に設定することだけです。

    このソリューションは場合によっては機能しますが、このように複数行のテキストがある場合は機能しないことに注意してください。

    .parent {
        height: 200px;
        width: 400px;
        text-align: center;
    }
    .parent > .child {
        line-height: 200px;
    }
    

方法4と5は、最も信頼できる方法ではありません。最初の3つのうちの1つに進みます。


8
包括的な答えを得るには+1。個人的には、方法2のサポートが少なくtable-cell、できる限り避けたいので、最初の方法を選択します。
ハリー

4
2. .containers親が絶対である場合に機能するのは、フレックスボックスメソッドのみです。1.絶対的な.containerが原因で、メソッドは親を縮小します。
ジャニスGruzis

Flexは、iPadのChromeブラウザで複数行のテキストを垂直方向にセンタリングするために機能しました。
bob

7
フレックスボックス方式が最も優れています。
rorykoehler 2016年

がスクロール可能な場合、アプローチ1は失敗します。
Vishal Gulati 2017年

78

flexbox / CSSの使用:

<div class="box">
    <p>&#x0D05;</p>
</div>

CSS:

.box{
    display: flex;
    justify-content: center;
    align-items: center;
}

クイックヒントからの引用:要素を垂直方向および水平方向に中央揃えする最も簡単な方法


4
注意:IEでは機能しません。追加する必要がありますdisplay: -ms-flexbox; -ms-flex-align: center; -ms-flex-pack: center
Florian Wendelborn 2016

テキストなどの要素を追加text-align:centerinline-ます。

flexboxはIE 10および11で少なくとも部分的にサポートされており、caniuseによるとユーザーの97%で動作することに注意してください。ブラウザーのサポートはもはやそれに対する議論ではないと思います。
フェリックス・ガニオン-グルニエ

28

display: table-cell;そのdivのCSSコンテンツに行を追加します。

テーブルセルのみvertical-align: middle;がをサポートしますが、その[テーブルセル]定義をdivに与えることができます...

ライブの例はここにあります:http : //jsfiddle.net/tH2cc/

div{
    height: 90px;
    width: 90px;
    text-align: center;
    border: 1px solid silver;
    display: table-cell; // This says treat this element like a table cell
    vertical-align:middle; // Now we can center vertically like in a TD
}

1
これpositionが絶対的または固定されている場合は機能しません。参照:jsfiddle.net/tH2cc/1636
アーロンメイソン

16

私は常に次のCSSをコンテナに使用して、コンテンツを水平方向と垂直方向の中央に配置します。

display: -webkit-box;
display: -moz-box;
display: -ms-flexbox;
display: -webkit-flex;
display: flex;

-webkit-box-align: center;
-moz-box-align: center;
-ms-flex-align: center;
-webkit-align-items: center;
align-items: center;

-webkit-box-pack: center;
-moz-box-pack: center;
-ms-flex-pack: center;
-webkit-justify-content: center;
justify-content: center;

ここでそれを実際に見てください:https : //jsfiddle.net/yp1gusn7/


3
^標準が重要である理由
Florian Wendelborn 2016

16

このための非常に簡単なコードを試すことができます。

  display: flex;
  align-items: center;
  justify-content: center;

.box{
  height: 90px;
  width: 90px;
  background: green;
  display: flex;
  align-items: center;
  justify-content: center;
}
<div class="box">
  Lorem
</div>

Codepenリンク:http ://codepen.io/santoshkhalse/pen/xRmZwr


複数行のテキストでも機能します、+ 1!
Jeroen Bellemans 2016

16

このCSSクラスをターゲットの<div>に渡します。

.centered {
  width: 150px;
  height: 150px;
  display: flex;
  align-items: center;
  justify-content: center;
  text-align: center;
  background: red; /* Not necessary just to see the result clearly */
}
<div class="centered">This text is centered horizontally and vertically</div>


2
あなたは本当にする必要があり、CSSグリッドも:)私はこのカリキュラムをお勧めします
加納

9

親でflexプロパティを使用して、子アイテムにプロパティを追加できます。 divmargin:auto

.parent {
    display: flex;
    /* You can change this to `row` if you want the items side by side instead of stacked */
    flex-direction: column;
}

/* Change the `p` tag to what your items child items are */
.parent p {
    margin: auto;
}

flexここのより多くのオプションを見ることができます:https : //css-tricks.com/snippets/css/a-guide-to-flexbox/


8

アプローチ1

div {
  height: 90px;
  line-height: 90px;
  text-align: center;
  border: 2px dashed #f69c55;
}
<div>
  Hello, World!!
</div>

アプローチ2

div {
  height: 200px;
  line-height: 200px;
  text-align: center;
  border: 2px dashed #f69c55;
}
span {
  display: inline-block;
  vertical-align: middle;
  line-height: normal;
}
<div>
  <span>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Haec et tu ita posuisti, et verba vestra sunt. Non enim iam stirpis bonum quaeret, sed animalis. </span>
</div>

アプローチ3

div {
  display: table;
  height: 100px;
  width: 100%;
  text-align: center;
  border: 2px dashed #f69c55;
}
span {
  display: table-cell;
  vertical-align: middle;
}
<div>
  <span>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</span>
</div>


4
<div class="small-container">
    <span>Text centered</span>
</div>

<style>
.small-container {
    width:250px;
    height:250px;
    border:1px green solid;
    text-align:center;
    position: absolute;
    top: 50%;
    left: 50%;
    -moz-transform: translateX(-50%) translateY(-50%);
    -webkit-transform: translateX(-50%) translateY(-50%);
    transform: translateX(-50%) translateY(-50%);
}
.small-container span{
    position: absolute;
    top: 50%;
    left: 50%;
    -moz-transform: translateX(-50%) translateY(-50%);
    -webkit-transform: translateX(-50%) translateY(-50%);
    transform: translateX(-50%) translateY(-50%);
}
</style>

4
# Parent
{
  display:table;
}

# Child
{
  display: table-cell;
  width: 100%; // As large as its parent to center the text horizontally
  text-align: center;
  vertical-align: middle; // Vertically align this element on its parent
}

6
これは、投稿された他の回答とどの程度正確に異なりますか?
Josh Crozier 2015

3

div {
  height: 90px;
  line-height: 90px;
  text-align: center;
  border: 2px dashed #f69c55;
}
<div>
  Hello, World!!
</div>


3
このコードスニペットは問題を解決する可能性がありますが、説明を含めると、投稿の品質を向上させるのに役立ちます。あなたは将来の読者のための質問に答えていることを覚えておいてください、そしてそれらの人々はあなたのコード提案の理由を知らないかもしれません。
Sudheesh Singanamalla

1

.cell-row {display: table; width: 100%; height: 100px; background-color: lightgrey; text-align: center}
.cell {display: table-cell}
.cell-middle {vertical-align: middle}
<div class="cell-row">
  <div class="cell cell-middle">Center</div>
</div>


1

これは私のために動作します(テストされたOK!):

HTML:

<div class="mydiv">
    <p>Item to be centered!</p>
</div>

CSS:

.mydiv {
    height: 100%; /* Or other */
    position: relative;
}

.mydiv p {
    margin: 0;
    position: absolute;
    top: 50%;
    left: 50%;
    margin-right: -50%;
    transform: translate(-50%, -50%); /* To compensate own width and height */
}

50%以外の値を選択できます。たとえば、25%を親の25%の中央に配置します。


1
<!DOCTYPE html>
<html>
  <head>
    <style>
      .maindiv {
        height: 450px;
        background: #f8f8f8;
        display: -webkit-flex;
        align-items: center;
        justify-content: center;
      }
      p {
        font-size: 24px;
      }
    </style>
  </head>

  <body>
    <div class="maindiv">
      <h1>Title</h1>
    </div>
  </body>
</html>

なぜ2つの答えですか?
Peter Mortensen

1

次の方法を試すことができます。

  1. 単一の単語または1行の文がある場合は、次のコードで対処できます。

    divタグ内にテキストを入れ、IDを付けます。そのIDに次のプロパティを定義します。

    id-name {
      height: 90px;
      line-height: 90px;
      text-align: center;
      border: 2px dashed red;
    }

    注: line-heightプロパティが分割の高さと同じであることを確認してください。

    画像

    ただし、コンテンツが複数の単語または行である場合、これは機能しません。また、分割のサイズをpxまたは%で指定できない場合があります(分割が本当に小さく、コンテンツを正確に中央に配置したい場合)。

  2. この問題を解決するために、以下のプロパティの組み合わせを試すことができます。

    id-name {
      display: flex;
      justify-content: center;
      align-items: center;
      border: 2px dashed red;
    }

    画像

    これらの3行のコードは、分割のちょうど真ん中にコンテンツを設定します(表示のサイズに関係なく)。「ALIGN-アイテム:センターは、」垂直センタリングするのに役立ちながら、「正当化-コンテンツ:センター」を、それは水平方向の中央を行います。

    注: Flexはすべてのブラウザーで機能するわけではありません。追加のブラウザーサポートのために、適切なベンダープレフィックスを必ず追加してください。


オプション2は私にとってはうまくいきました。ありがとう!
anacron、


0

行の高さを調整して垂直方向の配置を取得します。

line-height: 90px;

3
解決策になる可能性があるため、反対票を投じませんが、これは、1行のテキストを保証できる場合にのみ機能します...
dooleyo


0

スタイルを適用:

position: absolute;
top: 50%;
left: 0;
right: 0;

テキストは、長さに関係なく中央揃えになります。


0

これは私のために働きました:

.center-stuff{
    text-align: center;
    vertical-align: middle;
    line-height: 230px; /* This should be the div height */
}

0

私にとってこれは最良の解決策でした:

HTML:

 <div id="outer">  
     <img src="logo.png">
 </div>

CSS:

#outer {
  position: fixed;
  top: 50%;
  left: 50%;
  /* bring your own prefixes */
  transform: translate(-50%, -50%);
}

-1
<!DOCTYPE html>
<html>
    <head>

    </head>
    <body>
        <div style ="text-align: center;">Center horizontal text</div>
        <div style ="position: absolute; top: 50%; left: 50%; transform: translateX(-50%) translateY(-50%);">Center vertical text</div>
    </body>
</html> 

1
これはきれいなコードです。ただし、divタグにIDを追加して、後で必要に応じてそれらを使用できるようにすることもできます。
Amir Md Amiruzzaman 2018

提案ありがとう。はい、IDが操作に役立つことに同意します。

2
以前の回答を読みましたか?この答えが以前の答えに何を追加するかを教えていただけますか?
Temani Afif 2018

1
@AmirMdAmiruzzamanあなたが何であるかを私たちに伝えることができるきれいな、このコードの一部:) ...私は良くありませんインラインスタイルを参照してください...また、IDを追加すると、あまりにも良い考えではありません、私たちはクラスを必要とする
Temani Afif

1
ジョシュの答えアプローチ1の複製
ムニムムンナ

-1

私のために働く本当にシンプルなコード!1行だけで、テキストは水平方向の中央に配置されます。

.center-horizontally{
  justify-content: center;
}

<Card.Footer className="card-body-padding center-horizontally">
  <label className="support-expand-text-light">Call or email Customer Support to change</label>
</Card.Footer>

出力は次のようになります。

簡単な解決策を探している開発者の時間を節約するためだけに機能する場合は、この回答に投票してください。ありがとう!:)


-2

次の例を試してください。各カテゴリの例を追加しました:水平および垂直

<!DOCTYPE html>
<html>
    <head>
        <style>
            #horizontal
            {
                text-align: center;
            }
            #vertical
            {
                position: absolute;
                top: 50%;
                left: 50%;
                transform: translateX(-50%) translateY(-50%);
            }
         </style>
    </head>
    <body>
         <div id ="horizontal">Center horizontal text</div>
         <div id ="vertical">Center vertical text</div>
    </body>
</html> 

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