Разделить Div на 2 столбца с помощью CSS

91

Я пытался разделить div на два столбца с помощью CSS, но мне еще не удалось заставить его работать. Моя основная структура следующая:

<div id="content">
  <div id="left">
     <div id="object1"></div>
     <div id="object2"></div>
  </div>

  <div id="right">
     <div id="object3"></div>
     <div id="object4"></div>
  </div>
</div>

Если я попытаюсь переместить правый и левый div в их соответствующие позиции (правый и левый), он, похоже, проигнорирует цвет фона содержимого div. И другой код, который я пробовал с разных веб-сайтов, похоже, не может быть переведен в мою структуру.

Спасибо за любую помощь!

PF1
источник
2
Существует так много решений, что вы можете это увидеть: stackoverflow.com/questions/211383/…
enmaai

Ответы:

61

Когда вы размещаете эти два div с плавающей запятой, div содержимого сворачивается до нулевой высоты. Просто добавь

<br style="clear:both;"/>

после div #right, но внутри div содержимого. Это заставит div содержимого окружать два внутренних плавающих div.

Роб Ван Дам
источник
17
Жаль, что за это так много раз голосовали. Вам действительно следует избегать посторонней разметки, особенно с учетом того, что есть другие жизнеспособные, широко используемые средства.
Jbird
91

Мне это нравится. Я разделил экран на две половины: 20% и 80%:

<div style="width: 20%; float:left">
   #left content in here
</div>

<div style="width: 80%; float:right">
   #right content in there
</div>
Navish
источник
4
Если это все, что вы делаете, родительский элемент этих элементов не будет иметь высоты.
tybro0103
Легко и эффективно. Спасибо!
Алексис Гамарра,
47

Другой способ сделать это - добавить overflow:hidden;к родительскому элементу плавающие элементы.

overflow: hidden заставит элемент увеличиваться до размера плавающих элементов.

Таким образом, все это можно сделать в css, а не добавлять еще один элемент html.

tybro0103
источник
1
Я бы посоветовал читателям ознакомиться с моим другим ответом. Я думаю, это на самом деле лучше, чем этот.
tybro0103
1
еще одно замечание: overflow:auto;иногда может быть лучшим вариантом
tybro0103
Это определенно эффективное средство. Однако стоит упомянуть, что это может создать некоторые очевидные проблемы с компоновкой. Например, если я хочу, чтобы было видно переполнение родительского элемента.
Jbird
16

Самый гибкий способ сделать это:

#content::after {
  display:block;
  content:"";
  clear:both;
}

Это действует точно так же, как добавление элемента к #content:

<br style="clear:both;"/>

но без фактического добавления элемента. :: after называется псевдоэлементом. Единственная причина, по которой это лучше, чем добавление overflow:hidden;в #content, заключается в том, что у вас может быть переполнение абсолютных позиционированных дочерних элементов и при этом они будут видны. Кроме того, это позволит видеть тени блока.

tybro0103
источник
Также отличное решение, но здесь стоит упомянуть, что это не работает в IE8. Мне действительно больно говорить это, и я прошу прощения за то, что был «этим парнем».
Jbird
@Jbird try #content:after(только одно двоеточие вместо двух) ... Если я правильно помню, правильнее использовать два двоеточия для псевдоэлементов, но старые IE распознают его, только если он есть. ... или что-то в этом роде - я уже давно не занимался этой проблемой.
tybro0103
13

Ни один из представленных ответов не отвечает на исходный вопрос.

Вопрос в том, как разделить div на 2 столбца с помощью css.

Все приведенные выше ответы фактически включают 2 div в один div, чтобы имитировать 2 столбца. Это плохая идея, потому что вы не сможете перемещать контент в 2 столбца каким-либо динамическим образом.

Итак, вместо приведенного выше используйте один div, который определен как содержащий 2 столбца с использованием CSS следующим образом ...

.two-column-div {
 column-count: 2;
}

назначьте указанное выше как класс для div, и он фактически перенесет его содержимое в 2 столбца. Вы можете пойти дальше и определить промежутки между полями. В зависимости от содержимого div вам может потребоваться изменить значения разрывов слов, чтобы ваш контент не разбивался между столбцами.

Родни П. Барбати
источник
9

По какой-то причине мне никогда не нравились подходы к очистке, я полагаюсь на поплавки и процентную ширину для таких вещей.

Вот что работает в простых случаях:

#content { 
  overflow:auto; 
  width: 600px; 
  background: gray; 
} 

#left, #right { 
  width: 40%; 
  margin:5px; 
  padding: 1em; 
  background: white; 
} 

