2014-12-09 2 views
15

Моя страница разделена на 3 части, как показано на рисунке JFiddle.Сделать второй div первым, без абсолютного положения или изменения html

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

Проблема:

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

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

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

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

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

Move The First Div Appear Under the Second One in CSS - Предлагает ли я использовать абсолютное позиционирование, что я не могу сделать

+0

Есть ли еще стили к тому, что влияние на макет три колонки? изменение порядка HTML не мешает мне со скрипкой, которую вы дали. http://jsfiddle.net/u5r2bmj5/ – mvuajua

+0

Трудно сказать, не видя ваш медиа-запрос CSS, но я склонен сказать, что вам нужно будет удалить поплавки. – EternalHour

+0

Вы пытаетесь сделать что-то подобное? [Fiddle] (http://jsfiddle.net/venkateshwar/Lqo7qher/6/) (_resize to check_) –

ответ

29

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>

display: flex работает только в современных браузерах. Проверьте caniuse.

Тест на моем мобильном телефоне Android показывает, что он работает на Firefox и Chrome, но не на Android-браузере.

+0

Извините, я не получил этого. почему мы не можем просто использовать 'display: block' здесь, не используя' flex'? –

+0

@Mr_Green - Потому что 'display: block' не допускает простого переупорядочения элементов. – Alohci

+0

Ahh Я получил это благодаря этому. +1 –

0

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

#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's 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's 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>

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%); 
    } 
} 

Working Fiddle

+0

Это хорошо работает, спасибо! – mdlars

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