divが残りの幅を埋めるようにします


87

divに残りの幅を埋めさせるにはどうすればよいですか?

<div id="Main" style="width: 500px;">
    <div id="div1" style="width: 100px;"></div>
    <div id="div2"></div>
    <div id="div3" style="width: 100px; float: right;"></div>
</div>

どうすればdiv2残りを埋めることができますか?


最新の適切な回答については、選択した最良の回答をAdrienBeの回答に変更してください。
edwardtyl 2015

反対に、固定幅の中央divと流体の外側divが必要でした。他の誰かがそれを必要とするならば、私は一番下に答えを追加しました。
damndaewoo 2015

回答:


63

次のようなものを試してください。

<style>
    #divMain { width: 500px; }
    #left-div { width: 100px; float: left; background-color: #fcc; }
    #middle-div { margin-left: 100px; margin-right: 100px; background-color: #cfc; }
    #right-div { width: 100px; float: right; background-color: #ccf; }
</style>

<div id="divMain">
    <div id="left-div">
        left div
    </div>
    <div id="right-div">
        right div
    </div>
    <div id="middle-div">
        middle div<br />bit taller
    </div>
</div>

divは当然コンテナの100%の幅を占めます。この幅を明示的に設定する必要はありません。2つのサイドdivと同じように左右のマージンを追加することにより、それ自体のコンテンツがそれらの間に配置されます。

HTMLでは「middlediv」が「rightdiv」のに続くことに注意してください


1
私はあなたの(素晴らしい)解決策に基づいてさらに良い解決策を見つけたと思います:)私が提供する答えで以下を参照して
ください

アイテムの順序を変更せずにこれを行う方法はありますか?つまり、left-div、middle-div、right-divです。これは、さまざまな画面サイズでさまざまなことを実行する場合に重要です。
Eliezer Steinbock 2016年

ええ、この左右中央の順序は本当にトリックです。右のdivが2つのdivの下に入らないようにしますよね?
ansjovis86

49

最新のソリューション(2014年10月):流動的なレイアウトの準備ができています


前書き:

このソリューションは、によって提供されるソリューションよりもさらに単純ですLeigh。それは実際にそれに基づいています。

ここで、中央の要素(この場合は"content__middle"クラスあり)には、寸法プロパティが指定されておら、幅、パディング、マージン関連のプロパティがまったく指定されておらず、overflow: auto;(注1を参照)のみであることがわかります。

大きな利点は、左右の要素にamax-widthとamin-widthを指定できることです。これは流動的なレイアウトに最適です..したがってレスポンシブレイアウト:-)

注1:クラスにmargin-leftmargin-rightプロパティを追加する必要があるLeighの回答と比較してください"content__middle"


非流体レイアウトのコード:

ここでは、左右の要素(クラス"content__left""content__right")の固定されています(ピクセル単位)。したがって、非流体レイアウトと呼ばれます。

http://jsbin.com/qukocefudusu/1/edit?html,css,outputのライブデモ

<style>
    /*
     * [1] & [3] "floats" makes the 2 divs align themselves respectively right & left
     * [2] "overflow: auto;" makes this div take the remaining width
     */
    .content {
        width: 100%;
    }
    .content__left {
        width: 100px;
        float: left; /* [1] */
        background-color: #fcc;
    }
    .content__middle {
        background-color: #cfc;
        overflow: auto; /* [2] */
    }
    .content__right {
        width: 100px;
        float: right; /* [3] */
        background-color: #ccf;
    }
</style>

<div class="content">
    <div class="content__left">
        left div<br/>left div<br/>left div<br/>left div<br/>left div<br/>left div<br/>
    </div>
    <div class="content__right">
        right div<br/>right div<br/>right div<br/>right div<br/>
    </div>
    <div class="content__middle">
        middle div<br/>middle div<br/>middle div<br/>middle div<br/>middle div<br/>middle div<br/>middle div<br/>middle div<br/>middle div<br />bit taller
    </div>
</div>

流動的なレイアウトのコード:

ここで、左右の要素(クラス"content__left""content__right")の可変です(パーセンテージ)ですが、最小幅と最大幅もあります。したがって、流動レイアウトと呼ばれます。

max-widthプロパティhttp://jsbin.com/runahoremuwu/1/edit?html,css,outputを使用した流動的なレイアウトのライブデモ

<style>
    /*
     * [1] & [3] "floats" makes the 2 divs align themselves respectively right & left
     * [2] "overflow: auto;" makes this div take the remaining width
     */
    .content { 
        width: 100%; 
    }
    .content__left { 
        width: 20%; 
        max-width: 170px;  
        min-width: 40px;  
        float: left; /* [1] */
        background-color: #fcc; 
     }
    .content__middle { 
        background-color: #cfc; 
        overflow: auto; /* [2] */
    }
    .content__right { 
        width: 20%; 
        max-width: 250px; 
        min-width: 80px; 
        float: right; /* [3] */
        background-color: #ccf; 
    }
</style>

<div class="content">
    <div class="content__left">
        max-width of 170px & min-width of 40px<br />left div<br/>left div<br/>left div<br/>left div<br/>left div<br/>left div<br/>
    </div>
    <div class="content__right">
        max-width of 250px & min-width of 80px<br />right div<br/>right div<br/>right div<br/>right div<br/>
    </div>
    <div class="content__middle">
        middle div<br/>middle div<br/>middle div<br/>middle div<br/>middle div<br/>middle div<br/>middle div<br/>middle div<br/>middle div<br />bit taller
    </div>
</div>

ブラウザのサポート

