2015-01-26 4 views
1

У меня динамический макет с колонками, где количество столбцов зависит от ширины окна.css column layout issue

Использование изображения в качестве примера у меня есть поля содержимого, которые пользователь может свернуть. Если бы экран был достаточно широким, было бы 3 колонки.

Теперь, имея меньшее окно, есть только 2 столбца, но когда верхний левый флажок рухнут, поле внизу не следует вверх.

Я пробовал использовать CSS-счетчик CSS, но не могу заставить его работать. В конкретных примерах, если у меня есть счетчик столбцов 2, он помещает 2 поля в правый столбец вместо левого.

Мой пример CSS:

#content{ 
width:100%;; 
height:100%; 
display:inline-block; 
} 
#content div{ 
    border-color:black; 
    border-style:solid; 
    border-width:2px; 
    display:inline-block; 
    width:300px; 

    vertical-align:top; 
} 
#box1{ 
    height:50px; 
} 
#box2{ 
    height:100px; 
} 
#box3{ 
    height:30px; 
} 

Вот простой jsfiddle того, как я пытаюсь это сделать.

http://jsfiddle.net/5cn6ya75/

enter image description here

Есть ли какие-либо CSS свойства элемента HTML структур, что делает это возможным. Пока единственные решения, которые я могу найти, либо требуют, чтобы я имел фиксированное количество столбцов, либо фиксированную высоту в блоках содержимого.

EDIT: В моем поиске ответа я столкнулся с shapeshifter, который, похоже, способен исправить мою проблему, но используя абсолютную позицию, а затем вычисляет смещение к другому элементу. Я по-прежнему очень заинтересован в более чистом CSS-способе создания динамической раскладки x-столбца с переменными размерами-контейнерами (с возможностью разворачивания), где элементы выравнивают верхнюю часть к ближайшему элементу в их столбце.

+0

Я нашел ваш вопрос запутанным и не очень хорошо объяснил, но Im угадывая вас означает, что вы хотите который падает до следующей строки, чтобы сидеть прямо под первым полем? Если так, это невозможно сделать только с помощью CSS. [Масонство] (http://masonry.desandro.com/) будет вашим лучшим вариантом, я использовал его раньше для этого типа вещей, и это здорово. – Ruddy

ответ

0

Ваша проблема заключается в том, что display: inline-block превращает каждый элемент в «строку» в блок с той же высотой, что и наибольший в строке.

Ваши лучшие варианты здесь - либо установить максимальную высоту на div #content, чтобы все они были равны, либо использовать медиа-запросы для отображения другой сетки в зависимости от размера экрана.

+0

было бы выполнимо, если бы элементы отображали: inline; или что-то другое? – KristianMedK

+1

В настоящее время нет автоматизированного способа создания такой сетки с помощью общих правил CSS. Я бы рекомендовал добавить что-то вроде этого: '@media (max-width: 600px) {# box3 {margin-top: -70px;}' Изменение точки останова в соответствии с вашим дизайном. Вы также можете использовать [masonry] (http://masonry.desandro.com/), библиотеку jQuery, которая охватывает то, что вы хотите сделать. – Callum

+0

установка фиксированного края поля никогда не будет работать, поскольку ящик должен быть скомпенсирован –

1

Я бы рекомендовал вам использовать Masonry.
Его а JavaScript библиотека для каскадных макетов сетки типа yourse. Я использую его как jQuery Plugin, но вы также можете использовать его автономно.

Если вы измените размер главной страницы, вы можете увидеть, как это работает. Кроме того, у вас есть много Options, чтобы настроить его.


О Shapeshift:

Я did't знаю о Shapeshift, но мне кажется, что это будет делать свою работу, а также. Я думаю, что это слишком много накладные расходы, из-за Drag & Drop и т. Д.функции не нужны (и если вы не используете JQuery все равно, что приходит сверху)


"Simple" CSS:
Callums заявления прав. В CSS3 нет автоматического способа. Вы можете использовать запросы CSS-СМИ, чтобы установить Точки останова, но было бы очень трудной задачей найти правильные точки останова & Ценности (я не думаю, что это стоит времени).


Как я уже сказал (и другие парни до слишком) нет никакого чистый и «хорошо» CSS решения и нет CSS энергосистемы еще как хорошо. Лучший способ - использовать библиотеку JavaScript (с JQuery или без нее).

+0

Мне действительно нужно перетащить, но это уже было реализовано (не мной), мне нужно было только «float top», потому что все остальное уже было реализовано , на данный момент shapeshift заменил существующее drag'n drop, и он работает, но мне кажется странным, что css не может достичь эффекта «float top». – KristianMedK

+0

Хорошо, это хорошо. У меня просто был тот же материал вокруг wenn. Я искал новый дизайн для своего веб-сайта. Мне было очень сложно найти хорошее решение, потому что, если вы действительно не хотите, чтобы это было так, вам нужен JavaScript. Было бы здорово расширить CSS3 с некоторыми функциями для дизайна столбцов. –

+0

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

7

Если я правильно понял вашу проблему, вы можете абсолютно сделать это без javascript, если вы ориентируетесь на современные браузеры. Как и в случае с наиболее сложными макетами, подходящим инструментом для задания является flexbox.

Так вот что я думаю, что вы пытаетесь сделать:

  • если видовой экран достаточно широк, выложите все ящики в колонках
  • если окна просмотра не достаточно широк, выложите коробки вертикально, упаковка, как много столбцов, необходимых

Если это правильно, суть того, что вам нужно, это

@media any and (max-width:[width]) { 
    #content { 
    display:flex; 
    flex-direction: column; 
    flex-wrap:wrap; 
    } 
} 

Вам не обязательно нужны правила на ребенка коробки, но вы можете манипулировать порядок, в котором они появляются, когда «рушится» другие коробки: например, следующие шаги #div1 к концу

#content div { 
    order:0; 
} 
#div1 { 
    order:1 !important; 
} 

