CSS плавающие Divs в переменных высотах

У меня есть бесконечное количество divs ширины 100px, которое может вписаться в родительскую ширину 250px. Независимо от высоты, мне нужно, чтобы divs отображались в строках, как показано на изображении. Я пробовал разрешить это, но высота div, кажется, прикручивает его.

enter image description here

Я очень благодарен за вашу помощь. Спасибо:)

        <style>
            #holder{
            width:250px;
            border:1px dotted blue;
            display:inline-block;
        }
        .box{
            width:100px;
            height:150px;
            background-color:#CCC;
            float:left;
            text-align:center;
            font-size:45px;
            display:inline-block;
        }
        .one{
            background-color:#0F0;
            height:200px;
        }

        .two{
            background-color:#0FF;
        }

        .three{
            background-color:#00F;
        }

        .four{
            background-color:#FF0;
        }
    </style>

    <div id="holder">
        <div class="box one">1</div>
        <div class="box two">2</div>
        <div class="box three">3</div>
        <div class="box four">4</div>
    </div>

Вот jsfiddle

Вот что я сделал и добился с помощью javascript https://jsfiddle.net/8o0nwft9/

Ответ 1

Насколько я знаю, нет возможности исправить эту проблему чистым CSS (который работает во всех распространенных браузерах):

  • Поплавки не работают.
  • display: inline-block не работает.
  • position: relative с position: absolute требуется ручная настройка пикселей. Если вы используете серверный язык, и работаете с изображениями (или с прогнозируемой высотой), вы можете обрабатывать настройку пикселей "автоматически" с помощью кода на стороне сервера.

Вместо этого используйте jQuery масонство.

Ответ 2

в предположении, что ваши потребности больше похожи на ваш цветный пример кода:

.box:nth-child(odd){
    clear:both;
}

если это будет 3 строки, тогда nth-child(3n+1)

Ответ 3

Я предоставляю этот ответ, потому что даже когда есть хорошие, которые предоставляют решение (с использованием масонства) все еще не кристально ясно, почему это невозможно достичь, используя поплавки.

(это важно - # 1).

Элемент с плавающей точкой перемещается как можно дальше влево или вправо, так как он может в позиция, в которой она первоначально была

Итак, поставьте так:

У нас есть 2 div

<div class="div5">div5</div>
<div class="div6">div6</div>

.div-blue{
    width:100px;
    height:100px;
    background: blue;
}

.div-red{
    width:50px;
    height:50px;
    background: red;
}

без float они будут ниже других

enter image description here

Если float: right div5, div6 находится на линии, где div5 был,

/*the lines are just for illustrate*/

enter image description here

Итак, если теперь мы float: left div6, он будет перемещаться как можно дальше влево, как можно, " в этой строке" (см. # 1 выше), поэтому, если div5 изменит свою строку, div6 последует за ней.

Теперь добавим другой div в уравнение

<div class="div4">div4</div>
<div class="div5">div5</div>
<div class="div6">div6</div>

.div-gree{
    width:150px;
    height:150px;
    background: green;

    float:right;
}

Мы имеем это

enter image description here

Если мы установим clear: right в div5, мы вынудим его взять строку ниже div4

enter image description here

и div6 будут плавать в этой новой строке справа или слева.

Теперь позвольте использовать в качестве примера вопрос, который привел меня сюда из-за дублирования форсирования стека div слева направо

Вот фрагмент для его проверки:

div{
    width:24%;
    margin-right: 1%;
    float: left;
    margin-top:5px;
    color: #fff;
    font-size: 24px;
    text-align: center;
}

.one{
    background-color:red;
    height: 50px;
}

.two{
    background-color:green;
    height:40px;
}

.three{
    background-color:orange;
    height:55px;
}

.four{
    background-color:magenta;
    height:25px;
}

.five{
    background-color:black;
    height:55px;
}
<div class="one">1</div>
<div class="two">2</div>
<div class="three">3</div>
<div class="four">4</div>
<div class="five">5</div>

<div class="one">1*</div>
<div class="three">2*</div>
<div class="four">3*</div>
<div class="two">4*</div>
<div class="five">5*</div>

Ответ 4

Как было справедливо указано, это невозможно с помощью CSS только... к счастью, теперь я нашел решение в http://isotope.metafizzy.co/

Кажется, что проблема полностью решена.

Ответ 5

С небольшой помощью из этого комментария (CSS Block float left) Я понял ответ.

В каждой "строке", которую я создаю, я добавляю имя класса left.
На каждой другой "строке", которую я создаю, я добавляю имя класса right.

Затем я плаваю влево и плаваю вправо для каждого из этих имен классов!

Единственное осложнение заключается в том, что мой порядок содержимого изменяется на "правильные" строки, но это можно решить с помощью PHP.

Спасибо за помощь!

#holder{
  width:200px;
  border:1px dotted blue;
  display:inline-block;
}
.box{
  width:100px;
  height:150px;
  background-color:#CCC;
  float:left;
  text-align:center;
  font-size:45px;
}
.one{
  background-color:#0F0;
  height:200px;
}

.two{
  background-color:#0FF;
}

.three{
  background-color:#00F;
  float:right;
}

.four{
  background-color:#FF0;
  float:right;
}
.left{float:left;}
.right{float:right;}
<div id="holder">
  <div class="box one left">1</div>
  <div class="box two left">2</div>
  <div class="box four right">4</div>
  <div class="box three right">3</div>
</div>
</body>

Ответ 6

Благодаря тридцатилетнему опыту, я понял, что мой предыдущий ответ не помог решить проблему. Вот моя вторая попытка, которая использует JQuery как решение только для CSS, кажется невозможным:

<html>
    <head>
        <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js"></script>
        <script type="text/javascript" language="javascript">
            $(document).ready(function() {
                var numberOfColumns = 3;
                var numberOfColumnsPlusOne = numberOfColumns+1;
                var marginBottom = 10;  //Top and bottom margins added
                var kids = $('#holder:first-child').children();
                var add;
                $.each(kids, function(key, value) {
                    add = numberOfColumnsPlusOne+key;
                    if (add <= kids.length){
                        $('#holder:first-child :nth-child('+(numberOfColumnsPlusOne+key)+')').offset({ top: $('#holder:first-child :nth-child('+(key+1)+')').offset().top+$('#holder:first-child :nth-child('+(key+1)+')').height()+marginBottom });
                    }
                });
            });             
        </script>
        <style>
            #holder{
                width:270px;
                border:1px dotted blue;
                display:inline-block; /* Enables the holder to hold floated elements (look at dotted blue line with and without */
            }
            .box{
                width:80px;
                height:150px;
                background-color:#CCC;
                margin:5px;
                text-align:center;
                font-size:45px;
            }
            .one{
                height:86px;
            }
            .two{
                height:130px;
            }
            .three{
                height:60px;
            }
            .four{
                clear:both;
                height:107px;
            }
            .five{
                height:89px;
            }
            .six{
                height:89px;
            }
            .left{float:left;}
            .right{float:right;}
        </style>
    </head>
    <body>      
        <div id="holder">
            <div class="box one left">1</div>
            <div class="box two left">2</div>
            <div class="box three left">3</div>
            <div class="box four left">4</div>
            <div class="box five left">5</div>
            <div class="box six left">6</div>
        </div>
    </body>
