Разделить 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. И другой код, который я пробовал с разных веб-сайтов, похоже, не может быть переведен в мою структуру.

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


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>

4
Если это все, что вы делаете, родительский элемент этих элементов не будет иметь высоты.
tybro0103

Легко и эффективно. Спасибо!
Алексис Гамарра,

47

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

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

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


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

1
еще одно замечание: overflow:auto;иногда может быть лучшим вариантом
tybro0103

Это определенно эффективное средство. Однако стоит упомянуть, что это может создать некоторые очевидные проблемы с компоновкой. Например, если я хочу, чтобы было видно переполнение родительского элемента.
Jbird

16

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

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

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

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

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


Также отличное решение, но здесь стоит упомянуть, что это не работает в 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» очистки поплавков.


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