Я обновил ваш fiddle с объявлением display:flex на #content и некоторыми явными размерами для детей; если вы играете с такими размерами, вы должны быть в состоянии понять, как это работает.

Возможно, вам потребуются дополнительные настройки, чтобы определить, расширяется ли дочерний элемент div s, чтобы заполнить все пространство и расстояние между столбцами.

+0

Интересно, я получу этот взгляд, когда я получу время. – KristianMedK

1

$(function() { 
 

 
    $('#container').masonry({ 
 
     itemSelector: '.item', 
 
     columnWidth: 70 
 
    }); 
 

 
});
.content{ 
 
width:100%;; 
 
height:100%; 
 
display:inline-block; 
 
} 
 
.content div{ 
 
    border-color:black; 
 
    border-style:solid; 
 
    border-width:2px; 
 
    display:inline-block; 
 
    width:300px; 
 
    vertical-align:top; 
 
    float: left; 
 
    margin: 5px; 
 
} 
 
#box1{ 
 
    height:50px; 
 
} 
 
#box2{ 
 
    height:100px; 
 
} 
 
#box3{ 
 
    height:30px; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<script src="http://masonry.desandro.com/masonry.pkgd.min.js"></script> 
 

 
<div id="container" class='content'> 
 
    <div class='item' id="box1"></div> 
 
    <div class='item' id="box2"></div> 
 
    <div class='item' id="box3"></div> 
 
</div>

попробовать. Живая Demo, Demo2

Html

<div id="container" class='content'> 
    <div class='item' id="box1"></div> 
    <div class='item' id="box2"></div> 
    <div class='item' id="box3"></div> 
</div> 

CSS

.content{ 
width:100%;; 
height:100%; 
display:inline-block; 
} 
.content div{ 
    border-color:black; 
    border-style:solid; 
    border-width:2px; 
    display:inline-block; 
    width:300px; 
    vertical-align:top; 
    float: left; 
    margin: 5px; 
} 
#box1{ 
    height:50px; 
} 
#box2{ 
    height:100px; 
} 
#box3{ 
    height:30px; 
} 

JS

$(function() { 

    $('#container').masonry({ 
     itemSelector: '.item', 
     columnWidth: 70 
    }); 

}); 

и добавить

JS в голове

http://masonry.desandro.com/masonry.pkgd.min.js

+0

+1, но на будущее не забудьте добавить краткое, прямое объяснение того, что вы делаете/используете, вместо сырого кода со скрипкой. Вы можете (и должны) также включать скрипку во встроенный скрипт StackOverflow, нажав CTRL + M или кнопку фрагмента кода (прямо справа от кнопки изображения). Таким образом, если jsFiddle не работает, ваш код будет по-прежнему видимым в SO –

+0

Привет @ Andrea Ligios благодарит меня за Gide me ... теперь я добавляю фрагмент –

0

Я не очень понимаю, именно то, что вы после, но если вы установите ширину столбца фиксированной в любом случае вы можете попробовать медиазапросы как так (если вы плывете ваши дивы):

@media(max-width:927px){ 
#content{ 
    width: 608px; 
} 
#content #box2{ 
    float:right; 
} 
} 

http://jsfiddle.net/5cn6ya75/8/