Kiểm tra với jquery nếu div có các phần tử tràn


130

Tôi có một div với chiều cao cố định và overflow:hidden;

Tôi muốn kiểm tra với jQuery nếu div có các phần tử vượt quá chiều cao cố định của div. Tôi có thể làm cái này như thế nào?


Tôi có thể sai, nhưng tôi không nghĩ có một cách jQuery kỳ diệu để kiểm tra xem một phần tử có nằm ngoài phần tử khác không. Bạn có thể sẽ phải kiểm tra chiều cao và vị trí của các phần tử bên trong div của bạn và thực hiện một số tính toán để xem chúng có tràn không.
adeneo

1
Vâng, tôi đã suy nghĩ để kiểm tra xem sự khác biệt giữa vị trí của đỉnh div và vị trí của phần tử con cuối cùng bên trong div có lớn hơn chiều cao của div hay không
Justin Meltzer

Câu trả lời:


281

Bạn thực sự không cần bất kỳ jQuery nào để kiểm tra xem có xảy ra tràn hay không. Sử dụng element.offsetHeight, element.offsetWidth, element.scrollHeightelement.scrollWidthbạn có thể xác định xem yếu tố của bạn có nội dung lớn hơn kích thước của nó:

if (element.offsetHeight < element.scrollHeight ||
    element.offsetWidth < element.scrollWidth) {
    // your element have overflow
} else {
    // your element doesn't have overflow
}

Xem ví dụ trong hành động: Fiddle

Nhưng nếu bạn muốn biết phần tử nào bên trong phần tử của bạn có thể nhìn thấy hay không thì bạn cần phải tính toán nhiều hơn. Có ba trạng thái cho một yếu tố con về khả năng hiển thị:

nhập mô tả hình ảnh ở đây

Nếu bạn muốn đếm các mục bán hiển thị, đó sẽ là tập lệnh bạn cần:

var invisibleItems = [];
for(var i=0; i<element.childElementCount; i++){
  if (element.children[i].offsetTop + element.children[i].offsetHeight >
      element.offsetTop + element.offsetHeight ||
      element.children[i].offsetLeft + element.children[i].offsetWidth >
      element.offsetLeft + element.offsetWidth ){

        invisibleItems.push(element.children[i]);
    }

}

Và nếu bạn không muốn tính nửa hiển thị, bạn có thể tính toán với một chút khác biệt.


Chỉnh sửa cho tôi nếu tôi sai nhưng điều này dường như không hoạt động nữa trên Chrome V.20.0.1132.57. Nếu bạn thay đổi văn bản bên trong div, màu nền sẽ vẫn là màu vàng, jsbin.com/ujiwah/25/edit#javascript,html,live
Robbie

4
@Robbie <p>là một yếu tố cấp khối và chiếm 100% chiều rộng. Nếu bạn muốn thử điều này với số lượng văn bản bên trong p chỉ cần thực hiện p{display:inline}. Cách này văn bản bên trong xác định chiều rộng của p.
Mohsen

Tôi đọc "Bạn thực sự không cần bất kỳ jQuery nào" và ngay lập tức "duh, đó là phép toán đơn giản."
Michael J. Calkins

1
Hoạt động trong hầu hết các trường hợp nhưng sẽ không bao gồm kịch bản với các bảng CSS (hiển thị ô bảng, bảng-rwo, bảng) -
Dmitry

Tôi hiểu offsetHeight bao gồm các đường viền, không được tính vào vùng có thể cuộn. Chỉ cần một lưu ý. (sửa tôi nếu tôi sai)
Lodewijk

38

Tôi có cùng câu hỏi với OP và không có câu trả lời nào phù hợp với nhu cầu của tôi. Tôi cần một điều kiện đơn giản, cho một nhu cầu đơn giản.

Đây là câu trả lời của tôi:

if ($("#myoverflowingelement").prop('scrollWidth') > $("#myoverflowingelement").width() ) {
  alert("this element is overflowing !!");
}
else {
 alert("this element is not overflowing!!");
}

Ngoài ra, bạn có thể thay đổi scrollWidthbởi scrollHeightnếu bạn cần phải kiểm tra cả hai trường hợp.


1
Cảm ơn, điều đó đã làm việc cho tôi. chỉ cần một ví dụ đơn giản trong jquery nhưng không phải trong js đơn giản.
mikhail-t

4
không hoạt động cho các phần tử với phần đệm / lề. sử dụng lớp ngoài của chiều rộng (đúng) chiều rộng
Vladimir Shmidt

Không hoạt động trong tức là, hoạt động tốt trong mozilla và chrome.
Sushil Kumar

Tôi có một số hiệu ứng kỳ lạ với kịch bản này. Thử nghiệm trong Chrome. Tôi viết lại nó để kiểm tra độ cao (sử dụng OuterHeight) và nếu tôi sử dụng F5 để tải lại một trang để kiểm tra tập lệnh hoặc điều hướng đến nó từ một trang khác, nó sẽ luôn trở lại là overflow = true, nhưng nếu tôi sử dụng ctrl-F5 thì nó sẽ xuất hiện trở lại như tràn = false. Đây là khi kiểm tra một tình huống được cho là trở lại sai. Khi nó được cho là đúng thì nó luôn hoạt động.
Dennis

