2012-03-19 9 views
14

私はウェブサイトを作っていると私は中央を縦にしようとしている:なぜトップです:CSSの50%が機能していませんか?

position: absolute; 
width:1200px; 
height:600px; 
top: 50%; 
left: 50%; 
margin-left: -600px; 

と私のHTMLは正確にleftとして働くtop単一div

+1

「left:50%;」と「margin-left:-600px;」を実行することは、もう一方をキャンセルするだけなので意味がありません。 –

+0

swenflea:親要素の 'position'エフェクトに関する情報で質問を編集しました。 –

+0

実際、あなたは質問でより具体的になりますか? DIVがページの中央にくるようにしますか?私は正確な中心を意味する....? –

答えて

13

CSSプロパティです。 は、その方向からdivをにプッシュします。 top:50%と書くと、divが上から50%押し下げられます。垂直にセンタリングする必要があるので、でこれを逆算して、に戻す必要があります。これは、margin-left: -600pxのようにのままにして、margin-top: -300pxを使用して行うことができます。

position: absolute; 
width: 1200px; 
height: 600px; 
top: 50%; 
margin-top: -300px; 
left: 50%; 
margin-left: -600px; 
+1

これは、固定高さの要素に対して機能します。可変高さの場合は、[this](http://stackoverflow.com/a/29232492/3389737)を使用してください。 – Luke

2

top:50%;正常に動作しますが、文句を言わない「センター」アイテム、それが上からページの高さの50%上端です配置されます。同様にあなたはmargin-left:-600px;を持ってどのようにあなたも、私は、これはややクリスチャンが与えた答えを模倣することができると信じてmargin-top:-300px;

+1

申し訳ありませんが動作しません...それはページの上部から-300pxを貼り付けています...私は外側のdivまたは内側のdivに任意のスタイリングが必要ですか? – swenflea

+0

これは特定のブラウザで発生していますか?それがポジションである限り、絶対的です。使用するセレクターがより具体的で、上記のスタイルをオーバーライドしない限り、包含するエレメントのスタイルは重要ではありません。 – lukiffer

0

を追加する必要がありますが、ここで使用した割合を含む、私の2セントをだし、また別の内部の1を示しています。

#parent { 
    position: absolute; 
    top: 50%; 
    left: 50%; 
    width: 120px; 
    height: 60px; 
    margin: -60px 0 0 -30px; 
    background: blue; 
} 
#center { 
    position: absolute; 
    width: 50%; 
    height: 50%; 
    top: 50%; 
    left: 50%; 
    margin: -12.5% 0 0 -25%; 
    background: green; 
} 

あなたがしようとしている場合http://jsfiddle.net/userdude/MYD27/

EDIT

さらにそれを見て、私はあなたが問題に遭遇するかもしれないと思います配置された要素内のコンテナではない要素でこれを行う例えば:

Full View | Code View

私は意図したとおりに動作しないと思います。私がposition: relative(あるいは、代わりにposition: absolute)を追加すると、意図したとおりに動作します。

Full View | Code View

+0

親DIVの「位置:相対」(または絶対)についての説明は+1。それが私のために働いたのです。 –

0

私が言われて、CSSの「トップ」プロパティが正しくコンテナ要素の高さに基づいて計算されることを自己宣伝my answer to another question here on SO :)

を露骨にするために、この機会を利用したいと思います - 効果的にターゲット要素をレンダリング正中線の下にある。これは、リンクされた質問で説明されているように、要素を半分上にプッシュする必要があることを意味します。

残念ながら、このような一見簡単なタスクは、絶対ピクセルベースの値(クリスチャンAntonsenの回答の+1)を使用せずに等上部余白を調整することによって達成することができない - 1「はマージントップ設定想像-50 %は」ちょうどそれを意味しますが、あなたがセンターに

calc(%50 - (items_height/2)); 

を使用することができます

24

私はこれが参考にすべきだと思います:)

