Учитывая шаблон, в котором HTML не может быть изменен из-за других требований, как можно отобразить (переставить) div над другим div, если они не находятся в таком порядке в HTML? Оба div содержат данные, различающиеся по высоте и ширине.
<div id = "wrapper">
<div id = "firstDiv">
Content to be below in this situation
</div>
<div id = "secondDiv">
Content to be above in this situation
</div>
</div>
Other elements
Надеюсь, очевидно, что желаемый результат:
Content to be above in this situation
Content to be below in this situation
Other elements
Когда размеры фиксированы, их легко разместить там, где это необходимо, но мне нужны некоторые идеи, когда содержимое является переменным. Ради этого сценария, пожалуйста, примите во внимание ширину 100% для обоих.
Я специально ищу решение только для CSS (и его, вероятно, придется встретить с другими решениями, если это не сработает).
За этим следуют и другие элементы. Было упомянуто хорошее предложение, учитывая ограниченный сценарий, который я продемонстрировал - учитывая, что это может быть лучший ответ, но я также хочу убедиться, что элементы, следующие за этим, не затронуты.






Ну, с небольшим абсолютным позиционированием и некоторыми хитроумными настройками полей я могу приблизиться, но это не идеально и не красиво:
#wrapper { position: relative; margin-top: 4em; }
#firstDiv { position: absolute; top: 0; width: 100%; }
#secondDiv { position: absolute; bottom: 0; width: 100%; }
"Margin-top: 4em" - особенно неприятный момент: это поле необходимо отрегулировать в соответствии с объемом содержимого в firstDiv. В зависимости от ваших конкретных требований это может быть возможно, но я все равно надеюсь, что кто-то сможет использовать это в качестве надежного решения.
Комментарий Эрика о JavaScript, вероятно, следует рассмотреть.
Если вы знаете или можете установить размер верхнего элемента, вы можете использовать
position : absolute;
В вашем css и укажите позицию div.
в противном случае javascript кажется единственным выходом:
fd = document.getElementById( 'firstDiv' );
sd = document.getElementById( 'secondDiv' );
fd.parentNode.removeChild( fd );
sd.parentNode.insertAfter( fd, sd );
или что-то подобное.
изменить: я только что нашел это, что может быть полезно: документ w3 css3 переместить в
Как уже говорили другие, это не то, чем вы хотели бы заниматься в CSS. Вы можете обмануть его абсолютным позиционированием и странными полями, но это просто не надежное решение. Лучшим вариантом в вашем случае будет переход на javascript. В jQuery это очень простая задача:
$('#secondDiv').insertBefore('#firstDiv');
или в более общем смысле:
$('.swapMe').each(function(i, el) {
$(el).insertBefore($(el).prev());
});
Вот решение:
<style>
#firstDiv {
position:absolute; top:100%;
}
#wrapper {
position:relative;
}
Но я подозреваю, что у вас есть контент, который следует за оболочкой div ...
Да ... стараюсь не слишком многословно описывать ситуацию, но есть и другие элементы. Хорошее предложение, хотя с учетом ограниченного HTML-кода - может сработать для кого-то другого.
Отрицательные верхние поля могут достичь этого эффекта, но их нужно будет настраивать для каждой страницы. Например, эта разметка ...
<div class = "product">
<h2>Greatest Product Ever</h2>
<p class = "desc">This paragraph appears in the source code directly after the heading and will appear in the search results.</p>
<p class = "sidenote">Note: This information appears in HTML after the product description appearing below.</p>
</div>
... и этот CSS ...
.product { width: 400px; }
.desc { margin-top: 5em; }
.sidenote { margin-top: -7em; }
... позволит вытянуть второй абзац над первым.
Конечно, вам придется вручную настроить свой CSS для разной длины описания, чтобы вводный абзац подскочил на соответствующую величину, но если у вас ограниченный контроль над другими частями и полный контроль над разметкой и CSS, тогда это может быть вариантом .
CSS действительно не следует использовать для реструктуризации бэкэнда HTML. Однако это возможно, если вы знаете высоту обоих задействованных элементов и чувствуете себя хакерским. Кроме того, при переходе между блоками div выбор текста будет неправильным, но это потому, что порядок HTML и CSS противоположен.
#firstDiv { position: relative; top: YYYpx; height: XXXpx; }
#secondDiv { position: relative; top: -XXXpx; height: YYYpx; }
Где XXX и YYY - высота firstDiv и secondDiv соответственно. Это будет работать с конечными элементами, в отличие от верхнего ответа.
Тогда какой должен «использовать для реструктуризации HTML», когда, скажем, помещая контент перед навигацией для программы чтения с экрана?
Абсолютно невозможно достичь желаемого только с помощью CSS, поддерживая предварительные пользовательские агенты Flexbox (в основном старый IE) - пока не:
Если вышесказанное верно, вы можете делать то, что хотите, абсолютно позиционируя элементы -
#wrapper { position: relative; }
#firstDiv { position: absolute; height: 100px; top: 110px; }
#secondDiv { position: absolute; height: 100px; top: 0; }
Опять же, если вы не знаете, какая высота нужна хотя бы для #firstDiv, вы не сможете делать то, что хотите, только с помощью CSS. Если какой-либо из этих материалов является динамическим, вам придется использовать javascript.
Хорошо, я тоже сначала проголосовал против, но вернул. Однако одно уточнение все еще связано с условиями: вы делаете нет, нужно знать количество элементов точный для изменения порядка, пока не это число> 3 (см. ответ, выигравший награду). Это особенно актуально для OP, который хотел поменять местами только 2 элемента.
Только для решения CSS 1. Либо высота обертки должна быть фиксированной, либо 2. Высота второго div должна быть зафиксирована
Это никак не отвечает на заданный вопрос. Это не более чем комментарий, намекающий на возможное решение.
В вашем CSS поместите первый div влево или вправо. Переместите второй div влево или вправо так же, как и первый. Примените clear: left или right так же, как два вышеупомянутых div для второго div.
Например:
#firstDiv {
float: left;
}
#secondDiv {
float: left;
clear: left;
}
<div class = "container"> <div id = "secondDiv"> <p> ... </p> </div> <div id = "firstDiv"> <p> ... </p> </ div> </div>
В моем случае float: right; ясно: слева; работает отлично
использование clear - отличный способ, но обратите внимание, что вы должны перемещать свой элемент в правильном направлении, а также вы должны перемещать все другие элементы, чтобы сделать это правильно. Vestel, вам следует использовать следующие стили: <style> #secondDiv, #firstDiv {float: left; } #firstDiv {clear: left; } </style> <div class = "container"> контейнер <div id = "secondDiv"> <p> secondDiv </p> </div> <div id = "firstDiv"> <p> firstDiv </p> </div> </div>
Или установите абсолютное положение для элемента и отработайте поля, объявив их от края страницы, а не от края объекта. Используйте%, поскольку он больше подходит для других размеров экрана и т. д. Вот как я решил проблему ... Спасибо, надеюсь, это то, что вы ищете ...
У меня есть гораздо лучший код, сделанный мной, он такой большой, просто чтобы показать обе вещи ... создать таблицу 4x4 и выровнять по вертикали больше, чем одну ячейку.
Он не использует никаких взломов IE, никакого vertical-align: middle; совсем...
Он не используется для вертикального центрирования display-table, display: table-rom; дисплей: таблица-ячейка;
Он использует уловку контейнера, который имеет два блока div, один из которых скрыт (положение неверно, но делает родительский элемент с правильным размером переменной), один видимый сразу после скрытого, но с верхним: -50%; так что он движется в правильное положение.
См. Классы div, которые делают трюк: BloqueTipoContenedor BloqueTipoContenedor_VerticalmenteCentrado BloqueTipoContenido_VerticalmenteCentrado_Oculto BloqueTipoContenido_VerticalmenteCentrado_Visible
Пожалуйста, извините за использование испанского в названиях классов (это потому, что я говорю по-испански, и это настолько сложно, что если я использую английский, я потеряюсь).
Полный код:
<?xml version = "1.0" encoding = "iso-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html>
<head>
<meta http-equiv = "Content-Type" content = "text/html; charset=iso-8859-1" />
<meta http-equiv = "Content-Language" content = "en" />
<meta name = "language" content = "en" />
<title>Vertical Centering in CSS2 - Example (IE, FF & Chrome tested) - This is so tricky!!!</title>
<style type = "text/css">
html,body{
margin:0px;
padding:0px;
width:100%;
height:100%;
}
div.BloqueTipoTabla{
display:table;margin:0px;border:0px;padding:0px;width:100%;height:100%;
}
div.BloqueTipoFila_AltoAjustadoAlContenido{
display:table-row;margin:0px;border:0px;padding:0px;width:100%;height:auto;
}
div.BloqueTipoFila_AltoRestante{
display:table-row;margin:0px;border:0px;padding:0px;width:100%;height:100%;
}
div.BloqueTipoCelda_AjustadoAlContenido{
display:table-cell;margin:0px;border:0px;padding:0px;width:auto;height:auto;
}
div.BloqueTipoCelda_RestanteAncho{
display:table-cell;margin:0px;border:0px;padding:0px;width:100%;height:auto;
}
div.BloqueTipoCelda_RestanteAlto{
display:table-cell;margin:0px;border:0px;padding:0px;width:auto;height:100%;
}
div.BloqueTipoCelda_RestanteAnchoAlto{
display:table-cell;margin:0px;border:0px;padding:0px;width:100%;height:100%;
}
div.BloqueTipoContenedor{
display:block;margin:0px;border:0px;padding:0px;width:100%;height:100%;position:relative;
}
div.BloqueTipoContenedor_VerticalmenteCentrado{
display:block;margin:0px;border:0px;padding:0px;width:100%;height:auto;position:relative;top:50%;
}
div.BloqueTipoContenido_VerticalmenteCentrado_Oculto{
display:block;margin:0px;border:0px;padding:0px;width:100%;height:auto;visibility:hidden;position:relative;top:50%;
}
div.BloqueTipoContenido_VerticalmenteCentrado_Visible{
display:block;margin:0px;border:0px;padding:0px;width:100%;height:auto;visibility:visible;position:absolute;top:-50%;
}
</style>
</head>
<body>
<h1>Vertical Centering in CSS2 - Example<br />(IE, FF & Chrome tested)<br />This is so tricky!!!</h1>
<div class = "BloqueTipoTabla" style = "margin:0px 0px 0px 25px;width:75%;height:66%;border:1px solid blue;">
<div class = "BloqueTipoFila_AltoAjustadoAlContenido">
<div class = "BloqueTipoCelda_AjustadoAlContenido">
[1,1]
</div>
<div class = "BloqueTipoCelda_AjustadoAlContenido">
[1,2]
</div>
<div class = "BloqueTipoCelda_RestanteAncho">
[1,3]
</div>
<div class = "BloqueTipoCelda_AjustadoAlContenido">
[1,4]
</div>
</div>
<div class = "BloqueTipoFila_AltoAjustadoAlContenido">
<div class = "BloqueTipoCelda_AjustadoAlContenido">
[2,1]
</div>
<div class = "BloqueTipoCelda_AjustadoAlContenido">
[2,2]
</div>
<div class = "BloqueTipoCelda_RestanteAncho">
[2,3]
</div>
<div class = "BloqueTipoCelda_AjustadoAlContenido">
[2,4]
</div>
</div>
<div class = "BloqueTipoFila_AltoRestante">
<div class = "BloqueTipoCelda_RestanteAlto">
<div class = "BloqueTipoContenedor" style = "border:1px solid lime;">
<div class = "BloqueTipoContenedor_VerticalmenteCentrado" style = "border:1px dotted red;">
<div class = "BloqueTipoContenido_VerticalmenteCentrado_Oculto">
The cell [3,1]
<br />
* * * *
<br />
* * * *
<br />
* * * *
<br />
Now is the highest one
</div>
<div class = "BloqueTipoContenido_VerticalmenteCentrado_Visible" style = "border:1px dotted blue;">
The cell [3,1]
<br />
* * * *
<br />
* * * *
<br />
* * * *
<br />
Now is the highest one
</div>
</div>
</div>
</div>
<div class = "BloqueTipoCelda_RestanteAlto">
<div class = "BloqueTipoContenedor" style = "border:1px solid lime;">
<div class = "BloqueTipoContenedor_VerticalmenteCentrado" style = "border:1px dotted red;">
<div class = "BloqueTipoContenido_VerticalmenteCentrado_Oculto">
This is<br />cell [3,2]
</div>
<div class = "BloqueTipoContenido_VerticalmenteCentrado_Visible" style = "border:1px dotted blue;">
This is<br />cell [3,2]
</div>
</div>
</div>
</div>
<div class = "BloqueTipoCelda_RestanteAnchoAlto">
<div class = "BloqueTipoContenedor" style = "border:1px solid lime;">
<div class = "BloqueTipoContenedor_VerticalmenteCentrado" style = "border:1px dotted red;">
<div class = "BloqueTipoContenido_VerticalmenteCentrado_Oculto">
This is cell [3,3]
<br/>
It is duplicated on source to make the trick to know its variable height
<br />
First copy is hidden and second copy is visible
<br/>
Other cells of this row are not correctly aligned only on IE!!!
</div>
<div class = "BloqueTipoContenido_VerticalmenteCentrado_Visible" style = "border:1px dotted blue;">
This is cell [3,3]
<br/>
It is duplicated on source to make the trick to know its variable height
<br />
First copy is hidden and second copy is visible
<br/>
Other cells of this row are not correctly aligned only on IE!!!
</div>
</div>
</div>
</div>
<div class = "BloqueTipoCelda_RestanteAlto">
<div class = "BloqueTipoContenedor" style = "border:1px solid lime;">
<div class = "BloqueTipoContenedor_VerticalmenteCentrado" style = "border:1px dotted red;">
<div class = "BloqueTipoContenido_VerticalmenteCentrado_Oculto">
This other is<br />the cell [3,4]
</div>
<div class = "BloqueTipoContenido_VerticalmenteCentrado_Visible" style = "border:1px dotted blue;">
This other is<br />the cell [3,4]
</div>
</div>
</div>
</div>
</div>
<div class = "BloqueTipoFila_AltoAjustadoAlContenido">
<div class = "BloqueTipoCelda_AjustadoAlContenido">
[4,1]
</div>
<div class = "BloqueTipoCelda_AjustadoAlContenido">
[4,2]
</div>
<div class = "BloqueTipoCelda_RestanteAncho">
[4,3]
</div>
<div class = "BloqueTipoCelda_AjustadoAlContenido">
[4,4]
</div>
</div>
</div>
</body>
</html>
Это решение использует только CSS и работает с переменным содержимым
#wrapper { display: table; }
#firstDiv { display: table-footer-group; }
#secondDiv { display: table-header-group; }
Хороший! Не работает для IE8 или ниже, но вы можете использовать условный скрипт для этих браузеров ...
Это правда, что не работает для IE7, но у меня нет проблем с IE8
Да, это очень удобно для переупорядочивания мобильного контента, и проблемы IE уже не актуальны! Подумайте о меню, которое определяется в первую очередь и отображается слева для обычных макетов, но вы хотите, чтобы они отображались внизу на узких мобильных дисплеях. Это очень хорошо помогает.
Следует отметить, что с поплавками это не работает. Вы должны установить float: none; если у вас уже есть поплавок.
Отличный трюк. Одна вещь, которую я обнаружил, что не работает, - это закругленные углы или возможность указать ширину. Как только я показываю первое погружение "table-footer-group", я теряю способность делать это.
Однако у меня тоже сработало, мне нужно было добавить width:100%; в класс-оболочку.
Примечание: img { max-width: 100% } не будет работать внутри переупорядоченных элементов.
Любая очевидная причина, по которой это не работает для меня сразу при изменении размера окна с использованием экрана @media и (max-width: 480 пикселей)? Кажется, это работает, только если я обновлю браузер с меньшей шириной.
С этими правилами firstDiv и secondDiv больше не будут подчиняться width: 100%; (хотя их родительский элемент не сжался).
Это легко с css, просто используйте свойство display:block и z-index
Вот пример:
HTML:
<body>
<div class = "wrapper">
<div class = "header">
header
</div>
<div class = "content">
content
</div>
</div>
</body>
CSS:
.wrapper
{
[...]
}
.header
{
[...]
z-index:9001;
display:block;
[...]
}
.content
{
[...]
z-index:9000;
[...]
}
Обновлено: хорошо установить background-color на div-s, чтобы все правильно видеть.
Я искал способ изменить порядок div только для мобильной версии, чтобы тогда я мог красиво оформить его. Благодаря ответу nickf мне удалось сделать этот фрагмент кода, который хорошо работал для того, что я хотел, поэтому я решил поделиться им с вами, ребята:
// changing the order of the sidebar so it goes after the content for mobile versions
jQuery(window).resize(function(){
if ( jQuery(window).width() < 480 )
{
jQuery('#main-content').insertBefore('#sidebar');
}
if ( jQuery(window).width() > 480 )
{
jQuery('#sidebar').insertBefore('#main-content');
}
jQuery(window).height(); // New height
jQuery(window).width(); // New width
});
Это можно сделать с помощью Flexbox.
Создайте контейнер, который применяет как дисплей: гибкий, так и гибкий поток: обратный столбец.
/* -- Where the Magic Happens -- */
.container {
/* Setup Flexbox */
display: -webkit-box;
display: -moz-box;
display: -ms-flexbox;
display: -webkit-flex;
display: flex;
/* Reverse Column Order */
-webkit-flex-flow: column-reverse;
flex-flow: column-reverse;
}
/* -- Styling Only -- */
.container > div {
background: red;
color: white;
padding: 10px;
}
.container > div:last-of-type {
background: blue;
}<div class = "container">
<div class = "first">
first
</div>
<div class = "second">
second
</div>
</div>Источники:
.move-wrap {
display: table;
table-layout: fixed; // prevent some responsive bugs
width: 100%; // set a width if u like
/* TODO: js-fallback IE7 if u like ms */
}
.move-down {
display: table-footer-group;
}
.move-up {
display: table-header-group;
}
Это решение было опубликовано на 3 года раньше вашего: stackoverflow.com/a/12069537/1652962
Решение только для CSS (работает для IE10 +) - используйте свойство Flexbox order:
Демо: http://jsfiddle.net/hqya7q6o/596/
#flex { display: flex; flex-direction: column; }
#a { order: 2; }
#b { order: 1; }
#c { order: 3; }<div id = "flex">
<div id = "a">A</div>
<div id = "b">B</div>
<div id = "c">C</div>
</div>Более подробная информация: https://developer.mozilla.org/en-US/docs/Web/CSS/order
Заказ работает здесь. Но дети не получают 100% ширины. Вместо этого они делят свои места в одном ряду. Есть идеи, как с помощью этого метода можно использовать 100% ширину для каждого дочернего элемента?
#flex { display: flex; flex-direction: column; } отобразит строки шириной 100%. jsfiddle.net/2fcj8s9eЭто можно сделать с помощью transform с более широкой поддержкой браузера.
Не поддерживается на iPhone 6s и ниже.
Это решение позволяет вам выбрать любой желаемый порядок для любого количества div. Это должно быть общепринятым решением ИМО.
Это чистое решение.
У меня есть простой способ сделать это.
<!-- HTML -->
<div class = "wrapper">
<div class = "sm-hide">This content hides when at your layouts chosen breaking point.</div>
<div>Content that stays in place</div>
<div class = "sm-show">This content is set to show at your layouts chosen breaking point.</div>
</div>
<!-- CSS -->
.sm-hide {display:block;}
.sm-show {display:none;}
@media (max-width:598px) {
.sm-hide {display:none;}
.sm-show {display:block;}
}
Ваше решение вполне может решить проблему, но не могли бы вы объяснить, почему и как это происходит. На S / O есть куча новичков, и они могут чему-то научиться на вашем опыте. То, что для вас может быть очевидным решением, для них может быть не так.
Блоки кода сами по себе обычно не являются полезными ответами и, скорее всего, вызовут отрицательные голоса. Пожалуйста, объяснять, что делает показываемое вами решение, и почему как этот код отвечает на вопрос.
Это можно сделать только с помощью CSS!
Пожалуйста, проверьте мой ответ на этот аналогичный вопрос:
https://stackoverflow.com/a/25462829/1077230
Я не хочу дважды публиковать свой ответ, но суть в том, что родительский элемент должен стать элементом flexbox. Например:
(здесь используется только префикс поставщика webkit.)
#main {
display: -webkit-box;
display: -webkit-flex;
display: flex;
-webkit-box-orient: vertical;
-webkit-flex-direction: column;
flex-direction: column;
-webkit-box-align: start;
-webkit-align-items: flex-start;
align-items: flex-start;
}
Затем поменяйте местами div, указав их порядок с помощью:
#main > div#one{
-webkit-box-ordinal-group: 2;
-moz-box-ordinal-group: 2;
-ms-flex-order: 2;
-webkit-order: 2;
order: 2;
overflow:visible;
}
#main > div#two{
-webkit-box-ordinal-group: 1;
-moz-box-ordinal-group: 1;
-ms-flex-order: 1;
-webkit-order: 1;
order: 1;
}
С помощью модуля макета CSS3 flexbox вы можете заказывать блоки div.
#wrapper {
display: flex;
flex-direction: column;
}
#firstDiv {
order: 2;
}
<div id = "wrapper">
<div id = "firstDiv">
Content1
</div>
<div id = "secondDiv">
Content2
</div>
</div>
Я рекомендую использовать order: -1, если вы хотите сделать 1 элемент из множества «липких» сверху :)
Просто используйте flex для родительского div, указав display: flex и flex-direction : column.
Затем используйте порядок, чтобы определить, какой из дочерних div идет первым.
Как вы думаете, почему этот ответ на 7-летний вопрос лучше тех, что уже были опубликованы? Если вы хотите участвовать в SO, пожалуйста, найдите вопросы без (хороших) ответов и попытайтесь ответить на них так, чтобы это было полезно для всех посетителей.
Решение с большей поддержкой браузера, чем flexbox (работает в IE≥9):
#wrapper {
-webkit-transform: scaleY(-1);
-ms-transform: scaleY(-1);
transform: scaleY(-1);
}
#wrapper > * {
-webkit-transform: scaleY(-1);
-ms-transform: scaleY(-1);
transform: scaleY(-1);
}<div id = "wrapper">
<div id = "firstDiv">
Content to be below in this situation
</div>
<div id = "secondDiv">
Content to be above in this situation
</div>
</div>
Other elementsВ отличие от решения display: table; это решение работает, когда .wrapper имеет любое количество дочерних элементов.
Что, если div содержит изображение>?
Немного поздно на вечеринку, но вы также можете сделать это:
<div style = "height: 500px; width: 500px;">
<div class = "bottom" style = "height: 250px; width: 500px; background: red; margin-top: 250px;"></div>
<div class = "top" style = "height: 250px; width: 500px; background: blue; margin-top: -500px;"></div>
Если вы просто используете css, вы можете использовать flex.
.price {
display: flex;
align-items: center;
justify-content: center;
flex-direction: row-reverse; //revert horizontally
//flex-direction: column-reverse; revert vertically
}<div class = "price">
<div>first block</div>
<div>second block</div>
</div>Заказ только для мобильных и сохраните родной порядок для рабочего стола:
// HTML
<div>
<div class = "gridInverseMobile1">First</div>
<div class = "gridInverseMobile1">Second</div>
</div>
// css
@media only screen and (max-width: 960px) {
.gridInverseMobile1 {
order: 2;
-webkit-order: 2;
}
.gridInverseMobile2 {
order: 1;
-webkit-order: 1;
}
}
Результат:
Desktop: First | Second
Mobile: Second | First
источник: https://www.w3schools.com/cssref/css3_pr_order.asp
Иногда лучше уступить более сильным. В этом случае это выглядит более элегантно, и вы полностью контролируете ситуацию. По этой причине я считаю, что это аккуратнее и лучше.