Сделать второй div сначала выше, без абсолютного положения или изменения html

Моя страница разбита на 3 среза, как показано в этом JFiddle.

В моем полном исходном коде у меня есть медиа-запросы, которые помогают управлять размером между мобильным и настольным компьютерами. Когда кто-то обращается к сайту в мобильном режиме, Логотип должен отображаться вверху, а ниже - Элементы. (Я установил display: none на мой снимок div, чтобы скрыть его)

Проблема:

Я не могу изменить расположение divs в HTML, иначе это нарушит мой текущий 3-срезовый макет. Абсолютное позиционирование не является вариантом, так как большая часть моего сайта уже имеет динамический размер, и я бы не хотел, чтобы абсолютное позиционирование мешало разрешению, на котором я не тестировал. Это означает, что вычисление размеров полей также не может быть и речи.

Таким образом, абсолютное позиционирование не допускается и не меняет порядок div. Результат, который я ищу, будет похож на this, исключение без изменения положения div.

Мой вопрос заключается не в медиа-запросах, а в том, как настроить размер для мобильных устройств, используя медиа-запросы. Я только спрашиваю о том, как получить макет, который я хочу, с ограничениями на месте (без абсолютного позиционирования, без расчетных полей, без изменения порядка div).

Другие вопросы, на которые я смотрел:

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

Перемещение первого Div появляется под вторым в CSS - Предлагает использовать абсолютное позиционирование, которое я не могу сделать

Ответы

Ответ 1

Flexbox макет - ваш друг здесь. display: flex можно использовать для изменения положения элементов на макете.

#container { display:flex; flex-direction: column; text-align:center;}
#items { order: 2 }
#logo { order: 1 }
#picture { display: none; }
<div id="container">
    <div id="items">Items</div>
    <div id="logo">Logo</div>
    <div id="picture">Picture</div>
</div>

Ответ 2

Я попытался решить решение, используя свойство transform: translateY в процентах.

Примечание. Это работает тогда и только тогда, когда два контейнера имеют одинаковую высоту. или если высота уже известна, вы можете установить значение transform: translateY в соответствии с высотой.

CSS

@media (max-width: 700px) {
    #container > div {
        width: auto;
        display: block;
        float: none;
    }
    #container #picture {
        display: none;
    }
    #logo {
        transform: translateY(-100%);
    }
    #items {
        transform: translateY(100%);
    }
}

Рабочий скрипт

Ответ 3

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

#container * {
    width: 95vw;
    text-align: center;
}

#items {
    width: 50%; /* #picture is hidden so we split the screen into 2 */
    float: left;
    margin-top:30px; /* has to be smaller than the absolute of #logo */
    margin-left:25%; /* half of the element width */
}

#logo {
    width: 50%; /* #picture is hidden so we split the screen into 2 */
    float: right;
    margin-top:-40px; /* its absolute has to be greater than the one of #items */
    margin-right:25%; /* half of the element width */
}

#picture {
    width: 33%;
    float: right;
    display:none; /* Hiding #picture as you said you would */
}
<div id="container">
    <div id="items">Items</div>
    <div id="logo">Logo</div>
    <div id="picture">Picture</div>
</div>