次のWebブラウザのBrowserStack.comでテストされています。

  • IE7からIE11
  • Ff 20、Ff 28
  • Safari 4.0(Windows XP)、Safari 5.1(Windows XP)
  • Chrome 20、Chrome 25、Chrome 30、Chrome 33、
  • Opera 20

2
特にレスポンシブWebデザインが必要になったため、すべての開発者にこの方法を利用することをお勧めします。:)
aullah 2015年

1
これに注意してください。オーバーフローが原因で高さが正確でない場合、Firefoxのcontent__middledivにスクロールバーが表示されることがあります。
ジェイソン

こんにちはジェイソン、それは非常に興味深いです、それを指摘してくれてありがとう。これが発生したときに実際の例を示すためにjsfiddleを提供できますか?
エイドリアンBe

これoverflowは、ブロックフォーマットコンテキストを作成するためですか?うdisplay: flex同じ効果がありますか?
ジェイエン

1
うん、やった。 developer.mozilla.org/en-US/docs/Web/Guide/CSS/…はとても役に立ちました。使用して終了overflow-y: hidden)の幅がセット、Bであることを許さ)それとして最高のブラウザのサポートおよびCを持っている)テーブルではなかった
Jayen

39

フレックスボックスは解決策です-そしてそれらは素晴らしいです。私は10年の間cssからこのようなものを望んでいました。必要なのはdisplay: flex、「メイン」のスタイルに追加することだけですflex-grow: 100(100は任意ですが、正確に100である必要はありません)。このスタイルを追加してみてください(効果を表示するために色を追加します):

<style>
    #Main {
        background-color: lightgray;
        display: flex;
    }

    #div1 {
        border: 1px solid green;   
        height: 50px; 
        display: inline-flex; 
    }
    #div2 {
        border: 1px solid blue;    
        height: 50px;
        display: inline-flex;
        flex-grow: 100;
    }
    #div3 {
        border: 1px solid orange;        
        height: 50px;
        display: inline-flex;
    }
</style>

フレックスボックスの詳細については、https//css-tricks.com/snippets/css/a-guide-to-flexbox/をご覧ください。


Flexboxは素晴らしいですが、残っているすべてのスペースではなく、必要なだけのスペースを占有します。したがって、私はoverflow:autoソリューションを使用しました。
ThinkBonobo 2016年

@ThinkBonobo「それ」とはどういう意味ですか?フレックスボックス自体は「ブロック」のように機能し、フレックスボックス内のアイテムは間違いなく必要以上のスペースを占める可能性があります。
BT

@BTそれはメインの中央divを意味します。これは間違いなく多くの場合に機能するソリューションですが、私の特定のユースケースでは機能しません。
ThinkBonobo 2016年

1
@ThinkBonobo Bet jsFiddle
BT

23

これを実現するには、CSSFlexbox flex-growプロパティを使用します。

.main {
  display: flex;
}
.col-1, .col-3 {
  width: 100px;
}
.col-2 {
  flex-grow: 1;
}
<div class="main">
  <div class="col-1" style="background: #fc9;">Left column</div>
  <div class="col-2" style="background: #eee;">Middle column</div>
  <div class="col-3" style="background: #fc9;">Right column</div>
</div>


1
ベストアンサーtbh。4年後に動作し、他のソリューションよりもクリーンです。+1
ハリーJ

4

bit回答の投稿は遅れていますが、マージンを使用しない別のアプローチがあります。

<style>
    #divMain { width: 500px; }
    #div1 { width: 100px; float: left; background-color: #fcc; }
    #div2 { overflow:hidden; background-color: #cfc; }
    #div3 { width: 100px; float: right; background-color: #ccf; }
</style>

<div id="divMain">
    <div id="div1">
        div 1
    </div>
    <div id="div3">
        div 3
    </div>
    <div id="div2">
        div 2<br />bit taller
    </div>
</div>

この方法は魔法のように機能しますが、ここに説明があります:) \

ここで同様のサンプルをいじってください。


4

残りのスペースを取る必要があるDivはクラスである必要があります。他のdivはid(s)にすることができますが、幅が必要です。

CSS

#main_center {
    width:1000px;
    height:100px;
    padding:0px 0px;
    margin:0px auto;
    display:block;
}
#left {
    width:200px;
    height:100px;
    padding:0px 0px;
    margin:0px auto;
    background:#c6f5c6;
    float:left;
}
.right {
    height:100px;
    padding:0px 0px;
    margin:0px auto;
    overflow:hidden;
    background:#000fff;
}
.clear {
    clear:both;
}

HTML

<body>
    <div id="main_center">
        <div id="left"></div>
        <div class="right"></div>
        <div class="clear"></div>
    </div>
</body>

次のリンクには、残りのエリアカバレッジの問題を解決するコードが実行されています。

jsFiddle


1

反対の問題の解決策を探していました。中央に固定幅のdivが必要で、両側に流体幅のdivが必要だったので、次のことを思いつき、誰かが必要になった場合に備えてここに投稿すると思いました。

#wrapper {
  clear: both;
  width: 100%;
}

#wrapper div {
  display: inline-block;
  height: 500px;
}

#center {
  background-color: green;
  margin: 0 auto;
  overflow: auto;
  width: 500px;
}

#left {
  float: left;
}

#right {
  float: right;
}

.fluid {
  background-color: yellow;
  width: calc(50% - 250px);
}
<div id="wrapper">
  <div id="center">
    This is fixed width in the centre
  </div>
  <div id="left" class="fluid">
    This is fluid width on the left
  </div>
  <div id="right" class="fluid">
    This is fluid width on the right
  </div>
</div>

#center要素の幅を変更する場合は、のwidthプロパティを次の.fluidように更新する必要があります。

width: calc(50% - [half of center width]px);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.