i{ 
 
    -webkit-transform: translate(-50%,-50%); 
 
    transform: translate(-50%,-50%); 
 
    position: absolute; 
 
    top: 50%; 
 
    left: 50%; 
 
}
<i>center</i>

+1

これはIMOの最適解です。 – Kevin

+1

ありがとう!私は永遠にこれを探していました! –

+1

htmlとbodyの両方に 'height:100%;'を付けていない限り、あなたの親に静的な高さがない場合、これは動作しません。あなたは私の答えを確認することができます。 また、実際には状況によっては絶対的な絶対位置を必要としません。これは、他の要素との位置関係を維持するために必要な、この解決策を選択することに心配している人にとって、「位置:相対;しかし、 'top:'と '' left''が動作するためには 'position:static;'以外の位置値が必要です。 (または「bottom」、「right」、または「z-index」) –

12

が機能しない理由について質問に答えるには、要素にtopというプロパティを使用すると、その要素の親要素に静的な高さが設定されている必要があります。これは、pxまたはパーセント以外の単位にする必要があります。あなたが本当にあなたの親でパーセントを使用する必要があるなら、あなたはその親の親である次の親に移動し、その1つを静的な固定高さにすることができます。

何かを垂直にセンタリングする。 I prefer to use this method

要素の高さの幅を知る必要がないため、CSS transformを使用します。

position: relative; 
top: 50%; 
left: 50%; 
-webkit-transform: translate(-50%, -50%); 
-moz-transform: translate(-50%, -50%); 
-ms-transform: translate(-50%, -50%); 
-o-transform: translate(-50%, -50%); 
transform: translate(-50%, -50%); 

ブラウザ/ベンダープレフィックスを追加することを忘れないでください。

You can refer here for vendor prefixes.


あなたは親の高さがわからない場合。

  1. JavaScriptが親要素の自然な高さを取ると、あなたが直前に撮った値にその親要素の高さプロパティを設定使用: 2つのオプションがあります。親要素の高さが、センタリングする要素に兄弟である別の子要素によって引き起こされている場合、このメソッドを使用できます。

$('.parent').height($(this).height());
.parent { 
 
    /* Unkown height */ 
 
} 
 

 
.child { 
 
    /* Create columns */ 
 
    width: 50%; 
 
    float: left; 
 
} 
 

 
.child-1 { 
 
    position: relative; 
 
    top: 50%; 
 
    text-align: center; 
 
    -webkit-transform: translateY(-50%); 
 
    -moz-transform: translateY(-50%); 
 
    -ms-transform: translateY(-50%); 
 
    -o-transform: translateY(-50%); 
 
    transform: translateY(-50%); 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 

 
<!-- Example Start --> 
 
<div class="parent"> 
 
    <div class="child child-1"> 
 
    Lorem ipsum 
 
    </div> 
 
    <div class="child child-2"> 
 
    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. 
 
    </div> 
 
</div>

ヒント:あなただけのブラウザのサイズ変更にJavaScriptで再び高さを設定し、懸念に応答を取っている場合。 JavaScriptで高さをautoに設定して新しい高さを取得し、そのプロセスをやり直すことができます。

  1. 上記の考え方には傷を付けて、display: tableを中心に使用することができます。​​。
+1

"あなたが私たちが要素の頂点をプロパティするとき、その要素の親は静的な高さを設定する必要があります" - これは質問に対する答えでした。私の問題をサファリで解決しました。 – codescribblr

+1

RE: "その要素の親は静的な高さを設定する必要があります。"注1:親divが存在しない場合、HTMLと本文の両方を親とみなすことができます。注2:%も機能します。 注2。 例:amp.cssには次の行が含まれています: html、body {height:auto!important;} これは、自分のremote.html/frame.max.amp.htmlを転がしたときに広告が断頭される可能性があります。 html、body {height:100%!important;} これは、トップが動作するのを許可します:50%。 –

関連する問題