divを並べて配置する方法


241

100%幅に設定されたメインラッパーdivがあります。その中に私は2つのdivを持ちたいと思います。1つは固定幅で、もう1つは残りのスペースを埋めます。2番目のdivをフロートして残りのスペースを埋めるにはどうすればよいですか?助けてくれてありがとう。


2
次回はまた、問題がここに...開発者に明確になるように、あなたの例のコードは喜ば配置
ロブ・

1
position:absoluteオプションですか?コンテナの側面に位置を設定でき、divは新しいサイズになります。
AlexanderMP

回答:


363

あなたが求めていることを行う方法はたくさんあります:

  1. CSS floatプロパティの使用:

    <div style="width: 100%; overflow: hidden;">
        <div style="width: 600px; float: left;"> Left </div>
        <div style="margin-left: 620px;"> Right </div>
    </div>
  2. CSS displayプロパティの使用-をのdivように動作させるために使用できますtable

    <div style="width: 100%; display: table;">
        <div style="display: table-row">
            <div style="width: 600px; display: table-cell;"> Left </div>
            <div style="display: table-cell;"> Right </div>
        </div>
    </div>

より多くの方法がありますが、これらの2つは最も人気があります。


17
@filoxoのHTML 5ソリューション。代わりにそれを使用してください
TheMcMurder '13年

1
以前のコメント投稿者の発言:filoxoごとに#3としてHTML5ソリューションを追加することを検討してください。
Ahmed Fasih、2015年

2
@TheMcMurder:古いブラウザー(IE <11など)をサポートする必要がある私たちにとって、これはオプションではありません。
Oyvind 2016年

@Oyvind、あなたはまったく正しい。ユースケースによって異なります。IE 8、9、または10をサポートしている場合は、ポリフィルサポートが必要です。polyfill.iocdn.polyfill.io / v2 / docsまたはgithub.com/10up/flexibilityなどのサービスをお勧めしますが、ポリフィルの使用を妨げる要件。
TheMcMurder 2016年

1
オーバーフローは何をしますか?これは指定された高さの要素ではありませんか?
マイケル

176

CSS3 は、この動作も実現できるフレキシブルボックス(フレックスボックス)を導入しました。

最初のdivの幅を定義してから、2番目のdivにそのflex-grow値を指定し1て、親の残りの幅を埋めることができます。

.container{
    display: flex;
}
.fixed{
    width: 200px;
}
.flex-item{
    flex-grow: 1;
}
<div class="container">
  <div class="fixed"></div>
  <div class="flex-item"></div>
</div>

jsFiddleデモ

フレックスボックスは古いブラウザとの下位互換性はありませんが、最新のブラウザをターゲットにするための優れたオプションです(CaniuseおよびMDNも参照)。フレックスボックスの使用方法に関する優れた包括的なガイドは、CSS Tricksで入手できます。


5
解決策を見つけるのに一日かかりましたが、この答えで解決しました!4つのパネルが並んでいますが、3番目と4番目のパネルには何もない場合があります。それらはすべて境界線のある包含divに住んでいます。最初のdiv状況でfloat:left全体を使用すると、生成されたラベルが動的であるため、divが下部の境界線を通過します。ラベルは、ASPがラベルをレンダリングする方法であるスパンです。float:leftがないと、同じ行にdivが3つしか作成されません。そして、テーブルの使用は問題外です。ありがとうございました!
2015年

このようなものを使用するための下位互換性のある方法はありますか?つまり、IE 8-10をサポートする必要がある貧しい人々のために
Ben A. Hilleli

BenA.Hilleli @要件に依存するかもしれない(例えば。プログレッシブ・エンハンスメントやグレースフルデグラデーション)が、クイック検索は、この(時代遅れビット)を得たガイド「現実の世界でフレキシボックスを使用する方法」と同様にFlexie.jsましたIE6-9をサポートします。または、この質問に対する他の回答を試してみてください。それらは同じことを達成するためです。
filoxo 2015年

20

HTMLとCSSの設計戦略についてはあまり詳しくありませんが、単純なものを探していて、それが画面に自動的に収まる場合(私はそうです)、最も単純な解決策は、divを単語として動作させることです段落。指定してみてくださいdisplay: inline-block

