Pytanie element o maksymalnej wysokości z zestawu elementów


Mam zestaw div elementy. W jQuery, Chciałbym móc dowiedzieć się div z maksymalną wysokością, a także z wysokością div. Na przykład:

<div>
    <div class="panel">
      Line 1
      Line 2
    </div>
    <div class="panel">
      Line 1<br/>
      Line 2<br/>
      Line 3<br/>
      Line 4<br/>
    </div>
    <div class="panel">
      Line 1
    </div>
    <div class="panel">
      Line 1
      Line 2
    </div>
</div>

Patrząc na powyższe, wiemy, że drugi div (4 linie) ma maksymalną wysokość dla wszystkich. Jak mogę to znaleźć? Czy ktoś mógłby ci pomóc?

Do tej pory próbowałem:

$("div.panel").height() która zwraca wysokość pierwszego div.


76
2018-05-19 15:22


pochodzenie




Odpowiedzi:


Posługiwać się .map() i Math.max.

var maxHeight = Math.max.apply(null, $("div.panel").map(function ()
{
    return $(this).height();
}).get());

Jeśli jest to mylące, aby przeczytać, może to być bardziej przejrzyste:

var heights = $("div.panel").map(function ()
    {
        return $(this).height();
    }).get(),

    maxHeight = Math.max.apply(null, heights);

191
2018-05-19 15:25



Znajduje najwyższą wysokość, ale nie odnosi się do faktycznego elementu. - Vincent Ramdhanie
Masz rację; Nie miałem jasności, że PO również chce tego elementu. Twoja odpowiedź działa w takim przypadku. - Matt Ball
@MattBall Dlaczego mogę uzyskać funkcję pobierania? Co robi i jaki jest jego cel? - chodorowicz
@chodorowicz cieszę się, że zapytałeś. Widzieć ta odpowiedź, pod drugim nagłówkiem. - Matt Ball
@MattBall Dzięki. Więc jQuery .map zwraca obiekt podobny do tablicy i pobierz .get zamienia go w tablicę. Wygląda jednak na to, że Math.max działa łatwo na oba te typy (po prostu testowane w konsoli Chrome), więc w tym przypadku .get wydaje się niepotrzebny. Czy ja się mylę? - chodorowicz


Opublikowany przez Ciebie html powinien korzystać z niektórych <br> aby faktycznie mieć divy o różnych wysokościach. Lubię to:

<div>
    <div class="panel">
      Line 1<br>
      Line 2
    </div>
    <div class="panel">
      Line 1<br>
      Line 2<br>
      Line 3<br>
      Line 4
    </div>
    <div class="panel">
      Line 1
    </div>
    <div class="panel">
      Line 1<br>
      Line 2
    </div>
</div>

Poza tym, jeśli chcesz odwołać się do div z maksymalną wysokością, możesz to zrobić:

var highest = null;
var hi = 0;
$(".panel").each(function(){
  var h = $(this).height();
  if(h > hi){
     hi = h;
     highest = $(this);  
  }    
});
//highest now contains the div with the highest so lets highlight it
highest.css("background-color", "red");

18
2018-05-19 15:35



Zachowaj ostrożność z tym, jeśli nie używasz metody jQuery wewnątrz (np .height w tym przypadku) musisz go usunąć, np: `$ (this) [0] .scrollHeight;` - rogerdpack


Jeśli chcesz ponownie użyć w wielu miejscach:

var maxHeight = function(elems){
    return Math.max.apply(null, elems.map(function ()
    {
        return $(this).height();
    }).get());
}

Następnie możesz użyć:

maxHeight($("some selector"));

2
2017-09-08 11:42





function startListHeight($tag) {
  
    function setHeight(s) {
        var max = 0;
        s.each(function() {
            var h = $(this).height();
            max = Math.max(max, h);
        }).height('').height(max);
    }
  
    $(window).on('ready load resize', setHeight($tag));
}

jQuery(function($) {
    $('#list-lines').each(function() {
        startListHeight($('li', this));
    });
});
#list-lines {
    margin: 0;
    padding: 0;
}

#list-lines li {
    float: left;
    display: table;
    width: 33.3334%;
    list-style-type: none;
}

#list-lines li img {
    width: 100%;
    height: auto;
}

#list-lines::after {
    content: "";
    display: block;
    clear: both;
    overflow: hidden;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>

<ul id="list-lines">
    <li>
        <img src="http://img2.vetton.ru//upl/1000/346/138/vetton_ru_sddu7-2560x1600.jpg" alt="" />
        <br /> Line 1
        <br /> Line 2
    </li>
    <li>
        <img src="http://img2.vetton.ru//upl/1000/346/138/vetton_ru_mixwall66-2560x1600.jpg" alt="" />
        <br /> Line 1
        <br /> Line 2
        <br /> Line 3
        <br /> Line 4
    </li>
    <li>
        <img src="http://img2.vetton.ru//upl/1000/346/138/vetton_ru_sddu7-2560x1600.jpg" alt="" />
        <br /> Line 1
    </li>
    <li>
        <img src="http://img2.vetton.ru//upl/1000/346/138/vetton_ru_mixwall66-2560x1600.jpg" alt="" />
        <br /> Line 1
        <br /> Line 2
    </li>
</ul>


1
2017-10-22 08:04





Próbować Dowiedz się, wysokość div i ustawienie wysokości div (Podobny do tego, który opublikował Matt, ale używając pętli)


0
2018-05-19 15:26





Jeśli byłbyś zainteresowany sortowaniem w całości w standardowym kodzie JavaScript lub bez użycia forEach ():

var panels = document.querySelectorAll("div.panel");

// You'll need to slice the node_list before using .map()
var heights = Array.prototype.slice.call(panels).map(function (panel) {
    // return an array to hold the item and its value
    return [panel, panel.offsetHeight];
}),

// Returns a sorted array
var sortedHeights = heights.sort(function(a, b) { return a[1] > b[1]});

0
2018-03-14 21:29





ul, li {
  list-style: none;
  margin: 0;
  padding: 0;
}

ul {
  display: flex;
  flex-wrap: wrap;
}

ul li {
  width: calc(100% / 3);
}

img {
  width: 100%;
  height: auto;
}
<ul>
  <li>
    <img src="http://img2.vetton.ru//upl/1000/346/138/vetton_ru_sddu7-2560x1600.jpg" alt="">
    <br> Line 1
    <br> Line 2
  </li>
  <li>
    <img src="http://img2.vetton.ru//upl/1000/346/138/vetton_ru_mixwall66-2560x1600.jpg" alt="">
    <br> Line 1
    <br> Line 2
    <br> Line 3
    <br> Line 4
  </li>
  <li>
    <img src="http://img2.vetton.ru//upl/1000/346/138/vetton_ru_sddu7-2560x1600.jpg" alt="">
    <br> Line 1
  </li>
  <li>
    <img src="http://img2.vetton.ru//upl/1000/346/138/vetton_ru_mixwall66-2560x1600.jpg" alt="">
    <br> Line 1
    <br> Line 2
  </li>
</ul>


0
2018-03-23 01:16