Поміняйте позицію DIV лише на CSS


78

Я намагаюся поміняти divмісця розташування двох s на адаптивний дизайн (сайт виглядає по-різному залежно від ширини браузера / добре для мобільних пристроїв).

Зараз у мене щось подібне:

<div id="first_div"></div>
<div id="second_div"></div>

Але чи можна було б поміняти місця розташування, щоб це здавалося second_divпершим, лише за допомогою CSS? HTML залишається незмінним. Я намагався використовувати поплавці та інше, але, здається, це працює не так, як я хочу. Я не хочу використовувати абсолютне позиціонування, оскільки висоти divs завжди змінюються. Чи є якісь рішення, або просто неможливо це зробити?


Вас турбує IE8? ( caniuse.com/#feat=css-mediaqueries ) Спробуйте медіа-запити.
Mooseman


Це те, що я зараз використовую для адаптивного дизайну, але у мене є нижній div, який повинен бути першим, коли це для мобільних пристроїв.
Dragonfly

1
Це залежить від того, як divрозкладено s на даний момент. Наприклад, рішення дуже просто, якщо воно first_divвже є float: leftі second_divє float: right- вам просто потрібно буде змінити floatнапрямки s. Інші макети було б важче виправити. Розкажіть нам про поточний макет.
Rory O'Kane

Щось дотримується цих елементів?
ScottS

Відповіді:


127

Хтось пов’язав мене так: Який найкращий спосіб перемістити елемент, що знаходиться зверху вниз, у адаптивному дизайні .

Рішення в цьому спрацювало ідеально. Хоча він не підтримує старий IE, це для мене не важливо, оскільки я використовую адаптивний дизайн для мобільних пристроїв. І це працює для більшості мобільних браузерів.

В основному, у мене було таке:

@media (max-width: 30em) {
  .container {
    display: -webkit-box;
    display: -moz-box;
    display: -ms-flexbox;
    display: -webkit-flex;
    display: flex;
    -webkit-box-orient: vertical;
    -moz-box-orient: vertical;
    -webkit-flex-direction: column;
    -ms-flex-direction: column;
    flex-direction: column;
    /* optional */
    -webkit-box-align: start;
    -moz-box-align: start;
    -ms-flex-align: start;
    -webkit-align-items: flex-start;
    align-items: flex-start;
  }

  .container .first_div {
    -webkit-box-ordinal-group: 2;
    -moz-box-ordinal-group: 2;
    -ms-flex-order: 2;
    -webkit-order: 2;
    order: 2;
  }

  .container .second_div {
    -webkit-box-ordinal-group: 1;
    -moz-box-ordinal-group: 1;
    -ms-flex-order: 1;
    -webkit-order: 1;
    order: 1;
  }
}

Це працювало краще, ніж плаваючі для мене, тому що мені потрібні були вони накладені один на одного, і я мав близько п'яти різних div, які мені довелося поміняти місцями.


4
Ось приклад того, як можна використовувати метод flexbox.
blimmer

Дякую за приклад. Я зміг редагувати його для досягнення своєї мети: jsfiddle.net/5rd9xwsc/73
Райан,

1
jsfiddle.net/5rd9xwsc/75 - ще кращий приклад того, що я намагався зробити, а саме: Зображення завжди чергуються з текстом, навіть коли ви змінюєте розмір вікна.
Райан,

1
Мені так подобається StackOverflow, і я зміг здійснити пошук своєї діяльності та знайти цю публікацію знову. Я оновив скрипку, оскільки jsfiddle.net/5rd9xwsc/82 ще ближче до того, що я хотів зробити (у WordPress).
Райан

Дуже приємне рішення!
Стефан

33

Це питання вже має чудову відповідь, але в дусі вивчення всіх можливостей тут є ще одна техніка для перестановки елементів дому, в той же час дозволяючи їм займати свій простір, на відміну від методу абсолютного позиціонування.

Цей метод працює у всіх сучасних браузерах та IE9 + (в основному в будь-якому браузері, що підтримує display: table), він має недолік, що його можна використовувати лише максимум на 3 братах і сестрах.

//the html    
<div class='container'>
    <div class='div1'>1</div>
    <div class='div2'>2</div>
    <div class='div3'>3</div>
</div>

//the css
.container {
   display:table;    
}
.div1 {
    display:table-footer-group;
}
.div2 {
    display:table-header-group;
}
.div3 {
    display:table-row-group;
}

Це змінить порядок елементів з 1,2,3 на 2,3,1. В основному все, що з дисплеєм, встановленим на table-header-group, буде розташоване вгорі, а table-footer-group внизу. Зазвичай таблиця-рядок-група ставить елемент посередині.

Цей метод швидкий, має хорошу підтримку і вимагає набагато менше css, ніж підхід flexbox, тому, якщо ви, наприклад, хочете поміняти лише кілька елементів навколо мобільного макета, тоді не виключайте цю техніку.

Ви можете ознайомитися з демонстрацією в реальному часі на codepen: http://codepen.io/thepixelninja/pen/eZVgLx


width: 100%Лінія марно: ви не можете дати ширину до display: tableелементу.
Clément

1
Моє ліжко. Це не в тому прикладі, який я зробив, мабуть, випадково закрався сюди. Незалежно від того, чи існує цей метод, все-таки працює. :)
Ед Фрайд

