Как разместить div рядом


241

У меня есть основной div обертки, который установлен на 100% ширины. Внутри этого я хотел бы иметь два div, один с фиксированной шириной и другой, который заполняет остальное пространство. Как мне переместить второй div, чтобы заполнить остальное пространство. Спасибо за любую помощь.


2
В следующий раз также разместите ваш пример кода, пожалуйста, чтобы вопрос стал понятнее для разработчиков здесь
Роб

1
есть позиция: абсолютный вариант? Вы можете установить положение по бокам контейнера, и div примет новый размер.
AlexanderMP

Ответы:


363

Есть много способов сделать то, что вы просите:

  1. Использование свойства CSSfloat :

    <div style="width: 100%; overflow: hidden;">
        <div style="width: 600px; float: left;"> Left </div>
        <div style="margin-left: 620px;"> Right </div>
    </div>
    
  2. Использование свойства CSSdisplay - которое можно использовать, чтобы заставить divs действовать как 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>
    

Есть больше методов, но эти два являются самыми популярными.


17
Решение HTML 5 от @filoxo, используйте его вместо этого
TheMcMurder

1
Что сказал предыдущий комментатор: рассмотрите возможность добавления решения HTML5 для filoxo как №3.
Ахмед Фасих

2
@TheMcMurder: для нас, которым необходимо поддерживать старые браузеры (например, IE <11), это не вариант.
Ойвинд

@ Ойвинд, ты совершенно прав. Это зависит от вашего варианта использования. Если вы поддерживаете IE 8, 9 или 10, вам потребуется поддержка polyfill. Я бы порекомендовал такой сервис, как polyfill.io cdn.polyfill.io/v2/docs или github.com/10up/flexibility, но у вас может быть очень строгий требования, которые мешают использовать полифилы.
TheMcMurder

1
что делает переполнение: скрытый делать? Разве это не для элементов с указанной высотой?
Майкл

177

CSS3 представил гибкие боксы (также как flex box), которые также могут достичь этого поведения.

Просто определите ширину первого 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

Обратите внимание, что flex-боксы не имеют обратной совместимости со старыми браузерами, но являются отличным вариантом для таргетинга на современные браузеры (см. Также Caniuse и MDN ). На CSS Tricks доступно отличное всестороннее руководство по использованию flex box .


5
Потребовался целый день, чтобы найти решение, и этот ответ решил его! У меня есть 4 панели рядом с 3-й и 4-й панелями, в которых иногда ничего нет. Все они живут в сдерживающем div с рамкой вокруг них. Весь float: left в первой ситуации с div оставил меня с div, проходящим за границу снизу, потому что сгенерированные метки являются динамическими. Эти метки простираются, потому что именно так их отображает ASP. Не имея float: left сделал только 3 деления в одном ряду. И использование таблицы исключено. Спасибо!
Яркий

Есть ли обратно совместимый метод, чтобы использовать что-то вроде этого, то есть для нас, бедняги, которые все еще должны поддерживать IE 8-10
Бен А. Хиллели

@ BenA.Hilleli, которые могут зависеть от ваших требований (например, прогрессивное улучшение или постепенное ухудшение ), но быстрый поиск позволил получить это (немного устаревшее) руководство «Как использовать flexbox в реальном мире», а также Flexie.js, который поддерживает IE6-9. В качестве альтернативы, попробуйте любой другой ответ на этот вопрос, поскольку они достигают того же самого.
filoxo

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, <div style="white-space:nowrap">чтобы не допустить изменения размера.
Джон Хенкель

Это хорошее решение для шаблонов. Единственная проблема заключается в том, что он помещает div с меньшим содержанием в конец. Как подтолкнуть его к вершине?
почти новичок

1
nvm, просто нужно его найти, решение: vertical-align: top;
почти новичок

@JohnHenckel, что означает, что это не для всех браузеров, разве это не могло бы работать для всех браузеров одинаково? inline-blockкод.
Кавинду Гаянта

@ 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 поплавок влево и зафиксируйте его, второму 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, затем поместите вторую <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>.

Не задавайте фиксированную ширину фона; если вам нужно визуально увидеть их как разные «столбцы», используйте трюк с искусственными столбцами .

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.