CSS два деления рядом друг с другом


230

Я хочу поставить две <div>с рядом. Право <div>составляет около 200 пикселей; а левая <div>должна заполнить остальную часть ширины экрана? Как я могу это сделать?

Ответы:


421

Вы можете использовать flexbox для размещения ваших предметов:

#parent {
  display: flex;
}
#narrow {
  width: 200px;
  background: lightblue;
  /* Just so it's visible */
}
#wide {
  flex: 1;
  /* Grow to rest of container */
  background: lightgreen;
  /* Just so it's visible */
}
<div id="parent">
  <div id="wide">Wide (rest of width)</div>
  <div id="narrow">Narrow (200px)</div>
</div>

Это в основном просто чистка поверхности flexbox. Flexbox может делать довольно удивительные вещи.


Для поддержки старых браузеров вы можете использовать CSS float и свойства width для его решения.

#narrow {
  float: right;
  width: 200px;
  background: lightblue;
}
#wide {
  float: left;
  width: calc(100% - 200px);
  background: lightgreen;
}
<div id="parent">
  <div id="wide">Wide (rest of width)</div>
  <div id="narrow">Narrow (200px)</div>
</div>


14
На самом деле это правильный ответ, он лаконичен и - в отличие от двух вышеупомянутых - полностью автономен. Лучшие ответы на SO должны быть такими, IMO. +1
Бобби Джек,

Хотите уточнить, почему должны быть левые float:left? В вашем комментарии к моему ответу говорится, что «lft div требуется для охвата всей левой области», но float:leftэто заставит его плотно обернуть содержимое.
Фальстро

14
Этот ответ не совсем корректен, и довольно огорчительно видеть, что за него так много голосуют. Это создает макет, который очень нестабилен. Я бы посоветовал поместить два div в контейнер и использовать свойство display: inline-block, чтобы выровнять div, как предлагали некоторые другие ответы. Я никого не критикую, так как мы все здесь, чтобы помогать друг другу, поэтому, кроме моего придирки, спасибо MN за ваш вклад в это сообщество.
Муссер

1
НО следует отметить, что встроенный блок не будет работать в старых версиях IE ...
Mussser

3
@Mussser Я согласен с вашим комментарием, но имейте в виду, что этот ответ пришел с 2009 года ... времени, когда то, что вы называете "старыми версиями Ie" (т.е. IE8 и ниже), было "текущими" версиями IE ...
Лоран С.

139

Я не знаю, является ли это все еще текущей проблемой или нет, но я только столкнулся с той же самой проблемой и использовал display: inline-block;тэг CSS . Оберните их в div, чтобы они могли быть расположены соответствующим образом.

<div>
    <div style="display: inline-block;">Content1</div>
    <div style="display: inline-block;">Content2</div>
</div>

Обратите внимание, что использование атрибута inline style использовалось только для краткости этого примера, конечно, они использовались для перемещения во внешний файл CSS.


1
Это было решением для меня. Я хотел, чтобы два div рядом стояли, как [] [] (мужик, это было давно, так как я сделал это ..) =) слава.
Partack

Этот работал и для меня. У меня были некоторые проблемы с другим числом с плавающей запятой: правый div переместил мой правый столбец div ниже левого, поэтому я также заставил контейнер использовать display: inline-block, и это «решило».
Мартин Карни

5
Это не работает, когда контент большой в Content1 DIV. В результате DIV находятся на двух отдельных линиях, а не рядом друг с другом.
Ричард Холлис

@RichardHollis Мне удалось установить widthсвойство всех моих двух делителей рядом друг с другом, чтобы предотвратить перенос второго на новую строку.
Trindaz

1
добавьте css vertical-align: top; и тем и другим, иначе они будут толкать друг друга вниз, если длина контента отличается
проспект

27

К сожалению, это не тривиальная вещь для решения в общем случае. Проще всего было бы добавить свойство в стиле css "float: right;" к вашему 200px div, однако, это также приведет к тому, что ваш "main" -div будет на всю ширину, и любой текст там будет плавать вокруг края 200px-div, что часто выглядит странно, в зависимости от содержимого (в значительной степени во всех случаях, кроме случаев, когда это плавающее изображение).

РЕДАКТИРОВАТЬ: Как предложил Dom, проблема обертывания, конечно, может быть решена с запасом. Я такой глупый.


