Как создать плавающий список DIV в столбцах, а не в строках
У меня есть головоломка для макета HTML на моих руках. У меня большой алфавитный список, созданный моим PHP-приложением, и мне нужно вывести его на веб-страницу. Созданная разметка выглядит следующим образом:
<div class="list_item">A</div>
<div class="list_item">B</div>
<div class="list_item">C</div>
<div class="list_item">D</div>
<div class="list_item">E</div>
<div class="list_item">F</div>
<div class="list_item">G</div>
<div class="list_item">H</div>
...
Таблица стилей выглядит так:
.list_item {
margin: 5px;
padding: 5px;
border: 1px solid gray;
width: 200px;
float: left;
}
Результат:
![Rendered result]()
Как вы можете видеть, это не очень читаемо, я бы ожидал, что DIV будет выводиться в двух столбцах, поэтому первые столбцы будут содержать "A B C D", а второй - "E F G H".
Есть ли способ сделать это, не меняя разметки? Возможно, добавить другой класс, в четные и нечетные divs, но поскольку divs выводятся в цикле, theres никак не разделяет их по-разному.
См. демонстрацию: http://jsfiddle.net/KZcCM/
Примечание. Я уже решил его, разбив список на две части PHP, но я хочу знать, если здесь есть решение HTML/CSS.
Ответы
Ответ 1
В зависимости от того, какие браузеры вам необходимо поддерживать, вы можете использовать новое свойство CSS3 column-count
.
С простой отметкой списка
<ul>
<li>A</li>
<li>B</li>
<li>C</li>
<li>D</li>
</ul>
Используйте этот CSS:
ul {
-moz-column-count: 2;
-moz-column-gap: 20px;
-webkit-column-count: 2;
-webkit-column-gap: 20px;
column-count: 2;
column-gap: 20px;
}
Вот скрипка - хотя она еще не поддерживается ни в одной версии IE. Для поддержки более старых браузеров существуют решения jQuery, такие как Плагин JQuery для столбцов, который вы можете использовать, а также, или вместо решения CSS3,
Ответ 2
Используя вашу разметку, решение CSS3 будет выглядеть так:
HTML
<div id="wrap">
<div class="list_item">A</div>
<div class="list_item">B</div>
<div class="list_item">C</div>
<div class="list_item">D</div>
<div class="list_item">E</div>
<div class="list_item">F</div>
<div class="list_item">G</div>
<div class="list_item">H</div>
</div>
CSS
.list_item {
float: left;
margin: 5px;
padding: 5px;
width: 200px;
border: 1px solid gray;
}
#wrap {
width:460px;
column-count:2;
column-gap:20px;
-moz-column-count:2;
-moz-column-gap:20px;
-webkit-column-count:2;
-webkit-column-gap:20px;
}
С помощью этого метода вы получаете дополнительное преимущество от высоты столбцов, независимо от содержимого каждого внутреннего <div>
.
Если это явно не очевидно для всех префиксов для конкретного поставщика, поддержка браузера для этого ограничена современными браузерами (так, как мне это нравится), так что это не действительно готовый к выпуску код (если вы не хотите, чтобы он был острый).
Ответ 3
Я не могу думать о чистом решении CSS.
Ты сказал:
Примечание. Я уже решил это путем расщепления список в двух частях PHP, но я хотите знать, если есть HTML/CSS решение здесь.
Итак, у вас есть сила PHP. В этом случае я бы сохранил код, который у вас уже есть, но выводит элементы в другом порядке:
Смотрите: http://jsfiddle.net/xyLkz/
<div class="list_item">A</div>
<div class="list_item">E</div>
<div class="list_item">B</div>
<div class="list_item">F</div>
<div class="list_item">C</div>
<div class="list_item">G</div>
<div class="list_item">D</div>
<div class="list_item">H</div>
Насколько легко это будет зависеть от того, как структурируется ваш PHP.
Если у вас есть все в массиве, то в этом случае у вас будет только два цикла (один выводет нечетные элементы массива, другие четные). Если вам нужна поддержка столбцов n
, это тоже не проблема.
В чем проблема, если вы строите вывод "на лету" внутри цикла. В этом случае вам, вероятно, придется прибегнуть к буферизации вывода каждой итерации цикла в массив, а затем выполнить тот же процесс с двумя циклами.
Ответ 4
@серебро
Я стараюсь использовать его без использования дополнительной разметки, если он вам полезен
http://jsfiddle.net/sandeep/GGwPq/1/
Ответ 5
Вам не нужно использовать float для элементов, но, возможно, для поля, в котором находятся элементы, попробуйте следующее:
<div style="float: left; width: 200px;">
<div class="list_item">A</div>
<div class="list_item">B</div>
<div class="list_item">C</div>
<div class="list_item">D</div>
</div>
<div style="float: left; width: 200px;">
<div class="list_item">E</div>
<div class="list_item">F</div>
<div class="list_item">G</div>
<div class="list_item">H</div>
</div>
.list_item {
margin: 5px;
padding: 5px;
border: 1px solid gray;
width: 200px;
/*float: left;*/
}
Изменить: теперь с двумя столбцами:)