#left  { float:left;  }
#right { float:right; } 

Если вы добавите контент, вы увидите, что он работает:

<div id="content">
  <div id="left">
     <div id="object1">some stuff</div>
     <div id="object2">some more stuff</div>
  </div>

  <div id="right">
     <div id="object3">unas cosas</div>
     <div id="object4">mas cosas para ti</div>
  </div>
</div>

Вы можете увидеть это здесь: http://cssdesk.com/d64uy


источник
8

Создайте дочерние div, inline-blockи они будут располагаться бок о бок:

#content {
   width: 500px;
   height: 500px;
}

#left, #right {
    display: inline-block;
    width: 45%;
    height: 100%;
}

См. Демонстрацию

Ориол
источник
Я также предпочитаю этот метод плаванию. Иногда нужно установить: vertical-align: top; (или внизу и т. д.) как для левого, так и для правого элементов, если они разного размера.
Джеймс
4

Я знаю, что этот пост старый, но если кто-то из вас все еще ищет более простое решение.

#container .left,
#container .right {
    display: inline-block;
}

#container .left {
    width: 20%;
    float: left;
}
#container .right {
    width: 80%;
    float: right;
}
Декстер
источник
3

Лучший способ разделить div по вертикали -

#parent {
    margin: 0;
    width: 100%;
}
.left {
    float: left;
    width: 60%;
}
.right {
    overflow: hidden;
    width: 40%;
}
УберНео
источник
3

Вы можете использовать flexbox для управления компоновкой вашего элемента div:

* { box-sizing: border-box; }

#content {
  background-color: rgba(210, 210, 210, 0.5);
  border: 1px solid #000;
  padding: 0.5rem;
  display: flex;
}

#left,
#right {
  background-color: rgba(10, 10, 10, 0.5);
  border: 1px solid #fff;
  padding: 0.5rem;
  flex-grow: 1;
  color: #fff;
}
<div id="content">
  <div id="left">
     <div id="object1">lorem ipsum</div>
     <div id="object2">dolor site amet</div>
  </div>

  <div id="right">
     <div id="object3">lorem ipsum</div>
     <div id="object4">dolor site amet</div>
  </div>
</div>

Мохаммад Усман
источник
1
Из миллиона подобных попыток я обнаружил, что это сработало (пока) наилучшим образом. Все остальное, что я нашел (и попробовал), позволяет содержимому переполняться . Спасибо.
user12379095
1

Поплавки не влияют на поток. Я обычно добавляю

<p class="extro" style="clear: both">possibly some content</p>

в конце «упаковывающего div» (в данном случае - содержимого). Я могу обосновать это семантическим основанием, сказав, что такой абзац может понадобиться. Другой подход - использовать CSS clearfix:

#content:after {
  content: ".";
  display: block;
  height: 0;
  clear: both;
  visibility: hidden;
}

#content {
  display: inline-block;
}
/*  \*/
* html #content {
  height: 1%;
}

#content {
  display: block;
}
/*  */

Уловка с комментариями предназначена для кросс-браузерной совместимости.

Газзер
источник
0

На это лучше всего ответить здесь Вопрос 211383

В наши дни любой уважающий себя человек должен использовать заявленный подход «micro-clearfix» очистки поплавков.

Jbird
источник
0
  1. Сделайте размер шрифта равным нулю в родительском DIV.
  2. Установите% ширины для каждого дочернего DIV.

    #content {
        font-size: 0;
    }
    
    #content > div {
        font-size: 16px;
        width: 50%;
    }
    

* В Safari вам может потребоваться установить 49%, чтобы он работал.

Береж
источник
Хотя этот фрагмент кода может решить вопрос, включение объяснения действительно помогает улучшить качество вашего сообщения. Помните, что вы отвечаете на вопрос читателей в будущем, и эти люди могут не знать причины вашего предложения кода.
msrd0
0

Разделить разделение на два столбца очень просто, просто укажите ширину столбца лучше, если вы поместите это (например, ширина: 50%) и установите float: left для левого столбца и float: right для правого столбца.

Рашид Джорви
источник
Пожалуйста, добавьте дополнительную информацию с соответствующими тегами.
Аман Гарг
надеюсь, что этот код поможет вам лучше понять это; @AmanGarg CSS: #column { overflow:auto; width: 100%; } #column50pleft, #column50pright{ width: 49%; margin:2px; padding: 0.5%; background: white; } #column50pleft { float:left; } #column50pright { float:right; } HTML: <div id="column"> <div id="column50pleft"> </div> <div id="column50pright"> </div> </div>
Rashid Jorvee