У меня есть ситуация, когда мне нужно иметь возможность принимать divs и плавать их либо в левый столбец, либо в правый столбец на основе ввода пользователем. Таким образом, я не контролирую порядок divs в DOM, то есть может быть 2 divs float left, за которыми следуют 5 divs float right, а затем 10 divs float left и т.д.
здесь пример
HTML
<div class="left" style="background-color:#D8D8D8;">aa</div>
<div class="right" style="background-color:#C4BD97;">bb</div>
<div class="right" style="background-color:#8DB3E2;">dd</div>
<div class="right" style="background-color:#E5B9B7;">ee</div>
<div class="full" style="background-color:#D7E3BC;">ff</div>
<div class="right" style="background-color:#CCC1D9;">gg</div>
<div class="left" style="background-color:#FBD5B5;">cc</div>
<div class="right" style="background-color:#D8D8D8;">hh</div>
<div class="right" style="background-color:#C4BD97;">ii</div>
<div class="right" style="background-color:#8DB3E2;">kk</div>
<div class="left" style="background-color:#E5B9B7;">ll</div>
<div class="full" style="background-color:#D7E3BC;">mm</div>
<div class="right" style="background-color:#CCC1D9;">nn</div>
<div class="left" style="background-color:#FBD5B5;">jj</div>
CSS
.left {float:left;clear:left;}
.right {float:right;clear:right;}
.full {float:none;clear:both;}
Здесь скрипка: http://jsfiddle.net/nNL2V
В этом примере я хотел бы свернуть пробел между ll и cc, чтобы он появился прямо внизу. Решение должно поддерживать IE8 и выше.
Я также должен добавить, что я подумал о том, чтобы использовать подход с плавающим столбцом с левым и правым div, но в моем случае это не сработает из-за полных разделителей ширины, используя clear: оба перемежаются между плавающими разделами.
Можете ли вы назначить width
для .left
? Если это так, вы можете сделать следующее:
.left {
display: inline-block;
width:50%;
}
.right {float:right; clear: right;}
Я не уверен, как вы это сделаете с помощью чистого CSS, но вовлеченный JQuery был бы тривиальным. Это в основном перемещение DIV
в левые и правые плавающие контейнеры на основе их left
или right
класса.
Немного больше JQuery, и у вас есть столбцы, которые не подвержены тем же проблемам изменения размера, что и принятый ответ...
HTML
<div id="src">
<div class="left" style="background-color:#D8D8D8;">aa</div>
<div class="right" style="background-color:#C4BD97;">bb</div>
<div class="right" style="background-color:#8DB3E2;">dd</div>
<div class="right" style="background-color:#E5B9B7;">ee</div>
<div class="full" style="background-color:#D7E3BC;">ff</div>
<div class="right" style="background-color:#CCC1D9;">gg</div>
<div class="left" style="background-color:#FBD5B5;">cc</div>
<div class="right" style="background-color:#D8D8D8;">hh</div>
<div class="right" style="background-color:#C4BD97;">ii</div>
<div class="right" style="background-color:#8DB3E2;">kk</div>
<div class="left" style="background-color:#E5B9B7;">ll</div>
<div class="full" style="background-color:#D7E3BC;">mm</div>
<div class="right" style="background-color:#CCC1D9;">nn</div>
<div class="left" style="background-color:#FBD5B5;">jj</div>
</div>
<div style="clear:both;"></div>
<div id="dest"></div>
CSS
.left, .right { width:100%; }
.full { width:100%; clear:both; }
.leftCol { float:left; clear:left; width:50%; }
.rightCol { float:right; clear:right; width:50%; }
JS
var cleared = true;
var left;
var right;
$("#src>.left, #src>.right, #src>.full").each(function(){
var el = $(this);
if(el.hasClass("full")) {
cleared = true;
$("#dest").append(el);
} else {
if(cleared === true) {
left = $("<div class='leftCol'></div>");
right = $("<div class='rightCol'></div>");
$("#dest").append(left).append(right);
cleared = false;
}
if(el.hasClass("left")) {
left.append(el);
} else if(el.hasClass("right")) {
right.append(el);
}
}
});
FIDDLE
ll
вправо под cc
)