Коли ви маєте справу із входами форми, які зазвичай мають над собою мітку, але розташовуються раніше в DOM (тому ми можемо націлювати мітки на основі стану введення), це дуже корисно! Також чудово підходить для плаваючих етикеток.
Sơn Trần-Nguyễn

1
Це дійсно чудовий негнучкий спосіб це зробити. Навіть у 2019 році ми отримуємо 4% трафіку IE9.
secretwep

29

Прийнята відповідь спрацювала для більшості браузерів, але з якихось причин у браузерах iOS Chrome та Safari вміст, який повинен був показати другим, був прихований. Я спробував кілька інших кроків, які змушували вміст складати один на одного, і врешті-решт я спробував таке рішення, яке дало мені передбачуваний ефект (змінити порядок відображення вмісту на екранах мобільних пристроїв), без помилок накопиченого або прихованого вмісту:

.container {
  display:flex;
  flex-direction: column-reverse;
}

.section1,
.section2 {
  height: auto;
}

до найкращого та найпростішого рішення для мене
w411 3

Спасибо .. Дуже цінується
Суджай Shrestha

8

Лише за допомогою CSS:

#blockContainer {
display: -webkit-box;
display: -moz-box;
display: box;

-webkit-box-orient: vertical;
-moz-box-orient: vertical;
box-orient: vertical;
}
#blockA {
-webkit-box-ordinal-group: 2;
-moz-box-ordinal-group: 2;
box-ordinal-group: 2;
}
#blockB {
-webkit-box-ordinal-group: 3;
-moz-box-ordinal-group: 3;
box-ordinal-group: 3;

}

<div id="blockContainer">
 <div id="blockA">Block A</div>
 <div id="blockB">Block B</div>
 <div id="blockC">Block C</div>
</div>

http://jsfiddle.net/thirtydot/hLUHL/



5

Якщо припустити, що за ними нічого не йде

Якщо ці два divелементи в основному є вашими основними елементами макета, і нічого за ними не слід у html, то існує чисте рішення HMTL / CSS, яке приймає нормальний порядок, показаний у цій скрипті, і може перевертати його вертикально, як показано в цій скрипті, використовуючи одна додаткова обгортка приблизно divтак:

HTML

<div class="wrapper flipit">
   <div id="first_div">first div</div>
   <div id="second_div">second div</div>
</div>

CSS

.flipit {
    position: relative;
}
.flipit #first_div {
    position: absolute;
    top: 100%;
    width: 100%;
}

Це не буде працювати , якщо елементи слідують цим ДІВ, оскільки ця скрипка ілюструє проблему , якщо такі елементи не обгорнуті (вони отримують перекриті #first_div), і цю скрипка ілюструє проблему , якщо такі елементи також обгорнуті ( #first_divзмінює позицію і #second_div та наступні елементи ). Ось чому, залежно від вашого випадку використання, цей метод може працювати, а може і не працювати.

Для загальної схеми макетування, де всі інші елементи існують усередині двох div, це може працювати. Для інших сценаріїв це не буде.


5

Це рішення спрацювало для мене:

Використання батьківського елементу, наприклад:

.parent-div {
    display:flex;
    flex-direction: column-reverse;
}

У моєму випадку мені не довелося змінювати css елементів, які мені потрібно було переключити.


0

припускаючи, що обидва елементи мають 50% ширини, ось що я використав:

css:

  .parent {
    width: 100%;
    display: flex;
  }  
  .child-1 {
    width: 50%;
    margin-right: -50%;
    margin-left: 50%;
    background: #ff0;
  }
  .child-2 {
    width: 50%;
    margin-right: 50%;
    margin-left: -50%;
    background: #0f0;
  }

html:

<div class="parent">
  <div class="child-1">child1</div>
  <div class="child-2">child2</div>
</div>

приклад: https://jsfiddle.net/gzveri/o6umhj53/

До речі, такий підхід працює для будь-яких 2-х сусідніх елементів у довгому списку елементів. Наприклад, у мене довгий список елементів з 2 елементами на рядок, і я хочу, щоб кожен 3-й та 4-й елементи у списку були помінені місцями, щоб він відображав елементи в шаховому стилі, тоді я використовую наступні правила:

  .parent > div:nth-child(4n+3) {
    margin-right: -50%;
    margin-left: 50%;
  }
  .parent > div:nth-child(4n+4) {
    margin-right: 50%;
    margin-left: -50%;
  }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.