2013-02-21 5 views
0

Я пытаюсь реализовать вертикальный список элементов, которые обертывают их при переполнении и приводят к горизонтальному прокручиваемому списку. Я хочу использовать flexbox для достижения этого.Поведение Mozilla flexbox, отличное от webkit, и т. Д.

Webkit и IE выдают ожидаемый результат. Не так. Пожалуйста, смотрите этот пример:

JSFIDDLE Sample

<div class="listbox flex-direction-vertical flex-wrap"> 
    <div class="listitem"><div class="tablediv"><table><tr><td><div class="content">content</div></td></tr></table></div></div> 
    <div class="listitem"><div class="tablediv"><table><tr><td><div class="content">content</div></td></tr></table></div></div> 
    <div class="listitem"><div class="tablediv"><table><tr><td><div class="content">content</div></td></tr></table></div></div> 
    <div class="listitem"><div class="tablediv"><table><tr><td><div class="content">content</div></td></tr></table></div></div> 
    <div class="listitem"><div class="tablediv"><table><tr><td><div class="content">content</div></td></tr></table></div></div> 
    <div class="listitem"><div class="tablediv"><table><tr><td><div class="content">content</div></td></tr></table></div></div> 
    <div class="listitem"><div class="tablediv"><table><tr><td><div class="content">content</div></td></tr></table></div></div> 
    <div class="listitem"><div class="tablediv"><table><tr><td><div class="content">content</div></td></tr></table></div></div> 
    <div class="listitem"><div class="tablediv"><table><tr><td><div class="content">content</div></td></tr></table></div></div> 
    <div class="listitem"><div class="tablediv"><table><tr><td><div class="content">content</div></td></tr></table></div></div> 
    <div class="listitem"><div class="tablediv"><table><tr><td><div class="content">content</div></td></tr></table></div></div> 
    <div class="listitem"><div class="tablediv"><table><tr><td><div class="content">content</div></td></tr></table></div></div> 
    <div class="listitem"><div class="tablediv"><table><tr><td><div class="content">content</div></td></tr></table></div></div> 
    <div class="listitem"><div class="tablediv"><table><tr><td><div class="content">content</div></td></tr></table></div></div> 
    <div class="listitem"><div class="tablediv"><table><tr><td><div class="content">content</div></td></tr></table></div></div> 
    <div class="listitem"><div class="tablediv"><table><tr><td><div class="content">content</div></td></tr></table></div></div> 
    <div class="listitem"><div class="tablediv"><table><tr><td><div class="content">content</div></td></tr></table></div></div> 
    <div class="listitem"><div class="tablediv"><table><tr><td><div class="content">content</div></td></tr></table></div></div> 
    <div class="listitem"><div class="tablediv"><table><tr><td><div class="content">content</div></td></tr></table></div></div> 
    <div class="listitem"><div class="tablediv"><table><tr><td><div class="content">content</div></td></tr></table></div></div> 
    <div class="listitem"><div class="tablediv"><table><tr><td><div class="content">content</div></td></tr></table></div></div> 
    <div class="listitem"><div class="tablediv"><table><tr><td><div class="content">content</div></td></tr></table></div></div> 
    <div class="listitem"><div class="tablediv"><table><tr><td><div class="content">content</div></td></tr></table></div></div> 
    <div class="listitem"><div class="tablediv"><table><tr><td><div class="content">content</div></td></tr></table></div></div> 
    <div class="listitem"><div class="tablediv"><table><tr><td><div class="content">content</div></td></tr></table></div></div> 
    <div class="listitem"><div class="tablediv"><table><tr><td><div class="content">content</div></td></tr></table></div></div> 
    </div> 