1
'float: left' будет более подходящим, lft div необходим для охвата всей левой области. Никаких оскорблений не было, просто подумайте
MN

19

Метод, предложенный @roe и @MohitNanda, работает, но если задан правильный div float:right;, то он должен стоять первым в источнике HTML. Это нарушает порядок чтения слева направо, что может привести к путанице, если страница отображается с выключенными стилями. Если это так, то может быть лучше использовать оболочку div и абсолютное позиционирование:

<div id="wrap" style="position:relative;">
    <div id="left" style="margin-right:201px;border:1px solid red;">left</div>
    <div id="right" style="position:absolute;width:200px;right:0;top:0;border:1px solid blue;">right</div>
</div>

Продемонстрировано:

лево право

Редактировать: Хм, интересно. В окне предварительного просмотра отображаются правильно отформатированные элементы div, а в отображаемом элементе публикации - нет. Извините, вам придется попробовать это самостоятельно.


15

Я столкнулся с этой проблемой сегодня. Исходя из приведенных выше решений, это сработало для меня:

<div style="width:100%;"> 
    <div style="float:left;">Content left div</div> 
    <div style="float:right;">Content right div</div> 
</div> 

Просто сделайте, чтобы родительский div охватывал всю ширину и плавал в div, содержащихся внутри.


8

ОБНОВИТЬ

Если вам нужно разместить элементы в ряд, вы можете использовать Flex Layout . Здесь у вас есть еще один учебник Flex . Это отличный инструмент CSS, и хотя он не на 100% совместим, с каждым днем ​​его поддержка улучшается. Это работает так же просто, как:

HTML

<div class="container">
    <div class="contentA"></div>
    <div class="contentB"></div>
</div>

CSS

.container {
    display: flex;
    width: 100%;
    height: 200px;
}

.contentA {
    flex: 1;
}

.contentB {
    flex: 3;
}

И здесь вы получите контейнер с общим размером 4 единицы, который делит пространство со своими дочерними элементами в соотношении 1/4 и 3/4.

Я сделал пример в CodePen, который решает вашу проблему. Я надеюсь, что это помогает.

http://codepen.io/timbergus/pen/aOoQLR?editors=110

ОЧЕНЬ СТАРЫЙ

Может быть, это просто чепуха, но вы пробовали с таблицей? Он не использует непосредственно CSS для позиционирования div, но он работает нормально.

Вы можете создать таблицу 1x2 и поместить ее divsвнутрь, а затем отформатировать таблицу с помощью CSS, чтобы разместить их так, как вы хотите:

<table>
  <tr>
    <td>
      <div></div>
    </td>
    <td>
      <div></div>
    </td>
  </tr>
</table>

Заметка

Если вы хотите , чтобы избежать с помощью таблицы, как было сказано ранее, вы можете использовать float: left;и float: right;и в следующий элемент, не забудьте добавить clear: left;, clear: right;или clear: both;для того , чтобы иметь место очищено.


Таблицы являются гораздо более предсказуемым решением, чем постоянно меняющийся «float», который, кажется, всегда что-то портит, когда вы добавляете или удаляете элементы.
Кокодоко

Это прекрасное решение, если вы работаете с электронной почтой.
Зак Клэнси

6
div1 {
    float: right;
} 
div2 {
    float: left;
}

Это будет работать нормально, если вы установите clear: bothэлемент, который разделяет этот блок из двух столбцов.


3
При использовании float, вы должны установить свойство width. Так что я не думаю, что это хорошее решение ..
Martijn

4

Я столкнулся с той же проблемой, и версия Mohits работает. Если вы хотите сохранить свой левый-правый порядок в HTML, просто попробуйте это. В моем случае левый div регулирует размер, правый div остается на ширине 260px.

HTML

<div class="box">
<div class="left">Hello</div>
<div class="right">World</div>
</div>

CSS

.box {
    height: 200px;
    padding-right: 260px;
}    

.box .left {
    float: left;
    height: 200px;
    width: 100%;
}

.box .right {
    height: 200px;
    width: 260px;
    margin-right: -260px;
}

Хитрость заключается в том, чтобы использовать правый отступ на главном блоке, но снова использовать это пространство, снова поместив правый блок с полем справа.


