Если вариант css3, это можно сделать с помощью функции css calc()
.
Случай 1. Выравнивание полей в одной строке (FIDDLE)
Разметка проста - куча div с каким-то контейнерным элементом.
CSS выглядит так:
div
{
height: 100px;
float: left;
background:pink;
width: 50px;
margin-right: calc((100% - 300px) / 5 - 1px);
}
div:last-child
{
margin-right:0;
}
где -1px, чтобы исправить ошибку IE9 + calc / округления - см. здесь а>
Случай 2. Выравнивание полей в нескольких строках (FIDDLE)
Здесь помимо функции calc()
необходимы media queries
.
Основная идея состоит в том, чтобы настроить медиа-запрос для каждого состояния #columns, где я затем использую calc () для определения margin-right для каждого из элементов (кроме тех, что в последнем столбце).
Это звучит как большая работа, но если вы используете LESS или SASS, это можно сделать довольно легко.
(Это все еще можно сделать с помощью обычного css, но тогда вам придется делать все вычисления вручную, а затем, если вы измените ширину своего поля - вам придется все снова проработать)
Ниже приведен пример использования LESS: (Вы можете скопировать / вставить этот код сюда, чтобы играть с ним [это также код, который я использовал для создания вышеупомянутой скрипки])
@min-margin: 15px;
@div-width: 150px;
@3divs: (@div-width * 3);
@4divs: (@div-width * 4);
@5divs: (@div-width * 5);
@6divs: (@div-width * 6);
@7divs: (@div-width * 7);
@3divs-width: (@3divs + @min-margin * 2);
@4divs-width: (@4divs + @min-margin * 3);
@5divs-width: (@5divs + @min-margin * 4);
@6divs-width: (@6divs + @min-margin * 5);
@7divs-width: (@7divs + @min-margin * 6);
*{margin:0;padding:0;}
.container
{
overflow: auto;
display: block;
min-width: @3divs-width;
}
.container > div
{
margin-bottom: 20px;
width: @div-width;
height: 100px;
background: blue;
float:left;
color: #fff;
text-align: center;
}
@media (max-width: @3divs-width) {
.container > div {
margin-right: @min-margin;
}
.container > div:nth-child(3n) {
margin-right: 0;
}
}
@media (min-width: @3divs-width) and (max-width: @4divs-width) {
.container > div {
margin-right: ~"calc((100% - @{3divs})/2 - 1px)";
}
.container > div:nth-child(3n) {
margin-right: 0;
}
}
@media (min-width: @4divs-width) and (max-width: @5divs-width) {
.container > div {
margin-right: ~"calc((100% - @{4divs})/3 - 1px)";
}
.container > div:nth-child(4n) {
margin-right: 0;
}
}
@media (min-width: @5divs-width) and (max-width: @6divs-width) {
.container > div {
margin-right: ~"calc((100% - @{5divs})/4 - 1px)";
}
.container > div:nth-child(5n) {
margin-right: 0;
}
}
@media (min-width: @6divs-width){
.container > div {
margin-right: ~"calc((100% - @{6divs})/5 - 1px)";
}
.container > div:nth-child(6n) {
margin-right: 0;
}
}
Итак, в первую очередь вам нужно определить ширину поля и минимальное расстояние между полями.
С его помощью вы можете определить, сколько места вам нужно для каждого состояния.
Затем используйте calc (), чтобы вычислить правое поле, и nth-child, чтобы удалить правое поле из полей в последнем столбце.
Преимущество этого ответа перед принятым ответом, в котором используется text-align:justify
, заключается в том, что, когда у вас есть более одной строки ящиков - ячейки в последней строке не получают «оправдание», например: Если есть 2 ящики, оставшиеся в последнем ряду - я не хочу, чтобы первая ячейка была слева, а следующая - справа, а чтобы ячейки следовали друг за другом по порядку.
Что касается поддержки браузера: это будет работать в IE9 +, Firefox, Chrome, Safari6.0 + - (см. здесь для более подробной информации) Однако я заметил, что в IE9 + есть небольшой сбой между состояниями медиа-запросов. [если кто-то знает, как это исправить, мне бы очень хотелось знать :)] ‹- ИСПРАВЛЕНО ЗДЕСЬ
person
Danield
schedule
30.04.2013
display:inline-block;
вместо float? - person ayyp   schedule 29.07.2011inline-block
наinline
элементах - person Lee Price   schedule 29.07.20114 DIVs all 300px x 250px
, и при этом вам нужна плавная ширина? Вы имеете в виду, что.box1
и.box4
имеют300px
ширину, а два среднихdiv
должны иметь плавную и одинаковую ширину? - person thirtydot   schedule 29.07.2011