Зробіть 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.