Изменение порядка div с помощью CSS в зависимости от ширины устройства

Я работаю над отзывчивым сайтом и сталкивался с интересной проблемой. У меня есть несколько divs бок о бок. Там может быть от 2 до 6 или около того. Когда экран недостаточно широк, чтобы отображать все содержимое правильно, стек divs вертикально. Достаточно просто сделать с CSS.

Проблема в том, что мне нужно, чтобы они были в другом порядке в зависимости от макета. Это легко сделать с 2 или 3 divs (Изменение порядка divs на основе ширины), но значительно сложнее, если вы добавите четвертый.

Я мог бы использовать position: absolute; и вручную установить позицию, однако это заставляет родителя сжиматься и не содержать их должным образом.

Чтобы сделать это еще более сложным, я не могу использовать JavaScript.

Работа с двумя столбцами:

(непроверенные)

HTML:

<div id="container">
    <div class="column-half column-half-2">
        First div on mobile, right div on desktop
    </div>
    <div class="column-half column-half-1">
        Second div on mobile, left div on desktop
    </div>
</div>

CSS

.container {
    width: 80%;
    max-width: 1200px;
    margin: 0 auto;
    padding-bottom: 20px;
    position: relative;
}
.column-half {
    display: table-cell;
    padding: 25px;
    vertical-align: top;
    width: 40%;
}
.column-half-1 {
    float: left;
}
.column-half-2 {
    float: right;
}

HTML, с 4 столбцами:

<div id="container">
    <div class="column-quarter column-quarter-3">
        First div on mobile, third div on desktop
    </div>
    <div class="column-quarter column-quarter-2">
        Second div on mobile, second div on desktop
    </div>
    <div class="column-quarter column-quarter-1">
        Third div on mobile, first div on desktop
    </div>
    <div class="column-quarter column-quarter-4">
        Fourth div on mobile, fourth div on desktop
    </div>
</div>

Ответы

Ответ 1

Это можно сделать в CSS благодаря замечательной flexbox spec. Используя order и flex-flow свойства, мы можем достичь того, чего вы хотите. Unprefixed, IE11 и все вечнозеленые браузеры будут поддерживать это. IE10 префиксы -ms-order и не поддерживает flex-flow.

В решении учитываются все перечисленные ограничения:

  • Содержит список элементов в заданном порядке, отображаемых в виде строки.
  • Когда окно слишком маленькое, измените его на отображение в столбце.
  • Измените порядок элементов, когда они отображаются в столбце.

Из-за ограничений фрагментов стека вам необходимо просмотреть демо в полноэкранном режиме и изменить размер вашего браузера, чтобы увидеть эффект.

.container div {
    width: 100px;
    height: 50px;
    display: inline-block;
}

.one { background: red; }
.two { background: orange; }
.three { background: yellow; }
.four { background: green; }
.five { background: blue; }

@media screen and (max-width: 531px) {
    .container { display: flex; flex-flow: column; }
    .five { order: 1; }
    .four { order: 2;  }
    .three { order: 3; }
    .two { order: 4; }
    .one { order: 5 }
}
<div class="container">
    <div class="one">I'm first</div>
    <div class="two">I'm second</div>
    <div class="three">I'm third</div>
    <div class="four">I'm fourth</div>
    <div class="five">I'm fifth</div>
</div>