javascript – Sort images by height

Question:

I have a list of images with different dimensions. I wanted the images to be sorted from smallest to largest: the one with the smallest height would come first and the one with the greatest height would come last. Using only jQuery with HTML.

HTML:

<div class="row">

    <div class="col-lg-3  parceiros ">
        <a href="http://www.sinfar.org.br/?q=listaConv3/1582" target="_blank">
            <img class="well" style="background: none" src="http://ipupo.com.br/arquivos/Parceiro/12082014164535.png" title="CASF" /></a>
    </div>

    <div class="col-lg-3  parceiros ">
        <a href="http://www.sinfar.org.br/?q=listaConv3/1582" target="_blank">
            <img class="well" style="background: none" src="http://ipupo.com.br/arquivos/Parceiro/12082014164559.png" title="SINFAR" /></a>
    </div>

    <div class="col-lg-3  parceiros ">
        <a href="http://paf.crfsp.org.br/paf/?cb/benef/Cursos_de_Graduacao_Especializacao_e_Pos-graduacao/841106593608856" target="_blank">
            <img class="well" style="background: none" src="http://ipupo.com.br/arquivos/Parceiro/12082014164626.png" title="PAF" /></a>
    </div>

    <div class="col-lg-3  parceiros ">
        <a href="http://www.unifran.edu.br/site/home/" target="_blank">
            <img class="well" style="background: none" src="http://ipupo.com.br/arquivos/Parceiro/12082014164654.jpg" title="UNIFRAN" /></a>
    </div>

</div>

<div class="row">

    <div class="col-lg-3  parceiros ">
        <a href="http://www.ibramrp.com.br/" target="_blank">
            <img class="well" style="background: none" src="http://ipupo.com.br/arquivos/Parceiro/26082014151738.png" title="Instituto Brasileiro de Acumpuntura" /></a>
    </div>

    <div class="col-lg-3  parceiros ">
        <a href="http://www.anfarmag.org.br/home" target="_blank">
            <img class="well" style="background: none" src="http://ipupo.com.br/arquivos/Parceiro/26082014151823.jpg" title="Anfarmag" /></a>
    </div>

    <div class="col-lg-3  parceiros ">
        <a href="http://www.multigene.net.br/portal/" target="_blank">
            <img class="well" style="background: none" src="http://ipupo.com.br/arquivos/Parceiro/26082014151856.jpg" title="Multigene" /></a>
    </div>

    <div class="col-lg-3  parceiros ">
        <a href="http://www.faa.edu.br/institucional.php" target="_blank">
            <img class="well" style="background: none" src="http://ipupo.com.br/arquivos/Parceiro/26082014152017.png" title="CESVA" /></a>
    </div>

</div>

<div class="row">

    <div class="col-lg-3  parceiros ">
        <a href="http://www.sindicatonutricionistas.com.br/" target="_blank">
            <img class="well" style="background: none" src="http://ipupo.com.br/arquivos/Parceiro/26082014152048.jpg" title="SINDICATO DE NUTRIÇÃO" /></a>
    </div>

    <div class="col-lg-3  parceiros ">
        <a href="http://www.abfh.org.br/" target="_blank">
            <img class="well" style="background: none" src="http://ipupo.com.br/arquivos/Parceiro/26082014152123.png" title="ABFH" /></a>
    </div>

    <div class="col-lg-3  parceiros ">
        <a href="http://www.lipochemicals.com/" target="_blank">
            <img class="well" style="background: none" src="http://ipupo.com.br/arquivos/Parceiro/26082014152212.PNG" title="lipo chemicals" /></a>
    </div>

    <div class="col-lg-3  parceiros ">
        <a href="http://www.belezain.com.br/index.php" target="_blank">
            <img class="well" style="background: none" src="http://ipupo.com.br/arquivos/Parceiro/26082014152252.png" title="BELEZAIN" /></a>
    </div>

</div>