Ok tôi tự tìm ra nó. Tôi có các thẻ script được gói trong window.addEventListener ('DOMContentLoaded') để chúng sẽ hoạt động với jquery được tải không đồng bộ của tôi và các tệp khác. Nhưng việc chạy tập lệnh này ở giai đoạn đó sẽ trả về các lần đọc sai, vì vậy đối với tập lệnh này, tôi đã thay thế DOMContentLoaded chỉ bằng 'load' để trì hoãn việc thực thi tập lệnh hơn nữa. Bây giờ nó trả về kết quả chính xác mỗi lần. Và với mục đích của tôi, nó hoàn toàn ổn khi nó chờ chạy cho đến khi trang được tải, sau đó tôi thậm chí có thể thêm một hình ảnh động để làm nổi bật sự chú ý của người dùng vào nút "đọc thêm".
Dennis

4

Vì vậy, tôi đã sử dụng thư viện jquery tràn: https://github.com/kevinmarx/overflowing

Sau khi cài đặt thư viện, nếu bạn muốn gán lớp overflowingcho tất cả các phần tử tràn, bạn chỉ cần chạy:

$('.targetElement').overflowing('.parentElement')

Điều này sau đó sẽ cung cấp cho lớp overflowing, như trong <div class="targetElement overflowing">tất cả các yếu tố đang tràn. Sau đó, bạn có thể thêm phần này vào một số trình xử lý sự kiện (nhấp, di chuột) hoặc chức năng khác sẽ chạy mã ở trên để nó cập nhật động.


3

Một phần dựa trên câu trả lời của Mohsen (điều kiện đầu tiên được thêm vào bao gồm trường hợp đứa trẻ bị ẩn trước cha mẹ):

jQuery.fn.isChildOverflowing = function (child) {
  var p = jQuery(this).get(0);
  var el = jQuery(child).get(0);
  return (el.offsetTop < p.offsetTop || el.offsetLeft < p.offsetLeft) ||
    (el.offsetTop + el.offsetHeight > p.offsetTop + p.offsetHeight || el.offsetLeft + el.offsetWidth > p.offsetLeft + p.offsetWidth);
};

Sau đó, chỉ cần làm:

jQuery('#parent').isChildOverflowing('#child');

2

Một phương pháp là kiểm tra scrollTop với chính nó. Cung cấp cho nội dung một giá trị cuộn lớn hơn kích thước của nó và sau đó kiểm tra xem scrollTop của nó có bằng 0 hay không (nếu không phải là 0, nó có tràn không.)

http://jsfiddle.net/ukvBf/


1

Trong tiếng Anh đơn giản: Lấy phần tử cha. Kiểm tra chiều cao của nó và lưu giá trị đó. Sau đó lặp qua tất cả các yếu tố con và kiểm tra chiều cao cá nhân của chúng.

Điều này là bẩn, nhưng bạn có thể có được ý tưởng cơ bản: http://jsfiddle.net/VgDgz/


1
Đó là một ví dụ tốt, nhưng những gì về vị trí. Nếu một phần tử được định vị tuyệt đối trên toàn bộ phần trên của phần gốc, phần tử đó có thể tràn ngay cả khi chiều cao thấp hơn phần gốc.
adeneo

Hoàn toàn có khả năng có một vài trường hợp khác nhau có thể gây ra nó. Chỉ là một ví dụ nhanh về nơi có thể bắt đầu. Trường hợp cụ thể của Op có thể sẽ xác định những gì cần được kiểm tra
Doozer Blake

0

Đây là một giải pháp jQuery thuần túy, nhưng nó khá lộn xộn:

var div_height = $(this).height();
var vertical_div_top_position = $(this).offset().top;
var lastchild_height = $(this).children('p:last-child').height();
var vertical_lastchild_top_position = $(this).children('p:last-child').offset().top;
var vertical_lastchild_bottom_position = lastchild_height + vertical_lastchild_top_position;
var real_height = vertical_lastchild_bottom_position - vertical_div_top_position;

if (real_height > div_height){
    //overflow div
}

0

Đây là giải pháp jQuery phù hợp với tôi. offsetWidthvv đã không làm việc.

function is_overflowing(element, extra_width) {
    return element.position().left + element.width() + extra_width > element.parent().width();
}

Nếu điều này không hoạt động, hãy đảm bảo rằng cha mẹ của các thành phần có chiều rộng mong muốn (cá nhân tôi phải sử dụng parent().parent()). Có positionliên quan đến cha mẹ. Tôi cũng đã bao gồm extra_widthvì các thành phần của tôi ("thẻ") chứa hình ảnh mất ít thời gian để tải, nhưng trong khi gọi hàm chúng có độ rộng bằng 0, làm hỏng phép tính. Để giải quyết vấn đề đó, tôi sử dụng mã gọi sau:

var extra_width = 0;
$(".tag:visible").each(function() {
    if (!$(this).find("img:visible").width()) {
        // tag image might not be visible at this point,
        // so we add its future width to the overflow calculation
        // the goal is to hide tags that do not fit one line
        extra_width += 28;
    }
    if (is_overflowing($(this), extra_width)) {
        $(this).hide();
    }
});

Hi vọng điêu nay co ich.


0

Tôi đã sửa lỗi này bằng cách thêm một div khác trong số tràn. Sau đó, bạn so sánh độ cao của 2 div.

<div class="AAAA overflow-hidden" style="height: 20px;" >
    <div class="BBBB" >
        Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
    </div>
</div>

và js

    if ($('.AAAA').height() < $('.BBBB').height()) {
        console.log('we have overflow')
    } else {
        console.log('NO overflow')
    }

Điều này có vẻ dễ dàng hơn ...

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.