Я создаю HTML-макет для хобби человека. Человек может выбирать между 1-20 хобби, которые им нравятся. Я хочу показать их в строках с тремя столбцами. Есть ли способ сделать это с помощью div, чтобы мне не приходилось вычислять, когда вставлять новую строку? Например, если я использую таблицу, и пользователь выбирает 7 хобби, это выглядит так:
<tr><td>hobby 1</td><td>hobby 2</td><td>hobby3</td</tr>
<tr><td>hobby 4</td><td>hobby 5</td><td>hobby6</td</tr>
<tr><td>hobby 7</td><td></td><td></td</tr>
и я должен был бы знать, когда вставлять новую строку (на стороне сервера при получении данных). Это немного боль - я напечатал еще 3 столбца? ok, завершите строку и запустите новую.
Мне хотелось бы что-то вроде:
<div container>
<div>hobby 1</div>
<div>hobby 2</div>
<div>hobby 3</div>
<div>hobby 4</div>
<div>hobby 5</div>
<div>hobby 6</div>
<div>hobby 7</div>
</div>
где вывод выглядит следующим образом:
hobby1 hobby2 hobby3
hobby4 hobby5 hobby6
hobby7
Контейнер будет фиксированным размером (600 пикселей), а также каждой ячейкой (200 пикселей)
Учитывая контейнер. .table
width: 600px
, просто установите каждый дочерний div на width: 50%
и float: left
чтобы достичь желаемого эффекта.
HTML
<div class="table">
<div>hobby 1</div>
<div>hobby 2</div>
<div>hobby 3</div>
<div>hobby 4</div>
<div>hobby 5</div>
<div>hobby 6</div>
<div>hobby 7</div>
</div>
CSS
.table {
overflow: hidden; /** Contain floated elements **/
width: 600px;
}
.table div {
float: left;
width: 33%; /** Or, a fixed pixel width of 200px; **/
}
Рабочий пример [Обновлено 10/4]
ПРИМЕЧАНИЕ. Обновлено для отображения 3 столбцов вместо 2. Обновлен пример скрипта.
Я бы предложил использовать столбцы CSS:
<!-- note that I've used 'container' as an id, rather than just free floating
the string within the tag (which would make it an invalid attribute) -->
<div id="container">
<div>hobby 1</div>
<div>hobby 2</div>
<div>hobby 3</div>
<div>hobby 4</div>
<div>hobby 5</div>
<div>hobby 6</div>
<div>hobby 7</div>
</div>
С помощью CSS:
#container {
-moz-column-count: 3;
-ms-column-count: 3;
-o-column-count: 3;
-webkit-column-count: 3;
column-count: 3;
}
Очевидно, что это решение требует, чтобы браузер реализовал многоклассовый макетный модуль CSS, можно использовать CSS для проверки поддержки браузера для данной пары значений свойств CSS (хотя это имеет свои проблемы и еще менее хорошо поддерживается чем столбцы CSS, однако, если браузер поддерживает синтаксис @supports()
то есть довольно хороший шанс, что он также поддерживает столбцы:
/* defaults, to style if columns are not supported: */
#container {
}
#container div {
display: inline-block;
height: 1.5em;
line-height: 1.5em;
text-indent: 0.5em;
float: left;
width: 30%;
border: 1px solid #000;
margin: 0 0.5em 0.2em 0.5em;
}
/* testing for support for the given property-name and the property-value: */
@supports (-moz-column-count: 3) or (-ms-column-count: 3) or (-o-column-count: 3) or (-webkit-clumn-count: 3) or (column-count: 3) {
/* if the browser supports the property-name and property-value, the following styles are used, if the browser doesn't understand the syntax the rules are discarded */
#container {
-moz-column-count: 3;
-ms-column-count: 3;
-o-column-count: 3;
-webkit-column-count: 3;
column-count: 3;
}
#container div {
/* unset the 'if not supported' styling */
display: block;
float: none;
/* aesthetics, just because; adjust to taste */
width: 90%;
margin: 0 auto 0.5em auto;
}
}
Теперь, выше, я сказал, что @supports
имеет "свои проблемы"; процитировать Эрика Мейера:
Считается, что процессор CSS поддерживает объявление (состоящее из свойства и значения), если оно принимает это объявление (вместо того, чтобы отбрасывать его как ошибку синтаксического анализа). Если процессор не реализует, с приемлемым уровнем поддержки, заданное значение, то он не должен принимать декларацию или поддержку заявки.
Поэтому в этом первом предложении было сказано, что "поддержка" означает "принимает [а] декларацию" и не бросает ее на пол, как то, что она не распознает. Другими словами, если браузер анализирует пару property: value, то это считается "поддержкой" для указанной пары. Обратите внимание, что в этом предложении ничего не говорится о том, что происходит после разбора. В соответствии с этим браузер может иметь полностью запутанную, частичную и вообще непригодную реализацию пары property: value, но акт распознавания означает, что theres "поддерживает".
Ссылка: "Неспособные обещания", Эрик Мейер, доступ к: 2013-10-03, 23:43 (британское летнее время)
Несмотря на вышеизложенное, кажется, что он работает (в данном случае, проверен в Chromium 28 на Ubuntu 12.10), но, по-видимому, потенциально-хрупкий.
Рекомендации:
Как насчет чего-то вроде этого:
#hobby{
display:inline-block;
width: 197px;
max-width:197px;
height:200px;
max-height:200px;
margin:0px;
margin-top:2px;
overflow:hidden;
}