Как установить поля автоматической маркировки в гибкой ширине с использованием CSS?
У меня есть DIV с гибкой шириной, например. min-width: 800px и max-width: 1400px. В этом DIV имеется много ящиков с шириной затылка 200px и отображением: inline-block. Таким образом, в зависимости от родительской ширины DIV эти поля заполняют все пространство.
Моя проблема - пустое пространство с правой стороны, которое вызвано переменной шириной родительского div. Иногда это пустое пространство мало и выглядит отлично, но с разной шириной родительского div это пустое пространство почти 200px.
Я не знаю, если бы я описал свою проблему достаточно подробно, я надеюсь, что эта картина поможет описать мою реальную ситуацию:
![enter image description here]()
И это то, что я хотел бы иметь:
![enter image description here]()
Эта автоматическая маржа может быть легко достигнута с помощью TABLE. Тем не менее, я не знаю точное количество столбцов, так как это зависит от разрешения экрана пользователя. Поэтому я не могу использовать таблицу и придерживаться CSS.
У кого-нибудь есть идея, как это решить? Заранее благодарю за ваши комментарии и ответы.
EDIT: Мне не нужна поддержка IE6. Я хотел бы поддержать IE7, но IE7 является необязательным, поскольку я знаю, что существуют ограничения, поэтому я, вероятно, буду использовать фиксированную ширину "div.wrapper" в IE7
EDIT2 Мне нужно обработать несколько строк этих полей, чтобы они не превышали поле "div.wrapper" и правильно переносились в нескольких строках ящиков, а не только в одной длинной строке.
EDIT3 Я не знаю количество "столбцов", поскольку это очень переменная, в зависимости от разрешения экрана пользователя. Таким образом, на большом экране может быть 7 ящиков в одной строке, а на маленьких экранах может быть всего 4 коробки в одной строке. Поэтому мне нужно решение, которое не устанавливает фиксированное количество ящиков в одну строку. Вместо этого, когда поля не помещаются в одну строку, они должны просто переноситься в следующую строку.
Ответы
Ответ 1
Это как можно ближе к IE7-совместимому CSS: http://jsfiddle.net/thirtydot/79mFr/
Если это все еще не правильно, пришло время посмотреть на использование JavaScript и, надеюсь, также jQuery. Если вы правильно определяете свои требования, это должно быть тривиально, чтобы добиться этого с помощью JavaScript.
HTML:
<div id="container">
<div></div>
<div></div>
..
<span class="stretch"></span>
</div>
CSS
#container {
border: 2px dashed #444;
text-align: justify;
-ms-text-justify: distribute-all-lines;
text-justify: distribute-all-lines;
min-width: 800px;
max-width: 1400px
}
#container > div {
margin-top: 16px;
border: 1px dashed #f0f;
width: 200px;
height: 200px;
vertical-align: top;
display: inline-block;
*display: inline;
zoom: 1
}
.stretch {
width: 100%;
display: inline-block;
font-size: 0;
line-height: 0
}
Дополнительный span
(.stretch
) можно заменить на :after
.
Этот все еще работает во всех тех же браузерах, что и вышеупомянутое решение. :after
не работает в IE6/7, но они все равно используют distribute-all-lines
, поэтому это не имеет значения.
Смотрите: http://jsfiddle.net/thirtydot/79mFr/2/
Там есть незначительный недостаток :after
: чтобы последняя строка отлично работала в Safari, вы должны быть осторожны с пробелами в HTML.
В частности, это не работает:
<div id="container">
<div></div>
<div></div>
</div>
И это делает:
<div id="container">
<div></div>
<div></div></div>
Ответ 2
Вы можете их поплавать и просто применить обертку к .box
, которая позволит вам margin:auto;
.box
относительно плавающей оболочки.
CSS
div.wrapper {
width:100%;
border:3px solid red;
}
div.clear {
clear:both;
}
div.box-wrapper {
float:left;
margin:10px 0;
height:100px;
width:20%;
}
div.box {
border:1px solid black;
width:80px;
height:100px;
margin:auto;
}
HTML:
<div class="wrapper">
<div class="box-wrapper"><div class="box"></div></div>
<div class="box-wrapper"><div class="box"></div></div>
<div class="box-wrapper"><div class="box"></div></div>
<div class="box-wrapper"><div class="box"></div></div>
<div class="box-wrapper"><div class="box"></div></div>
<div class="box-wrapper"><div class="box"></div></div>
<div class="box-wrapper"><div class="box"></div></div>
<div class="box-wrapper"><div class="box"></div></div>
<div class="box-wrapper"><div class="box"></div></div>
<div class="box-wrapper"><div class="box"></div></div>
<div class="clear"></div>
</div>
Демо: http://jsfiddle.net/2avwf/
Я не делал их шириной 200 пикселей ради окна скрипки. Просто замените width:80px
на ширину, которую вы хотите.
Если вы хотите сделать это динамическим решением, в котором количество ячеек в строке будет отличаться от пользователя к пользователю, исходя из размера экрана и т.д., просто создайте классы обертки, определяющие ширину 3 или 4:
.box-wrapper-25 {
width:25%;
}
.box-wrapper-33 {
width:33%;
}
Затем с помощью JQuery вы можете легко определить ширину .wrapper
и назначить класс переопределения оболочкам:
$('.box-wrapper').each(function(){
$(this).removeClass().addClass('box-wrapper box-wrapper-25'); // only need 4 per row
});
Что-то вроде этого: http://jsfiddle.net/RcDky/
Ответ 3
Вам нужно сделать встроенные блоки .box
и обосновать текст в .wrapper
. .wraper:after
необходим для обоснования последней строки. Старые IE не понимают after
, но в IE text-align-last:center
позаботится о последней строке.
.wrapper{
text-align:justify;
max-width:1400px;
min-width:800px;
text-align-last:center;
}
.wrapper:after{
content:'';
display:inline-block;
width:100%;
height:0;
font-size:0;
line-height:0;
}
.box{
display:inline-block;
*display:inline;
vertical-align:top;
width:200px;
height:50px;
background:red;
}
Здесь jsfiddle.
Ответ 4
Попробуйте это jsFiddle: http://jsfiddle.net/MKuxm/
Просто сделайте окно больше и меньше размера div, вы увидите, что размер поля между красными квадратами будет соответствующим образом изменен. Я знаю, что красные ящики больше не ширины 200 пикселей, но я боюсь, что это невозможно с чистым css, потому что вы не должны смешивать процентную ширину и фиксированную ширину пикселя.
HTML
<div>
<span>TEXT</span>
<span>TEXT</span>
<span>TEXT</span>
<span>TEXT</span>
</div>
CSS
div {
width: 95%;
}
span {
float: left;
background: red;
width: 20%;
margin-left: 2.5%;
margin-right: 2.5%;
}
Ответ 5
Я ответил на аналогичный вопрос здесь
Это возможно в чистом css3 с помощью media queries
и подпрограммы css calc()
.
Грубо, это будет работать только на современных браузерах. IE9 +, Chrome, Firefox,
Смотрите РАБОЧИЙ ДЕМО
Основная идея состоит в том, чтобы настроить медиа-запрос для каждого состояния #columns, где я затем использую calc(), чтобы выработать margin-right для каждого из элементов (кроме тех, которые указаны в последнем столбце).
Ответ 6
В моем проекте я столкнулся с одной и той же проблемой, и я пришел к следующему решению - лучший способ для меня - пойти с js, в моем случае вы можете иметь количество элементов xxx внутри контейнера, если достаточно места в 1-й строке блок из 2-го ряда подходит к 1-й строке и так далее.
вот пример http://jsfiddle.net/gVAjN/11/
$(function() {
// Call function when DOM is ready
settingsAlignment();
$(window).resize(function() {
// Call function on window resize
settingsAlignment();
})
$('#new_div').click(function() {
box_number = $('.element').size();
box_add = box_number + 1;
$('.container').append($('<div class="element">Box'+ box_add + '</div>'))
settingsAlignment();
})
function settingsAlignment() {
// calculation of ul padding-left and li margin-right
var settingsUl = $('.container');
settingsLi = $('.element');
ul_width = settingsUl.outerWidth(true);
item_width = settingsLi.width();
min_gap = 7;
effective_item_width = item_width + min_gap;
items_in_row = Math.floor((ul_width - min_gap) / effective_item_width);
gaps_sum = ul_width - items_in_row * item_width;
new_gaps = gaps_sum / (items_in_row + 1);
item_margin = Math.floor(new_gaps);
row_width = (item_width + item_margin) * items_in_row - item_margin;
console.log(row_width + '= row_width');
console.log(ul_width + '= ul_width');
ul_left_padding = Math.ceil((ul_width - row_width) / 2);
console.log(ul_left_padding + '=ul_left_padding');
settingsUl.css('padding-left', ul_left_padding + 'px');
settingsLi.css('margin-right', item_margin + 'px');
console.log(settingsLi);
}
});
Ответ 7
довольно старый, но стоит попробовать с нескольких строк и выравнивания текста: justify; в #container создает пробелы, когда в последней строке меньше div. Я хотел, чтобы все было поплыто слева. Поэтому моя идея состояла в том, чтобы использовать 2 обертки.
<div class="wrapper">
<div class="wrapper2">
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="clear"></div>
</div>
</div>
а также переполнение: скрыто; в css
.wrapper {
width:620px;
border:3px solid red;
margin:0 auto; overflow:hidden;
}
.wrapper2 {
width:630px;
}
div.clear {
clear:both;
}
.box {
width:200px; background:#000; height:100px; margin-bottom:10px; float:left; overflow:hidden; margin-right:10px;
}
недостаток: поля не установлены автоматически...
DEMO: http://jsfiddle.net/hexagon13/2avwf/52/
Ответ 8
Попробуйте следующее:
div.wrapper {
display: flex;
align-items: stretch;
width: 100%;
height: 100%;
justify-content: space-between;
/* justify-content will give the auto margin you looking for
it will place the auto margin only between each div.box
make sure the div.wrapper has "display: flex;"
*/
}
div.box {
display: inline-flex; /* inline-flex will make the boxes all in the same line */
width: 200px; /* notice you don't need width to be a % for this to work */
height: 100%;
margin: auto; /* gives you the auto margin for the first and last box from the border of your wrapper */
}