コンテンツの高さが可変である場合に、divのコンテンツを垂直方向に中央に配置するための最良の方法は何ですか。私の特定のケースでは、コンテナーdivの高さは固定されていますが、コンテナーの高さが可変である場合にも機能するソリューションがあれば素晴らしいと思います。また、CSSハックや非セマンティックマークアップをまったく、またはほとんど使用しないソリューションが欲しいです。
9 に答える
追加するだけ
position: relative;
top: 50%;
transform: translateY(-50%);
内側のdivに。
内側の div の上端を外側の div の半分の高さに移動し ( top: 50%;
)、内側の div をその高さの半分だけ上に移動します ( transform: translateY(-50%)
)。これはposition: absolute
またはで動作しrelative
ます。
簡単にするために含まれていないベンダープレフィックスがあることに注意transform
してください。translate
::before
これは、ブラウザーが疑似要素CSS-Tricks: Centering in the Unknown をサポートしている限り、この問題に対して私が見つけた最良の解決策のようです。
追加のマークアップは必要なく、非常にうまく機能するようです。要素がプロパティに従わないdisplay: table
ため、メソッドを使用できませんでした。table
max-height
.block {
height: 300px;
text-align: center;
background: #c0c0c0;
border: #a0a0a0 solid 1px;
margin: 20px;
}
.block::before {
content: '';
display: inline-block;
height: 100%;
vertical-align: middle;
margin-right: -0.25em; /* Adjusts for spacing */
/* For visualization
background: #808080; width: 5px;
*/
}
.centered {
display: inline-block;
vertical-align: middle;
width: 300px;
padding: 10px 15px;
border: #a0a0a0 solid 1px;
background: #f5f5f5;
}
<div class="block">
<div class="centered">
<h1>Some text</h1>
<p>But he stole up to us again, and suddenly clapping his hand on my
shoulder, said—"Did ye see anything looking like men going
towards that ship a while ago?"</p>
</div>
</div>
これは私が何度もやらなければならなかったことですが、一貫した解決策を得るには、セマンティックでないマークアップを少し追加し、ブラウザー固有のハックをいくつか追加する必要があります。css 3 のブラウザー サポートを取得すると、罪を犯さずに垂直方向のセンタリングを取得できます。
テクニックのより良い説明については、私がそれを適応させた記事を見ることができますが、基本的には、余分な要素を追加し、position:table\table-cell
テーブル以外の要素をサポートする IE とブラウザーにさまざまなスタイルを適用する必要があります。
<div class="valign-outer">
<div class="valign-middle">
<div class="valign-inner">
Excuse me. What did you sleep in your clothes again last night. Really. You're gonna be in the car with her. Hey, not too early I sleep in on Saturday. Oh, McFly, your shoe's untied. Don't be so gullible, McFly. You got the place fixed up nice, McFly. I have you're car towed all the way to your house and all you've got for me is light beer. What are you looking at, butthead. Say hi to your mom for me.
</div>
</div>
</div>
<style>
/* Non-structural styling */
.valign-outer { height: 400px; border: 1px solid red; }
.valign-inner { border: 1px solid blue; }
</style>
<!--[if lte IE 7]>
<style>
/* For IE7 and earlier */
.valign-outer { position: relative; overflow: hidden; }
.valign-middle { position: absolute; top: 50%; }
.valign-inner { position: relative; top: -50% }
</style>
<![endif]-->
<!--[if gt IE 7]> -->
<style>
/* For other browsers */
.valign-outer { position: static; display: table; overflow: hidden; }
.valign-middle { position: static; display: table-cell; vertical-align: middle; width: 100%; }
</style>
特定のブラウザー セットにスタイルを適用する方法 (ハック) は多数あります。条件付きコメントを使用しましたが、上記のリンク先の記事を見て、他の 2 つの手法を確認してください。
注: 事前に高さがわかっている場合、1 行のテキストを中央に配置しようとしている場合、またはその他のいくつかの場合に、垂直方向の中央揃えを取得する簡単な方法があります。詳細がある場合は、ブラウザのハックや非セマンティック マークアップを必要としない方法がある可能性があるため、それらを投入してください。
更新: CSS3 に対するより良いブラウザー サポートを取得し始めており、(他の効果の中でも特に) 垂直方向のセンタリングを取得するための代替方法として、フレックス ボックスと変換の両方を提供しています。最新の方法の詳細については、この他の質問を参照してください。
子セレクターを使用して、上記の Fadi の信じられないほどの回答を取り上げ、適用できる 1 つの CSS ルールにまとめました。contentCentered
あとは、中央に配置する要素にクラス名を追加するだけです。
.contentCentered {
text-align: center;
}
.contentCentered::before {
content: '';
display: inline-block;
height: 100%;
vertical-align: middle;
margin-right: -.25em; /* Adjusts for spacing */
}
.contentCentered > * {
display: inline-block;
vertical-align: middle;
}
<div class="contentCentered">
<div>
<h1>Some text</h1>
<p>But he stole up to us again, and suddenly clapping his hand on my
shoulder, said—"Did ye see anything looking like men going
towards that ship a while ago?"</p>
</div>
</div>
フォークされた CodePen: http://codepen.io/dougli/pen/Eeysg
これまでのところ、私にとって最高の結果:
中央に配置する div:
position: absolute;
top: 50%;
transform: translateY(-50%);
margin: 0 auto;
right: 0;
left: 0;