Зробіть 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заповнити залишок?


Щоб отримати сучасну правильну відповідь, будь ласка, змініть вибрану найкращу відповідь на відповідь Адріена Бе.
edwardtyl

Мені знадобилося протилежне, фіксована ширина центру div та рідина зовні divs. Я додав відповідь внизу, якщо вона потрібна комусь іншому.
damndaewoo

Відповіді:


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>

divs, природно, займе 100% ширини свого контейнера, немає необхідності явно встановлювати цю ширину. Додаючи ліве / праве поле так само, як два бічних div, власний вміст змушений знаходитись між ними.

Зверніть увагу, що "середній div" йде після "правого div" у HTML


1
Думаю, я знайшов ще краще рішення на основі вашого (чудового) рішення :) див. Нижче у відповіді, яку я надаю
Адріен Будь

чи є спосіб зробити це, не змінюючи порядку елементів? тобто лівий div, середній div, правий div. Це важливо, якщо ви хочете робити різні речі на різних розмірах екрана.
Еліезер Стейнбок

Так, такий порядок ліворуч-право-середини - це справді фокус. Це забороняє правильний div не потрапляти під два div, так?
Ansjovis86,

49

Сучасне рішення (жовтень 2014 р.): Готовий до компонування рідини


Вступ:

Це рішення навіть простіше, ніж запропоноване Leigh. Це фактично засновано на ньому.

Тут ви можете помітити, що середній елемент (у нашому випадку з "content__middle"класом) не має жодної властивості розмірності - ні ширини, ні заповнення, ні властивості, пов’язаної з полями - а лише overflow: auto;(див. Примітку 1).

Великою перевагою є те, що тепер ви можете вказати a max-widthта a min-widthдля лівого та правого елементів . Що є фантастичним для рідинних макетів. Отже, адаптивний макет :-)

примітка 1: проти відповіді Лі, де вам потрібно додати властивості margin-left& margin-rightдо "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>

Підтримка браузера

Перевірено на 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,
  • Опера 20

2
Я рекомендую всім розробникам використовувати цей метод, тим більше, що адаптивний веб-дизайн став необхідністю. :)
aullah

1
Обережно з цим. У деяких випадках смуга прокрутки відображатиметься у div div_________ на Firefox, якщо висоти не точні через переповнення: auto;
Джейсон

Привіт Джейсоне, це дуже цікаво. Чи можете ви надати jsfiddle, щоб показати живий приклад, коли це трапиться?
Адріен Будь

це тому, що overflowстворює контекст форматування блоків? мали display: flexб такий самий ефект?
Джейен,

1
Так, це сталося. developer.mozilla.org/en-US/docs/Web/Guide/CSS/… було дуже корисно. в кінцевому підсумку використовував overflow-y: hiddenяк це: a) дозволено встановлювати ширину, b) має найкращу підтримку браузера і c) не був столом
Jayen

39

Шлейфи - це рішення - і вони фантастичні. Я хочу щось подібне з css протягом десятиліття. Все, що вам потрібно, - це додати display: flexсвій стиль до "Main" і 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 чудовий, але він займає лише стільки місця, скільки йому потрібно, а не весь простір, який залишився. Таким чином я пішов із переповненням: автоматичне рішення.
ThinkBonobo

@ThinkBonobo, що ви маєте на увазі під "цим"? Сам флекс-бокс буде діяти як "блок", і елементи всередині флекс-боксу можуть однозначно займати більше місця, ніж потрібно.
BT

@BT це означає основний центральний div. Це точно рішення, яке працює для багатьох випадків, але не для мого конкретного випадку використання.
ThinkBonobo

1
@ThinkBonobo Bet, я міг би змусити вас працювати, якби ви опублікували jsFiddle
BT

23

Для цього використовуйте властивість CSS Flexbox 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
Гаррі Дж.

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, який повинен зайняти решту місця, повинен бути класом .. Інші divs можуть бути ідентифікаторами, але вони повинні мати ширину ..

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 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);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.