bir dizi öğeden maksimum yüksekliğe sahip öğe


85

Bir dizi divunsurum var. İçinde jQuery, divmaksimum yüksekliği ve ayrıca bunun yüksekliğini bulabilmek istiyorum div. Örneğin:

<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>

Yukarıya bakarak, 2. div(4 Çizgi ile) tümünün maksimum yüksekliğine sahip olduğunu biliyoruz . Bunu nasıl bulabilirim? Biri lütfen yardım edebilir mi?

Şimdiye kadar denedim:

$("div.panel").height()1'in yüksekliğini döndürür div.

Yanıtlar:


213

Kullanım .map()ve Math.max.

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

Okumak kafa karıştırıcıysa, bu daha açık olabilir:

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

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

1
Bu, en yüksek yüksekliği bulur ancak gerçek öğeye bir referans vermez.
Vincent Ramdhanie

Haklısın; OP'nin de unsuru isteyip istemediğinden emin değildim. Cevabınız bu durumda işe yarar.
Matt Ball

3
@MattBall Neden get işlevi sorabilir miyim? Ne işe yarar ve amacı nedir?
chodorowicz

2
@chodorowicz sorduğuna sevindim. İkinci başlık altında bu cevaba bakın .
Matt Ball

1
@MattBall Teşekkürler. Yani jQuery .map dizi benzeri nesneyi döndürür ve .get onu diziye dönüştürür. Ancak Math.max'ın bu türlerin her ikisinde de kolayca çalıştığı görülüyor (sadece Chrome konsolunda test edildi), bu nedenle bu durumda .get gereksiz görünüyor. Yoksa yanılıyor muyum?
chodorowicz

20

Gönderdiğiniz html, <br>aslında farklı yüksekliklere sahip div'lere sahip olmak için bazılarını kullanmalıdır . Bunun gibi:

<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>

Bunun dışında, maksimum yüksekliğe sahip bir div referansı istiyorsanız, bunu yapabilirsiniz:

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");

Buna dikkat edin, içinde bir jQuery yöntemi kullanmıyorsanız ( .heightbu durumda olduğu gibi ), o zaman referansını kaldırmalısınız, örn: `$ (this) [0] .scrollHeight;` `
rogerdpack

5

Birden çok yerde yeniden kullanmak istiyorsanız:

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

O zaman şunları kullanabilirsiniz:

maxHeight($("some selector"));

1

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

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

Tamamen standart JavaScript'te veya forEach () kullanmadan sıralamak ilginizi çekiyorsa:

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

Söyleyebileceğim en kolay ve net yol:

var maxHeight = 0, maxHeightElement = null;
$('.panel').each(function(){
   if ($(this).height() > maxHeight) {
       maxHeight = $(this).height();
       maxHeightElement = $(this);
   }
});

0

Bu bir şekilde yardımcı olabilir. @Diogo'dan bir kod düzeltme

$(window).on('load',function(){

// get the maxHeight using innerHeight() function
  var maxHeight = Math.max.apply(null, $("div.panel").map(function ()                                                        {
    return $(this).innerHeight();
  }).get());
  
// Set the height to all .panel elements
  $("div.panel").height( maxHeight );
  
});
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.