<div class="row">

    <div class="col-lg-3  parceiros ">
        <a href="http://www.esteticainfoco.org/" target="_blank">
            <img class="well" style="background: none" src="http://ipupo.com.br/arquivos/Parceiro/26082014152325.png" title="estetica in foco" /></a>
    </div>

    <div class="col-lg-3  parceiros ">
        <a href="https://www.facebook.com/belezainfocotv" target="_blank">
            <img class="well" style="background: none" src="http://ipupo.com.br/arquivos/Parceiro/26082014152420.png" title="beleza in foco tv" /></a>
    </div>

    <div class="col-lg-3  parceiros ">
        <a href="http://medicatriz.com.br/" target="_blank">
            <img class="well" style="background: none" src="http://ipupo.com.br/arquivos/Parceiro/26082014152459.jpg" title="medicatriz" /></a>
    </div>

    <div class="col-lg-3  parceiros ">
        <a href="http://www.idealterapia.com.br/" target="_blank">
            <img class="well" style="background: none" src="http://ipupo.com.br/arquivos/Parceiro/26082014152539.jpg" title="idealterapia" /></a>
    </div>

</div>

<div class="row">

    <div class="col-lg-3  parceiros ">
        <a href="http://www.congressoconsulfarma.com/" target="_blank">
            <img class="well" style="background: none" src="http://ipupo.com.br/arquivos/Parceiro/26082014152703.png" title="congresso consulfarma" /></a>
    </div>

    <div class="col-lg-3  parceiros ">
        <a href="http://www.consulfarma.com/" target="_blank">
            <img class="well" style="background: none" src="http://ipupo.com.br/arquivos/Parceiro/26082014152730.png" title="consulfarma" /></a>
    </div>

    <div class="col-lg-3  parceiros ">
        <a href="http://www.unicamp.br/unicamp/" target="_blank">
            <img class="well" style="background: none" src="http://ipupo.com.br/arquivos/Parceiro/26082014152803.png" title="unicamp" /></a>
    </div>

    <div class="col-lg-3  parceiros ">
        <a href="http://www.grupoinvestiga.com.br/" target="_blank">
            <img class="well" style="background: none" src="http://ipupo.com.br/arquivos/Parceiro/26082014152856.png" title="Grupo Investiga" /></a>
    </div>

</div>

<div class="row">

    <div class="col-lg-3  parceiros ">
        <a href="http://www.allergisa.com.br/" target="_blank">
            <img class="well" style="background: none" src="http://ipupo.com.br/arquivos/Parceiro/26082014152924.png" title="Allergisa" /></a>
    </div>

</div>

To generate the HTML code I use Web Forms:

<%
 var parceiros = bdParceiros.ListarTodos();
 int i = 1;

 foreach (var parceiro in parceiros)
 { 
 %>

            <%if(i==1){ %>
            <div class="row">
                <%} %>
                <div class="col-lg-3  parceiros ">
                    <a href="<%=parceiro.Link %>" target="_blank">
                        <img class="well" style="background: none" src="http://ipupo.com.br/arquivos/Parceiro/<%=parceiro.Logo %>" title="<%=parceiro.Nome %>" /></a>
                </div>
                <%if(i==4){
                      i=0;%>
            </div>
            <%}
                  i++; %>
            <%} %>

JSFiddle

Answer:

Here's an idea, possibly you could compress the code, but it's practical like this to be noticeable:

// colocar as imagens em cache
var imagens = $('img').get();
var row = $('.row');

// criar uma array de objetos, com a altura e o elemento que envolve cada imagem
var alturas = imagens.map(function (el) {
    var altura = el.getBoundingClientRect().height;
    return {
        altura: altura,
        elemento: $(el).closest('.col-lg-3')
    };
});

// arrumar a array de objetos por alturas
alturas = alturas.sort(function (a, b) {
    return a.altura - b.altura;
});

// apagar o conteudo original (atênção a possiveis event handlers)
row.html('');

// restaurar o conteudo, agora na ordem certa
$(alturas).each(function () {
    console.log(this.altura); // só para verificação
    $('.row').append(this.elemento);
});

As @bfavaretto indicated in the comments below, remember that this code must only run after the images are loaded, otherwise the height calculation will not work.

Example: http://jsfiddle.net/mkm25zb4/

Scroll to Top