Sprawdź w jquery, czy div ma przepełnione elementy

131

Mam element div o stałej wysokości i overflow:hidden;

Chcę sprawdzić w jQuery, czy element div zawiera elementy, które przekraczają ustaloną wysokość elementu div. Jak mogę to zrobić?

Justin Meltzer
źródło
Mogę się mylić, ale nie sądzę, aby istniał magiczny sposób w jQuery, aby sprawdzić, czy element znajduje się poza innym elementem. Prawdopodobnie musiałbyś sprawdzić wysokość i położenie elementów wewnątrz swojego div i wykonać obliczenia, aby zobaczyć, czy się przepełniają.
adeneo
1
Tak, myślałem, aby sprawdzić, czy różnica między położeniem góry elementu div a położeniem dołu ostatniego elementu podrzędnego wewnątrz elementu div była większa niż wysokość elementu div
Justin Meltzer,

Odpowiedzi:

281

W rzeczywistości nie potrzebujesz żadnego jQuery, aby sprawdzić, czy występuje przepełnienie, czy nie. Korzystanie z element.offsetHeight, element.offsetWidth, element.scrollHeighti element.scrollWidthmożna sprawdzić, czy dany element nie ma zawartość większy niż jej rozmiar:

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

Zobacz przykład w akcji: Fiddle

Ale jeśli chcesz wiedzieć, który element wewnątrz Twojego elementu jest widoczny, czy nie, musisz wykonać więcej obliczeń. Istnieją trzy stany elementu podrzędnego pod względem widoczności:

wprowadź opis obrazu tutaj

Jeśli chcesz liczyć elementy częściowo widoczne, będzie to skrypt, którego potrzebujesz:

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]);
    }

}

A jeśli nie chcesz liczyć częściowo widocznych, możesz obliczyć z niewielką różnicą.

Mohsen
źródło
Popraw mnie, jeśli się mylę, ale wygląda na to, że nie działa już Chrome V.20.0.1132.57. Jeśli zmienisz tekst wewnątrz elementu div, kolor tła pozostanie żółty, jsbin.com/ujiwah/25/edit#javascript,html,live
Robbie
4
@Robbie <p>jest elementem blokowym i ma 100% szerokości. Jeśli chcesz to wypróbować z ilością tekstu wewnątrz p, po prostu zrób to p{display:inline}. W ten sposób tekst wewnątrz określa szerokość p.
Mohsen,
Przeczytałem „Właściwie nie potrzebujesz żadnego jQuery” i od razu powiedziałem „eee, to prosta matematyka”.
Michael J. Calkins
1
Działa w większości przypadków, ale nie zakrywa scenariusza z tabelami CSS (display table-cell, table-rwo, table) -
Dmitry
Rozumiem, że offsetHeight obejmuje obramowania, które nie liczą się do przewijanego obszaru. Tylko uwaga. (popraw mnie, jeśli się mylę)
Lodewijk
38

Miałem to samo pytanie co OP i żadna z tych odpowiedzi nie odpowiadała moim potrzebom. Potrzebowałem prostego warunku na prostą potrzebę.

Oto moja odpowiedź:

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

Możesz również zmienić scrollWidth, scrollHeightjeśli chcesz przetestować jeden z przypadków.

