0

我在对 div 进行排序时遇到问题,我有两种类型a, b

a - should always be at the front (all a types)
b - should be following all a types.

HTML:

<div class="" style="">
    <div class="a">a</div>
    <div class="a">a</div>
    <div class="b">b</div>
    <div class="a">a</div>
</div>

CSS:

.a, .b {
  display:inline-block;
  width:50px;
  height:50px;
  padding:15px;
  margin:5px;
}

.a {
  float:left;
  background-color: blue;
}

.b { background-color: red; }

这似乎在一行中工作正常:

像线一样工作

但是像网格一样中断:

问题

期望的结果(框数无关):

结果

JsFiddle:http: //jsfiddle.net/kQkn9/

我将如何解决这个问题?

4

2 回答 2

6

如果您正在寻找纯 CSS 解决方案,您唯一的选择是使用 Flexbox。

http://jsfiddle.net/kQkn9/2/

.container { /* parent element */
  display: -webkit-flexbox;
  display: -ms-flexbox;
  display: -webkit-flex;
  -webkit-flex-wrap: wrap;
  -ms-flex-wrap: wrap;
  flex-wrap: wrap;
}
@supports (flex-wrap: wrap) {
  .container {
    display: flex;
  }
}

.a, .b {
  display: inline-block;
  width: 50px;
  height: 50px;
  padding: 15px;
  margin: 5px;
}

.a {
  background-color: blue;
}

.b {
  -webkit-flex-order: 1;
  -ms-flex-order: 1;
  -webkit-order: 1;
  order: 1;
  background-color: red;
}

浏览器支持:Chrome、Opera、IE10。 http://caniuse.com/#feat=flexbox

于 2013-03-29T00:10:53.143 回答
2

不要相信仅靠 CSS 和 HTML 就可以做到这一点。我的建议是对 a 和 b 进行排序,而不用改变你的 css,然后以新的排序顺序将它们重新插入到 DOM 中。

有这种效果的东西:(在JQ中)

var listOfAs = $('.a').clone(); 
var listOfBs = $('.b').clone(); 
var parent = $('.a').first().parent('div'); 
$('.a, .b').remove(); 
parent.append(listOfAs); 
parent.append(listOfBs); 

我知道这有点麻烦,而且不是超级“响应式”,但正如我所说,不要认为单独使用 CSS 是可能的……这只是一个快速而肮脏的实现,让你开始。

PS:更新了你的小提琴http://jsfiddle.net/kQkn9/6/

编辑:显然这在较新的浏览器中是可能的(感谢@cimmonon)。如果您需要支持较旧的浏览器,您将不得不做这样的事情(这绝对不那么酷)

于 2013-03-29T00:07:01.657 回答