</body>

Единственная проблема, которая остается для моего решения, заключается в том, что происходит, когда поле имеет ширину в два окна вместо одного. Я все еще работаю над этим решением. Я отправлю сообщение после завершения.

Ответ 7

Если кто-то все еще ищет альтернативы, вот один. Попробуйте использовать свойство ширины столбца (-moz -/- webkit-). Он заботится об изменении высоты переменной высоты. Однако ширина столбца добавляет новый div в конец столбца.

Else, jQuery Masonry работает лучше всего.

Ответ 8

Это может быть не точное решение для всех, но я считаю, что (в буквальном смысле) мышление вне коробки работает во многих случаях: вместо отображения полей слева направо, во многих случаях вы можете заполнить левый столбец сначала, чем перейдите в середину, заполните это ящиками и, наконец, заполните правый столбец коробками. Тогда ваше изображение будет выглядеть следующим образом:

порядок заполнения:

Если вы используете язык сценариев, например php, вы также можете заполнять столбцы слева направо, добавляя к нему новое поле и выводить, когда заполняются все столбцы. например (непроверенный php-код):

$col1 = '<div class="col1"> <div>box1</div>';
$col2 = '<div class="col2"> <div>box2</div>';
$col3 = '<div class="col3"> <div>box3</div>';
$col1 .= '<div>box4</div> </div>'; //last </div> closes the col1 div
$col2 .= '<div>box5</div> </div>';
$col3 .= '<div>box6</div> </div>';
echo $col1.$col2.$col3;

$col1, $col2 и $col3 могут иметь float: left и width: 33%, установить поля внутри div на полную ширину и не плавать.

Очевидно, что если вы используете javascript/jquery, чтобы динамически загружать ящики, вы также лучше ставите их так, как описано в других ответах на эту тему.

Ответ 9

чтобы отобразить, просто поместите этот css в свой div, а затем у вас есть нужный макет. нет необходимости в подключении или JS.

 .Your_Outer {
    background-color: #FFF;
    border: 1px solid #aaaaaa;
    float: none;
    display:inline-block;
    vertical-align:top;
    margin-left: 5px;
    margin-bottom: 5px;
    min-width: 152.5px;
    max-width: 152.5px;
}

вы можете отредактировать код в соответствии с вашими требованиями:)

Ответ 10

В современных браузерах вы можете просто:

display: inline-block;
vertical-align: top;