<div style="display: inline-block">
   Content in column A
</div>
<div style="display: inline-block">
   Content in column B
</div>

DIVの幅を指定する必要がある場合とない場合があります。


5
おそらくdisplay:flex最良の解決策ですがinline-block、より多くのブラウザーで動作するため、私も優れていると思います。ちなみに、<div style="white-space:nowrap">サイズ変更時に分割されないように、両方のdivをaでラップする必要がある場合があります。
John Henckel 2016年

これはテンプレート化に適したソリューションです。唯一の問題は、コンテンツが少ないdivを一番下にプッシュすることです。どうやってそれを上に押し上げるのですか?
ほぼ初心者

1
nvm、それを検索するために必要なだけです。解決策は次のとおりです。vertical-align:top;
ほぼ初心者

@JohnHenckelは、すべてのブラウザに対応しているわけではないことを意味しています。inline-blockコード。
Kavindu Gayantha

@guillermoうまくいっていません。すべてのdivが並んで配置されていません。何故ですか。それは明確ではありません。
カビンドゥガヤンサ

14

CSSグリッドを使用してこれを達成できます。これは、説明のための長いバージョンです。

div.container {
    display: grid;
    grid-template-columns: 220px 20px auto;
    grid-template-rows: auto;
}

div.left {
    grid-column-start: 1;
    grid-column-end: 2;
    grid-row-start: row1-start
    grid-row-end: 3;
    background-color: Aqua;
}

div.right {
    grid-column-start: 3;
    grid-column-end: 4;
    grid-row-start: 1;
    grid-row-end; 1;
    background-color: Silver;
}

div.below {
    grid-column-start: 1;
    grid-column-end: 4;
    grid-row-start: 2;
    grid-row-end; 2;
}
<div class="container">
    <div class="left">Left</div>
    <div class="right">Right</div>
    <div class="below">Below</div>
</div>

または、floatとmarginを使用するより伝統的な方法。

この例では背景色を含めて、物事がどこにあるかを示し、フロート領域の下のコンテンツをどう処理するかを示しています。

実際のスタイルをインラインで記述せず、スタイルシートに抽出します。

div.left {
    width: 200px;
    float: left;
    background-color: Aqua;
}

div.right {
    margin-left: 220px;
    background-color: Silver;
}

div.clear {
    clear: both;
}
    <div class="left"> Left </div>
    <div class="right"> Right </div>
    <div class="clear">Below</div>

<div style="width: 200px; float: left; background-color: Aqua;"> Left </div>
<div style="margin-left: 220px; background-color: Silver;"> Right </div>
<div style="clear: both;">Below</div>

2

最初のdivにフロートを左に固定し、2番目のdivに100%幅のフロートを左に割り当てます。これでうまくいくはずです。その下にアイテムを配置する場合は、下に配置するアイテムにクリア:両方が必要です。


2
<div class="container" style="width: 100%;">
    <div class="sidebar" style="width: 200px; float: left;">
        Sidebar
    </div>
    <div class="content" style="margin-left: 202px;">
        content 
    </div>
</div>

これはブラウザ間で互換性があります。左マージンがないと、コンテンツがサイドバーより長い場合、コンテンツが左端まで実行されるという問題が発生します。


1

IE6をタグ付けしていない場合は、2番目<div>をフロートし、最初<div>の固定幅と同じ(またはそれより少し大きい)マージンを与えます。

HTML:

<div id="main-wrapper">
    <div id="fixed-width"> lorem ipsum </div>
    <div id="rest-of-space"> dolor sit amet </div>
</div>

CSS:

#main-wrapper {
    100%;
    background:red;
}
#fixed-width {
    width:100px;
    float:left
}
#rest-of-space {
    margin-left:101px;
        /* May have to increase depending on borders and margin of the fixd width div*/
    background:blue;
}

マージンは、「残りのスペース」<div>に「固定幅」より多くのコンテンツが含まれる可能性を考慮しています<div>

固定幅を背景にしないでください。これらを別の「列」として視覚的に確認する必要がある場合は、偽の列トリックを使用します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.