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.