Я не получаю, что работает без поплавка: прямо в. Правильно.
Юсси Пало

3

Я использую смесь float и overflow-x: hidden. Минимальный код, всегда работает.

https://jsfiddle.net/9934sc4d/4/ - ПЛЮС вам не нужно очищать ваш поплавок!

.left-half{
    width:200px;
    float:left;
}
.right-half{
    overflow-x:hidden;
}

1
Полезно, когда вы знаете высоту элемента div и знаете, что содержимое не длиннее этой высоты. Однако, когда содержимого больше, чем высота div, оно скрыто из-за переполнения ...
Martijn

1
Это действительно лучше :)
Мартейн

1
Ницца! приятно видеть людей, которые поддерживают полезные и положительные отзывы, а не неконструктивные отрицательные отзывы. Хороший человек @Martijn
Тони Рэй Тэнсли

Спасибо тебе за это. Я делаю большую часть своей работы с пользовательским интерфейсом в React Native, а flex box там работает намного лучше, чем в HTML + CSS (на мой взгляд). Это сделало мою жизнь намного проще.
Эрик Винер

2

Как все отметили, вы сделаете это, установив для float:right;RHS контент и отрицательный запас для LHS.

Однако ... если вы не используете a float: left;на LHS (как это делает Mohit), то вы получите шаговый эффект, потому что div LHS по-прежнему будет занимать пространство на полях в макете.

Однако ... с плавающей точкой LHS будет сжато содержимое, поэтому вам нужно будет вставить дочерний узел определенной ширины, если это не приемлемо, и в этот момент вы также можете определить ширину родительского элемента.

Однако ... как указывает Дэвид, вы можете изменить порядок чтения разметки, чтобы избежать требования с плавающей запятой LHS, но это имеет проблемы с читабельностью и, возможно, с доступностью.

Однако .. эта проблема может быть решена с помощью поплавков с некоторой дополнительной разметкой

(предостережение: я не одобряю .clearing div в этом примере, подробности см. здесь )

Учитывая все обстоятельства, я думаю, что большинство из нас хотели бы, чтобы была не жадная ширина: оставаясь в CSS3 ...


2

Это не будет ответом для всех, так как он не поддерживается в IE7-, но вы можете использовать его, а затем использовать альтернативный ответ для IE7-. Это display: table, display: table-row и display: table-cell. Обратите внимание, что это не использование таблиц для разметки, а стилизация div, чтобы все выровнялось без лишних хлопот сверху. У меня приложение html5, поэтому оно отлично работает.

Эта статья показывает пример: http://www.sitepoint.com/table-based-layout-is-the-next-big-thing/

Вот как будет выглядеть ваша таблица стилей:

 .container {
    display: table;
    width:100%;
 }

 .left-column {
    display: table-cell;
 }

 .right-column {
    display: table-cell;
    width: 200px;
 }

-1

Перефразируя один из моих сайтов, который делает нечто подобное:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
 <head>
  <style TYPE="text/css"><!--

.section {
    _float: right; 
    margin-right: 210px;
    _margin-right: 10px;
    _width: expression( (document.body.clientWidth - 250) + "px");
}

.navbar {
    margin: 10px 0;
    float: right;
    width: 200px;
    padding: 9pt 0;
}

  --></style>
 </head>
 <body>
  <div class="navbar">
  This will take up the right hand side
  </div>
  <div class="section">
  This will fill go to the left of the "navbar" div
  </div>
 </body>
</html>

4
Не я, но я предполагаю, что CSS-хаки, переходный тип документа или отсутствие объяснения?
Annakata

По крайней мере, у него был тип документа :) Я думаю, это могут быть люди, которым не нравятся взломы браузера из-за полей в IE. По крайней мере, я проверил это ...
Роуланд Шоу

Это слишком глупо. Есть множество решений, которые намного более кратки.
Джон Белл

@JohnBell Может быть, это проблема времени - это было разумное решение в то время (более 8 лет назад), но с тех пор технология браузеров пошла дальше. Чудесно, но некоторые другие современные ответы, которые дают мне ту же идею, набрали больше очков (например, у Дэвида, через две минуты после моей)
Роуланд Шоу

-7

просто используйте z-index и все будет хорошо. убедитесь, что позиции помечены как фиксированные или абсолютные. тогда ничто не будет двигаться, как с тегом float.

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