phần tử có chiều cao tối đa từ một tập hợp phần tử


85

Tôi có một tập hợp các divphần tử. Trong jQuery, tôi muốn có thể tìm ra divvới chiều cao tối đa và cả chiều cao của nó div. Ví dụ:

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

Bằng cách nhìn vào ở trên, chúng ta biết rằng thứ 2 div(với 4 dòng) có chiều cao lớn nhất của tất cả. Làm thế nào để tôi tìm ra điều này? Ai đó có thể vui lòng giúp đỡ?

Cho đến nay tôi đã thử:

$("div.panel").height()mà trả về chiều cao của 1st div.

Câu trả lời:


213

Sử dụng .map()Math.max.

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

Nếu điều đó khó hiểu khi đọc, điều này có thể rõ ràng hơn:

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

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

1
Điều này tìm thấy chiều cao cao nhất nhưng không phải là tham chiếu đến phần tử thực tế.
Vincent Ramdhanie

Bạn đúng; Tôi không rõ rằng OP cũng muốn phần tử này. Câu trả lời của bạn hoạt động trong trường hợp đó.
Matt Ball

3
@MattBall Tại sao lại có hàm get, tôi có thể hỏi? Nó làm gì và mục đích của nó là gì?
chodorowicz

2
@chodorowicz rất vui vì bạn đã hỏi. Xem câu trả lời này , dưới tiêu đề thứ hai.
Matt Ball

1
@MattBall Cảm ơn. Vì vậy, jQuery .map trả về đối tượng giống mảng và lấy .get biến nó thành mảng. Nhưng có vẻ như Math.max hoạt động dễ dàng trên cả hai loại này (vừa được thử nghiệm trong bảng điều khiển Chrome), vì vậy trong trường hợp này .get có vẻ không cần thiết. Hoặc là tôi sai?
chodorowicz

20

Html mà bạn đã đăng nên sử dụng một số <br>để thực sự có các div với các chiều cao khác nhau. Như thế này:

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

Ngoài ra, nếu bạn muốn tham chiếu đến div có chiều cao tối đa, bạn có thể thực hiện điều này:

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

Hãy cẩn thận với cái này, nếu bạn không sử dụng một phương pháp trong jQuery (như .heighttrong trường hợp này), sau đó bạn phải dereference nó, ví dụ: `$ (this) [0] .scrollHeight;`
rogerdpack

5

Nếu bạn muốn sử dụng lại ở nhiều nơi:

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

Sau đó, bạn có thể sử dụng:

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

Nếu bạn quan tâm đến việc sắp xếp hoàn toàn bằng JavaScript chuẩn hoặc không sử dụng 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

Cách dễ nhất và rõ ràng nhất tôi muốn nói là:

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

0

Điều này có thể hữu ích, theo một cách nào đó. Sửa một số mã từ @diogo

$(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 );
  
});
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.