仅使用CSS交换DIV位置

时间:2013-07-03 18:43:54

标签: css responsive-design

我正在尝试交换两个div s位置以进行响应式设计(网站看起来会有所不同,具体取决于浏览器的宽度/移动设备的优势)。

现在我有这样的事情:

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

但是可以交换他们的展示位置,使它看起来像second_div是第一个,只使用CSS吗? HTML保持不变。我尝试过使用花车和东西,但它似乎没有按照我想要的方式工作。我不想使用绝对定位,因为div的高度总是在变化。有没有解决方案,或者没有办法做到这一点?

8 个答案:

答案 0 :(得分:111)

有人把我联系起来:What is the best way to move an element that's on the top to the bottom in Responsive design

解决方案完美无缺。虽然它不支持旧的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,我不得不在位置周围交换。

答案 1 :(得分:26)

这个问题已经有了一个很好的答案,但本着探索所有可能性的精神,这是另一种重新排序dom元素同时仍允许它们占据空间的技术,与绝对定位方法不同。

此方法适用于所有现代浏览器和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位于底部。自然地,table-row-group将元素放在中间。

这种方法很快得到了很好的支持,并且需要比flexbox方法少得多的css,所以如果你只想换一些项目用于移动布局,那么就不要排除这种技术。

您可以在codepen上查看实时演示:http://codepen.io/thepixelninja/pen/eZVgLx

答案 2 :(得分:23)

已接受的答案适用于大多数浏览器,但由于某些原因,在iOS Chrome和Safari浏览器中,应该显示的内容是隐藏的。我尝试了一些其他步骤,迫使内容叠加在一起,最终我尝试了以下解决方案,给了我预期的效果(在移动屏幕上切换内容显示顺序),没有堆叠或隐藏内容的错误:

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

.section1,
.section2 {
  height: auto;
}

答案 3 :(得分:5)

假设没有什么可以遵循它们

如果这两个div元素基本上是你的主要布局元素,并且在html中没有任何内容,则有一个纯takes the normal order shown in this fiddle并且能够flip it vertically as shown in this fiddle的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%;
}

如果元素遵循这些div,则不起作用,this fiddle illustrates the issue if the following elements are not wrapped(它们与#first_div重叠)和this fiddle illustrates the issue if the following elements are also wrapped#first_div更改位置 #second_div 和以下元素)。这就是为什么,根据您的使用案例,这种方法可能会或可能不会。

对于整体布局方案,其中所有其他元素都存在于两个div中,它可以工作。对于其他场景,它不会。

答案 4 :(得分:5)

仅使用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 :(得分:3)

在某些情况下,您可以仅使用flex-box属性order

非常简单:

.flex-item {
    order: 2;
}

请参阅:https://css-tricks.com/almanac/properties/o/order/

答案 6 :(得分:0)

此解决方案对我有用:

使用父元素,例如:

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

就我而言,我不必更改需要切换的元素的css。

答案 7 :(得分: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个项目,并且我希望列表中的每个第3位和第4位元素都可以交换,以便它以国际象棋风格呈现元素,然后使用以下规则: / p>

  .parent > div:nth-child(4n+3) {
    margin-right: -50%;
    margin-left: 50%;
  }
  .parent > div:nth-child(4n+4) {
    margin-right: 50%;
    margin-left: -50%;
  }