BODY 
{ 
    counter-reset: listitem; /* Create an item counter scope */ 
} 
.content:before { 
    content: "item " counter(listitem) ". "; 
    counter-increment: listitem; /* Add 1 to listitem */ 
} 
.listbox 
{ 
    height: 400px; 
    width:600px; 
    background-color:lightgray; 
    overflow:auto; 

    /* old syntax */ 
    display: -webkit-box; 
    display: -moz-box; 

    /* new syntax */ 
    display: -webkit-flex; 
    display: -moz-flex; 
    display: -moz-flexbox; 
    display: -o-flex; 
    display: -ms-flex; 
    display: -ms-flexbox; 
    display: flexbox; 
    display: flex; 
} 
.flex-direction-vertical 
{ 
    /* old syntax */ 
    -webkit-box-orient: vertical; 
    -moz-box-orient: vertical; 
    -moz-box-align:start; 
    -moz-box-pack:start; 

    /* new syntax */ 
    -webkit-flex-direction:column; 
    -moz-flex-direction:column; 
    -o-flex-direction:column; 
    -ms-flex-direction:column; 
    flex-direction:column; 

} 
.flex-wrap 
{ 
    /* old syntax */ 
    -webkit-box-wrap: wrap; 
    -moz-box-wrap: wrap; 

    /* new syntax */ 
    -webkit-flex-wrap:wrap; 
    -moz-flex-wrap:wrap; 
    -o-flex-wrap:wrap; 
    -ms-flex-wrap:wrap; 
    flex-wrap:wrap; 
} 
.listitem 
{ 
    background-color:green; 
    border: 2px solid red; 
    height:100px; 
    width:200px; 
} 
.content 
{ 
    background-color:gray; 
} 

Пожалуйста, помогите мне найти решение для Firefox.

Спасибо заранее Alex

+0

Было бы неплохо заказать вашу недвижимость в порядке возрастания старой версии (вставка -> flexbox -> flex). Кроме того, IE следует за спецификацией, использующей '-ms-flexbox' в качестве свойства отображения, тогда как более старый FF использует' -moz-box', а Opera никогда не использовала префиксы, поэтому у вас есть немало свойств, которые вы не используете необходимость. – cimmanon

+0

Спасибо за этот подсказку! Полезно знать! –

ответ

1

Если вы смотрите на Firefox до версии 20, то вам повезло. Эти FF следуют спецификациям с 2009 года, а свойство, которое контролирует упаковку, называется box-lines (single | multiple). Единственная проблема заключается в том, что они никогда не реализовывали его: https://bugzilla.mozilla.org/show_bug.cgi?id=562073

Хорошей новостью является то, что начиная с версии 20, FF будет следовать спецификации сентября 2012 года. Я не следил за их прогрессом, но caniuse отмечает его как полностью «поддерживаемую» в этих версиях, а не просто «частично поддерживаемую».

+0

Спасибо, я пробовал это на ночной версии Firefox, такое же поведение. Знаете ли вы еще один подход к реализации вертикального упакованного списка, который работает с перекрестным браузером? Я уже пытался использовать многоколоночную функцию, но в итоге у меня была проблема с прокруткой в ​​браузерах webkit. [link] (http://stackoverflow.com/questions/14984085/css-column-layout-using-position-relative-breaks-scrolling-on-chrome-and-safari) –

+0

Я собирался предложить использовать 'columns' , но это неудачная ошибка. Единственное, что я могу порекомендовать, это пойти либо с помощью flexbox, либо с помощью столбцов, а не для префиксов для нарушителя браузера. Ваши элементы имеют фиксированный размер, поэтому вы можете просто поплавать или использовать встроенный блок в качестве резервной копии. – cimmanon

+0

Ooh фиксированный размер был только для демонстрации. Я думаю о том, чтобы реализовать размещение предметов самостоятельно, делая их абсолютными позициями. Это будет иметь много преимуществ. Единственное, что можно изменить размер при загрузке внутреннего изображения и т. Д. Есть ли способ получить информацию о изменениях размера или это единственный способ сравнить значения каждые 1 мс, как это делает jquery mutate? Это может стать очень дорогостоящим. Особенно на мобильных устройствах, или? –

Смежные вопросы