Sidney
źródło
1
Dzięki, to zadziałało dla mnie. potrzebowałem tylko prostego przykładu w jquery, ale nie w zwykłym js.
mikhail-t
4
nie działa dla elementów z dopełnieniem / marginesem. użyj externalWidth (true) inbread of width
Vladimir Shmidt
Nie działa w ie, działa dobrze w Mozilli i Chrome.
Sushil Kumar
Mam dziwne efekty w tym skrypcie. Testowanie w Chrome. Przepisałem go, aby sprawdzić wysokość (za pomocą OuterHeight) i jeśli użyję F5, aby ponownie załadować stronę, aby sprawdzić skrypt lub przejść do niej z innej strony, zawsze wraca jako przepełnienie = prawda, ale jeśli użyję ctrl-F5, to przychodzi z powrotem jako przepełnienie = fałsz. Dzieje się tak podczas testowania sytuacji, która ma powrócić jako fałszywa. Kiedy ma być prawdą, zawsze działa.
Dennis
Ok, sam to wymyśliłem. Mam swoje tagi skryptów zapakowane w window.addEventListener ('DOMContentLoaded'), więc będą działać z moim asynchronicznie załadowanym plikiem jquery i innymi plikami. Ale uruchomienie tego skryptu na tym etapie zwraca pozornie fałszywe odczyty, więc w tym skrypcie zastąpiłem DOMContentLoaded tylko „ładowaniem”, aby jeszcze bardziej opóźnić wykonanie skryptu. Teraz za każdym razem zwraca prawidłowe wyniki. I dla moich celów jest w porządku, że czeka z uruchomieniem do momentu załadowania strony, a potem mogę nawet dodać animację, aby zwrócić uwagę użytkowników na przycisk „czytaj więcej”.
Dennis
4

Więc użyłem przepełnionej biblioteki jquery: https://github.com/kevinmarx/overflowing

Po zainstalowaniu biblioteki, jeśli chcesz przypisać klasę overflowingdo wszystkich przepełnionych elementów, po prostu uruchom:

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

To da klasę overflowing, podobnie jak w <div class="targetElement overflowing">przypadku wszystkich elementów, które są przepełnione. Możesz następnie dodać to do jakiejś obsługi zdarzeń (kliknięcie, najechanie myszą) lub innej funkcji, która uruchomi powyższy kod, aby aktualizował się dynamicznie.

maudulus
źródło
3

Częściowo na podstawie odpowiedzi Mohsena (dodany pierwszy warunek obejmuje przypadek, w którym dziecko jest ukryte przed rodzicem):

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

Następnie po prostu wykonaj:

jQuery('#parent').isChildOverflowing('#child');
brauliobo
źródło
2

Jedną z metod jest sprawdzenie scrollTop względem siebie. Nadaj zawartości wartość przewijania większą niż jej rozmiar, a następnie sprawdź, czy jej scrollTop ma wartość 0, czy nie (jeśli nie jest równa 0, ma przepełnienie).

http://jsfiddle.net/ukvBf/

Joseph Marikle
źródło
1

Mówiąc prostym językiem: pobierz element nadrzędny. Sprawdź jego wysokość i zapisz tę wartość. Następnie przejrzyj wszystkie elementy potomne i sprawdź ich indywidualne wysokości.

To jest brudne, ale możesz mieć podstawowy pomysł: http://jsfiddle.net/VgDgz/

Doozer Blake
źródło
1
To dobry przykład, ale co ze stanowiskiem. Jeśli element jest umieszczony absolutnie na samej górze elementu nadrzędnego, może się przepełnić, nawet jeśli wysokość jest niższa niż element nadrzędny.
adeneo
Oczywiście, prawdopodobnie istnieje kilka różnych przypadków, które mogą to spowodować. Tylko krótki przykład, od czego może zacząć. Konkretny przypadek Op prawdopodobnie określi, co należy sprawdzić
Doozer Blake
0

Oto czyste rozwiązanie jQuery, ale jest raczej niechlujne:

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
}
Justin Meltzer
źródło
0

To jest rozwiązanie jQuery, które zadziałało dla mnie. offsetWidthitp. nie działały.

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

Jeśli to nie zadziała, upewnij się, że element nadrzędny ma żądaną szerokość (osobiście musiałem użyć parent().parent()). positionJest względem rodzica. Uwzględniłem również, extra_widthponieważ moje elementy („tagi”) zawierają obrazy, których load, ale podczas wywołania funkcji mają zerową szerokość, co psuje obliczenia.Aby to obejść, używam następującego kodu wywołującego:

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();
    }
});

Mam nadzieję że to pomoże.

Dennis Golomazov
źródło
0

Naprawiłem to, dodając kolejny element div w tym, który się przepełnia. Następnie porównujesz wysokości dwóch elementów 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>

i js

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

To wygląda na łatwiejsze ...

alex toader
źródło