2012-03-12 16 views
7

ポップアップメッセージとして使用するために、ビューポートの中央に要素を配置したいとしましょう。これは、次を満たす必要があります。HTML要素をビューポート内で縦と横の中央に配置する最適な方法は何ですか?

  • 要素は、ブラウザのサイズが変更された場合、要素のサイズの変更は動的に
  • 要素を中心に滞在する必要があり
  • ないのJavascriptが許可されている場合でも、ブラウザ内(水平方向と垂直方向の両方)を中心とままにしてください
  • はまだ

下記の表ベースのソリューションに頼ることなく、これを達成するためのよりよい方法はありIE7で動作しますか?

<table style="position:absolute;width:100%;height:100%"> 
    <tr> 
     <td align="center"> 
      <span id="centeredContent">I always remain centered</span> 
     </td> 
    </tr> 
</table> 
+0

これは役に立ちますか? http://stackoverflow.com/questions/9656362/div-horizo​​ntally-center-and-vertically-middle –

+0

可能な複製http://stackoverflow.com/questions/49350/practical-solution-to-center-vertically-and -html-horizo​​nt-in-h-f-works-in-fですが、ここでは答えはありません。 –

+0

あなたが中心に置こうとしている要素の高さを知っている場合、JavaScriptを使わずに垂直方向に配置することは可能です。 1行のテキストしかない場合は、その行を中央に置くこともできますが、もう一度 'line-height'を使って高さを知ることができます。 – Sparky

答えて

8

(私の意見では)最善の解決策は、50の要素の左上に配置するために絶対位置を使用することです%/ 50%にしてから、要素を負のマージンを使って中央に押し戻します。唯一の欠点は、要素の幅と高さを指定する必要があることです。ここでは例です:あなたが本当に持っている中心のコンテンツが必要な場合http://jsfiddle.net/UGm2V/


HTML:

​<div id="centerme"> 
    Hello, world! 
</div>​ 

CSS:

​#centerme 
{ 
    position: absolute; 
    left: 50%; 
    top: 50%; 

    /* You must set a size manually */ 
    width: 100px; 
    height: 50px; 

    /* Set negative margins equal to half the size */ 
    margin-left​: -50px; 
    margin-top: -25px; 

    background-color: cornflowerblue; 
} 

はここjsfiddleのデモです動的な高さ、より高度なソリューションがあります。古いIEブラウザではうまく動作しません。 HTMLは次のようになります。

<div id="outter-container"> 
    <div id="inner-container"> 
     <div id="centred"> 
      <p>I have a dynamic height!</p> 
      <p>Sup!</p> 
     </div>   
    </div> 
</div> 

アウトターコンテナは、ページの幅と高さをカバーする必要があります。これは、絶対配置のブロック要素です。
内部の容器は実際にはテーブルです!それはdisplay: table cssプロパティによって決まります。ここでの勝利は、あなたが実際にテーブルHTMLを必要としないということです。
#centred divは最後に必要な要素です。それでもページの幅と高さの100%をカバーしますが、内側に配置されているものはすべて縦と横の中央に配置されます。これは説明して、必要なCSSです:

/* 
An outter container is needed because the table 
won't cover the page width and height on it's own 
*/ 
#outter-container 
{ 
    position: absolute; 
    top: 0px; 
    right: 0px; 
    bottom: 0px; 
    left: 0px; 
} 

/* 
The inner container is a table which is set to 
cover the width and height of the page. 
*/ 
#inner-container 
{ 
    display: table; 
    width: 100%; 
    height: 100%; 
} 

/* 
This table cell will cover 100% of the page width 
and height, but everything placed inside it will 
be placed in the absolute centre. 
*/ 
#centred 
{ 
    display: table-cell; 
    vertical-align: middle; 
    text-align: center; 
} 

そしてもちろん、ここではそれに行くためにjsfiddleデモンストレーションです:http://jsfiddle.net/N7ZAr/3/

+0

+1すてきな整頓の例です。しかし、動的な大きさの要素のセンタリングはかなりカバーしていません。 – JohnW

+0

実際、私の経験では、ダイナミックな高さのものをセンタリングする必要はほとんどありませんでした。動的に配置された要素に実際に垂直方向のセンタリングが必要な場合は、テーブルを使用する必要があります。代わりに 'display:table' CSSプロパティを使って、HTMLでdivを使うこともできます。私はこれを編集します – Hubro

