Как установить поля автоматической маркировки в гибкой ширине с использованием 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 */
}