CSSはフローティングdivを垂直方向に整列します


89

2つのdivが並んでいるdiv(#wrapper)があります。

right-divを垂直に揃えたいのですが。メインラッパーでvertical-align:middleを試しましたが、機能しません。それは私を夢中にさせています!

誰かが助けてくれることを願っています。

http://cssdesk.com/LWFhW

HTML:

<div id="wrapper">
  <div id="left-div">
    <ul>
      <li>One</li>
      <li>Two</li>
    </ul>
  </div>  
  <div id="right-div">
    Here some text...
  </div>
</div>

CSS:

#wrapper{
  width:400px;
  float:left;
  height:auto;
  border:1px solid purple;}

#left-div{
  width:40px;
  border:1px solid blue;
  float:left;}

#right-div{
  width:350px;
  border:1px solid red;
  float:left;}

ul{
  list-style-type: none;
  padding:0;
  margin:0;}

回答:


67

浮いた要素では運がありません。彼らは垂直整列に従わない、

display:inline-block代わりに、次のものが必要です。

http://cssdesk.com/2VMg8

注意


display: inline-block;要素間の空白を実際の空白として解釈するため、注意してください。それはそうするようにそれを無視しませんdisplay: block

私はこれをお勧めします:

設定するfont-sizeに含む要素の0(ゼロ)とリセットfont-sizeの要素がとても好きで、あなたの必要な値に

ul {
    margin: 0;
    padding: 0;
    list-style: none;
    font-size: 0;
}
ul > li {
    font-size: 12px;
}

ここでデモを参照してください:http//codepen.io/HerrSerker/pen/mslay


CSS

#wrapper{
  width:400px;
  height:auto;
  border:1px solid green;
  vertical-align: middle;
  font-size: 0;
}

#left-div{
  width:40px;
  border:1px solid blue;
  display: inline-block;
  font-size: initial;
  /* IE 7 hack */
  *zoom:1;
  *display: inline;
  vertical-align: middle;
}

#right-div{
  width:336px;
  border:1px solid red;
  display: inline-block;  
  font-size: initial;
  /* IE 7 hack */
  *zoom:1;
  *display: inline;
  vertical-align: middle;
}
  

#wrapperの高さが固定されている場合、これは機能しません。#right-divは、ラッパー要素ではなく、#left-div基準にして中央に配置されます。(属性が設定されinline-blockたインラインのように動作imgalignます)
Costa

@Costaそうあるべきだと思います。
yunzen 2013

どのようにすべきかは問題ではありません。フローティング要素を使用しなければならない場合が多く、CSSで何かを行う方法は常にあります。常に。最も単純なケースでは、フロートされたテキストの垂直方向の配置:jsbin.com/UWeB/1/edit
vsync

11
しかし、フロートを使用しないことを決定することはできないため、ソリューションも機能しません。要点は、フロートを使用しているときに何らかの形で垂直方向に整列することです。
vsync 2013

2
私のすべてのポイントは、インラインブロックがオプションではない場合があり、Googleからこのページにたどり着く可能性のある他の人を助けるためのユースケースを提供したということでした。失礼である必要はありませんでした。
ジェイミーバーカー

21

これは、displaytableとdisplaytable-cellを使用すると非常に簡単に実行できます。

#wrapper {
    width: 400px;
    float: left;
    height: auto;
    display: table;
    border: 1px solid green;
}

#right-div {
    width: 356px;
    border: 1px solid red;
    display: table-cell;
    vertical-align: middle;
}

編集:実際にはすぐにCSSデスクをいじりまわしました-http://cssdesk.com/RXghg

別の編集: Flexboxを使用します。これは機能しますが、かなり時代遅れです-http ://www.cssdesk.com/davf5

#wrapper {
    display: flex;
    align-items: center;
    border:1px solid green;
}

#left-div {
    border:1px solid blue;
}

#right-div {
    border:1px solid red;
}

1
こんにちはSpaceBeers。right-divのオーバーフローを隠しているので、あなたの提案はうまくいきません(コードをcssデスクに追加しただけです)。あなたのソリューションでは、オーバーフローは隠されておらず、divはその幅を拡大しています...
Marc

11

これは古代の質問だと思いますが、フロートの垂直方向の配置の問題に対する解決策を投稿すると便利だと思いました。

フロートさせたいコンテンツのラッパーを作成することで、:: afterまたは:: before疑似セレクターを使用して、ラッパー内でコンテンツを垂直方向に整列させることができます。そのコンテンツのサイズは、配置に影響を与えることなく、必要に応じて調整できます。唯一の難点は、ラッパーの100%の高さを埋める必要があるということですそのコンテナを。

http://jsfiddle.net/jmdrury/J53SJ/

HTML

<div class="container">
    <span class="floater">
        <span class="centered">floated</span>
    </span>
    <h1>some text</h1>
</div>

CSS

div {
    border:1px solid red;
    height:100px;
    width:100%;
    vertical-align:middle;
    display:inline-block;
    box-sizing: border-box;
}
.floater {
    float:right;
    display:inline-block;
    height:100%;
    box-sizing: border-box;
}
.centered {
    border:1px solid blue;
    height: 30px;
    vertical-align:middle;
    display:inline-block;
    box-sizing: border-box;
}
h1 {
    margin:0;
    vertical-align:middle;
    display:inline-block;
    box-sizing: border-box;
}
.container:after, .floater:after, .centered:after, h1:after {
    height:100%;
    content:'';
    font-size:0;
    vertical-align:middle;
    display:inline-block;
    box-sizing: border-box;
}

あなたが何をしているのかわかりませんが、centeredクラスを削除し、そのCSSから多くの冗長なものをクリーンアップした後でも、垂直方向の配置は正常に行われます(フォーマットが失われることをお詫びします!...):div { border:1px solid red; height:100px; } .floater { float:right; height:100%; } h1 { vertical-align:middle; } .container:after, .floater:after, .centered:after { height:100%; content:''; font-size:0; vertical-align:middle; display:inline-block; }
Sz。


2

フロートの使用を避けるために最善を尽くします...しかし、必要に応じて、次の行を使用して中央に垂直に配置します。

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

-1

私の変更の唯一の欠点は、divの高さが設定されていることです...それがあなたにとって問題であるかどうかはわかりません。

http://cssdesk.com/kyPhC


1
こんにちはショーン。おかげで、私は柔軟なソリューションを使用しようとしているので、この種のソリューションを避けたいと思っています...
Marc
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.