+0

私はこのシナリオでよく使われると思います。私がポップアップメッセージのためにそれを使用していたなら、私はメッセージテキストと共に幅が広がることを望むでしょう。その幅が指定された 'max-width'を超えた場合、私は高さが成長し始めたいと思っています。私は別の典型的な使用は、あなたがちょうど彼らがどのようなサイズでも画像を中心にしたい画像ビューアだろうと思います。いずれにしても、あなたの最新の解決策が私たちが得ようとしている最も近いものだと私は思っています。それは動作し、 'table'を使用しません。あなたの努力に感謝します。 – JohnW

1

http://milov.nl/code/css/verticalcenter.html 右/左センタリングのためのソースコード

+0

素敵な例!イベントはIE6で動作します。 –

+0

これは、コード時刻で中心divのサイズを知っている場合にのみ有効です – HerrSerker

+0

はい、固定された要素サイズ(yunzenの言及)を扱う場合、このソリューションは確かに使用できますが、私の元の質問は、ダイナミックなサイズの要素。だから私の要素がメッセージボックスとして使用された場合、私はメッセージテキストのサイズをボックスにしたいでしょう。この解決策は許されません...しかし、とにかく感謝します。 – JohnW

0

を確認するには、要素の幅を指定し、「自動」に左右のマージンを設定することができます。

垂直センタリングでは、少し厄介です。パーセンテージの高さを使用できますが、ボディの高さを100%に設定することを忘れないでください。そうしないと動作しません。

これがIE7で動作するかどうかわかりません。申し訳ありません。

+0

パーセンテージの高さを設定することで、要素を垂直方向に配置する方法がわかりませんか?中心に置く要素の上に「スペーサー」要素を配置することについて話している場合を除きます。私が何かを逃しているかどうか教えてください。 – JohnW

+0

申し訳ありませんが、「トップ」の割合を指定するとします。私は垂直方向のセンタリングをするより良い方法があると思います。 – eeeeaaii

3

それは固定サイズの要素であるならば、あなたはこのような何か行うことができます。

#centered { 
    position:absolute; 
    width:200px; 
    height:400px; 
    top:50%; 
    left:50%; 
    margin-left:-100px; // negative-half of element's width 
    margin-top:-200px; // negative-half of element's height 
}​ 

ここにトリックはtop:50%; left:50%;です。 margin-leftとあなたのwidthheight負の半に等しいmargin-topとそれを組み合わせると、あなたの要素は、ページの中央に配置されます。

Eric MeyerのCSSリセットやnormalize.cssなどのリセットスタイルシートを使用しない場合は、bodymargin:0;に設定してこのトリックを有効にすることが重要です。ここで

はjsfiddleです:私は、サイトのhttp://jsfiddle.net/remibreton/fZywe/1/

ライブ例:http://althotels.ca/

+0

この例をありがとう。私はこれがおそらく問題に対処する最も一般的な方法だと思っていますが、あなたの中心に置かれた要素が動的な大きさを持つときには落ちます。私のポップアップメッセージボックスの例では、実際にボックスの内容をサイジングしたいと思っています。だから私が見る限り、私はまだテーブルベースのソリューションを使用する必要があります。または私は何かを逃している? – JohnW

1

あなたが中心のコンテンツのサイズがわからない場合は、ここ 例を中心に2ステップが必要になります。http://jsfiddle.net/G6fUE/

<div class="popup-center"> 
    <div class="content"> 
     sadalshd<br /> 
     sadalshd<br /> 
     <img src="http://www.lorempixel.com/200/200" /> 
     sadalshd<br> 
    </div> 
</div>​ 

.popup-center { 
    position: absolute; 
    top: 50%; 
    left: 50%; 
} 
.popup-center div { 
    margin-left: -50%; 
    margin-top: -50%; 
} 

+0

+1ほとんどの作業のために。私はこの解決策をさらに調査しますが、単純な例がほとんどのブラウザで動作するように見えました。明示的な高さや幅を指定する必要はありませんでした。しかし、私の中心に置かれた要素はIE7では見えないように見えました。 – JohnW

関連する問題