根据设备宽度使用CSS更改div顺序

时间:2015-09-28 18:32:49

标签: html css css3 flexbox

我正在开发一个响应式网站,并遇到了一个有趣的问题。我有一些divs并排。它们可能有2到6个左右。当屏幕宽度不足以正确显示所有内容时,div会垂直堆叠。简单到使用CSS。

问题是,我需要它们以不同的顺序取决于布局。使用2个或3个div(Changing divs order based on width)很容易,但添加第4个div时更具挑战性。

我可以使用position: absolute;并手动设置位置,但这会导致父级缩小而不能正确包含它们。

为了使这更复杂,我不能使用JavaScript。

使用两列:

(未测试的)

HTML:

<div id="container">
    <div class="column-half column-half-2">
        First div on mobile, right div on desktop
    </div>
    <div class="column-half column-half-1">
        Second div on mobile, left div on desktop
    </div>
</div>

CSS:

.container {
    width: 80%;
    max-width: 1200px;
    margin: 0 auto;
    padding-bottom: 20px;
    position: relative;
}
.column-half {
    display: table-cell;
    padding: 25px;
    vertical-align: top;
    width: 40%;
}
.column-half-1 {
    float: left;
}
.column-half-2 {
    float: right;
}

HTML,包含4列:

<div id="container">
    <div class="column-quarter column-quarter-3">
        First div on mobile, third div on desktop
    </div>
    <div class="column-quarter column-quarter-2">
        Second div on mobile, second div on desktop
    </div>
    <div class="column-quarter column-quarter-1">
        Third div on mobile, first div on desktop
    </div>
    <div class="column-quarter column-quarter-4">
        Fourth div on mobile, fourth div on desktop
    </div>
</div>

1 个答案:

答案 0 :(得分:49)

由于精彩的flexbox规范,这在CSS中是可行的。使用orderflex-flow属性,我们可以实现您的目标。未加前缀的IE11和所有常青浏览器都支持此功能。 IE10前缀为-ms-order,不支持flex-flow

该解决方案会考虑您列出的所有限制因素:

  • 将给定订单中的元素列表显示为一行。
  • 当窗口太小时,将其更改为显示在列中。
  • 更改元素显示在列中时的顺序。

由于Stack Snippets的限制,您需要以完整页面模式查看演示,并调整浏览器大小以查看效果。

.container div {
    width: 100px;
    height: 50px;
    display: inline-block;
}

.one { background: red; }
.two { background: orange; }
.three { background: yellow; }
.four { background: green; }
.five { background: blue; }

@media screen and (max-width: 531px) {
    .container { display: flex; flex-flow: column; }
    .five { order: 1; }
    .four { order: 2;  }
    .three { order: 3; }
    .two { order: 4; }
    .one { order: 5 }
}
<div class="container">
    <div class="one">I'm first</div>
    <div class="two">I'm second</div>
    <div class="three">I'm third</div>
    <div class="four">I'm fourth</div>
    <div class="five">I'm fifth</div>
</div>

或者,这是一个JSFiddle演示。

如果你倾向于使用详细的CSS,你也可以简单地使用flex-flow: column-reverse而不为每个div分配order属性。适用相同的演示限制;全屏查看此演示并相应调整浏览器窗口的大小。

.container div {
    width: 100px;
    height: 50px;
    display: inline-block;
}

.one { background: red; }
.two { background: orange; }
.three { background: yellow; }
.four { background: green; }
.five { background: blue; }

@media screen and (max-width: 531px) {
    .container { display: flex; flex-flow: column-reverse; }
}
<div class="container">
    <div class="one">I'm first</div>
    <div class="two">I'm second</div>
    <div class="three">I'm third</div>
    <div class="four">I'm fourth</div>
    <div class="five">I'm fifth</div>
</div>

值得指出的是,flex-flow是包含flex-directionflex-wrap属性的速记属性。