You can sort the flex items according to their computed order
.
Note that, in case two flex items have the same order
, they should be ordered according to their DOM position. That is, the sort must be stable. Since [].sort
is not necessarily stable, I will use a custom implementation of merge sort.
var orderedChildren = mergeSort([].map.call(
document.getElementById('container').children,
function(child) {
return [child, +getComputedStyle(child).order];
}
)).map(function(pair) {
return pair[0];
});
function mergeSort(arr) {
var m = Math.floor(arr.length / 2);
if(!m) return arr;
var arr2 = mergeSort(arr.splice(m)),
arr1 = mergeSort(arr.splice(0));
while(arr1.length && arr2.length)
arr.push((arr1[0][1] > arr2[0][1] ? arr2 : arr1).shift());
return arr.concat(arr1, arr2);
}
var orderedChildren = mergeSort([].map.call(
document.getElementById('container').children,
function(child) {
return [child, +getComputedStyle(child).order];
}
)).map(function(pair) {
return pair[0];
});
function mergeSort(arr) {
var m = Math.floor(arr.length / 2);
if(!m) return arr;
var arr2 = mergeSort(arr.splice(m)),
arr1 = mergeSort(arr.splice(0));
while(arr1.length && arr2.length)
arr.push((arr1[0][1] > arr2[0][1] ? arr2 : arr1).shift());
return arr.concat(arr1, arr2);
}
for(var i=0; i<orderedChildren.length; ++i) {
orderedChildren[i].textContent = i;
}
#container {
display: flex;
flex-wrap: wrap;
}
#container > div {
border: 1px solid;
padding: 5px;
}
<div id="container">
<div style="order: 17"></div>
<div style="order: 25"></div>
<div style="order: 2"></div>
<div style="order: 3"></div>
<div style="order: 17"></div>
<div style=""></div>
<div style="order: -17"></div>
<div style="order: 2"></div>
</div>
If the numbers are ordered, it means JS has iterated the flex items according to their <code>order</code> property.