Überprüfen Sie mit jquery, ob div überlaufende Elemente hat

130

Ich habe ein div mit einer festen höhe und overflow:hidden;

Ich möchte mit jQuery prüfen, ob das Div Elemente enthält, die über die feste Höhe des Div hinaus überlaufen. Wie kann ich das machen?

Justin Meltzer
quelle
Ich könnte mich irren, aber ich glaube nicht, dass es eine magische jQuery-Methode gibt, um zu überprüfen, ob sich ein Element außerhalb eines anderen Elements befindet. Sie müssten wahrscheinlich die Höhe und Position der Elemente in Ihrem div überprüfen und einige Berechnungen durchführen, um festzustellen, ob sie überlaufen.
Adeneo
1
Ja, ich habe darüber nachgedacht zu prüfen, ob der Unterschied zwischen der Position der Oberseite des Div und der Position der Unterseite des letzten untergeordneten Elements innerhalb des Div größer ist als die Höhe des Div
Justin Meltzer
Mögliches Duplikat des Überlaufs
Noyo

Antworten:

281

Sie benötigen keine jQuery, um zu überprüfen, ob ein Überlauf auftritt oder nicht. Mit element.offsetHeight, element.offsetWidth, element.scrollHeightund element.scrollWidthSie können feststellen , ob Ihr Element Gehalt größer als seine Größe:

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

Siehe Beispiel in Aktion: Geige

Wenn Sie jedoch wissen möchten, welches Element in Ihrem Element sichtbar ist oder nicht, müssen Sie weitere Berechnungen durchführen. In Bezug auf die Sichtbarkeit gibt es drei Zustände für ein untergeordnetes Element:

Geben Sie hier die Bildbeschreibung ein

Wenn Sie halb sichtbare Elemente zählen möchten, ist dies das Skript, das Sie benötigen:

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

}

Und wenn Sie nicht halb sichtbar zählen möchten, können Sie mit einem kleinen Unterschied rechnen.

Mohsen
quelle
Korrigieren Sie mich, wenn ich falsch liege, aber dies scheint nicht mehr zu funktionieren. Chrome V.20.0.1132.57. Wenn Sie den Text innerhalb des Div ändern, bleibt die Hintergrundfarbe gelb, jsbin.com/ujiwah/25/edit#javascript,html,live
Robbie
4
@Robbie <p>ist ein Element auf Blockebene und nimmt eine Breite von 100% an. Wenn Sie dies mit einer Textmenge innerhalb des p versuchen möchten, machen Sie es einfach p{display:inline}. Auf diese Weise bestimmt der Text im Inneren die Breite von p.
Mohsen
Ich las "Du brauchst eigentlich keine jQuery" und ging sofort zu "duh, es ist einfache Mathematik".
Michael J. Calkins
1
Funktioniert in den meisten Fällen, verdeckt jedoch kein Szenario mit CSS-Tabellen (Anzeigetabellenzelle, Tabelle-rwo, Tabelle) -
Dmitry
Ich verstehe, dass offsetHeight Rahmen enthält, die nicht für den scrollbaren Bereich gelten. Nur eine Notiz. (Korrigieren Sie mich, wenn ich falsch liege)
Lodewijk
38

Ich hatte die gleiche Frage wie das OP, und keine dieser Antworten entsprach meinen Bedürfnissen. Ich brauchte eine einfache Bedingung für eine einfache Notwendigkeit.

Hier ist meine Antwort:

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

Außerdem können Sie ändern , scrollWidthindem an scrollHeightwenn Sie den beiden Fällen zu testen.

Sidney
quelle
1
Danke, das hat bei mir funktioniert. brauchte nur ein einfaches Beispiel in jquery, aber nicht in einfachen js.
mikhail-t
4
funktioniert nicht für Elemente mit Auffüllung / Rand. Verwenden Sie OuterWidth (True) Instread der Breite
Vladimir Shmidt
Funktioniert nicht in dh funktioniert gut in Mozilla und Chrom.
Sushil Kumar
Ich habe einige seltsame Effekte mit diesem Skript. Testen in Chrome. Ich habe es umgeschrieben, um die Höhe zu überprüfen (mit OuterHeight). Wenn ich mit F5 eine Seite neu lade, um das Skript zu überprüfen, oder von einer anderen Seite dorthin navigiere, wird es immer als overflow = true zurückgegeben. Wenn ich jedoch Strg-F5 verwende, wird es angezeigt zurück als Überlauf = falsch. Dies ist beim Testen einer Situation, die falsch zurückkommen soll. Wenn es wahr sein soll, funktioniert es immer.
Dennis
Ok, ich habe es selbst herausgefunden. Ich habe meine Skript-Tags in window.addEventListener ('DOMContentLoaded') eingeschlossen, damit sie mit meiner asynchron geladenen jquery und anderen Dateien funktionieren. Wenn Sie dieses Skript zu diesem Zeitpunkt ausführen, werden anscheinend falsche Messwerte zurückgegeben. Daher habe ich für dieses Skript DOMContentLoaded durch "Laden" ersetzt, um die Ausführung des Skripts weiter zu verzögern. Jetzt werden jedes Mal korrekte Ergebnisse zurückgegeben. Und für meine Zwecke ist es vollkommen in Ordnung, dass es darauf wartet, es auszuführen, bis die Seite geladen ist. Dann kann ich sogar eine Animation hinzufügen, um die Aufmerksamkeit des Benutzers auf eine Schaltfläche "Mehr lesen" zu lenken.
Dennis
4

Also habe ich die überlaufende JQuery-Bibliothek verwendet: https://github.com/kevinmarx/overflowing

Wenn Sie nach der Installation der Bibliothek die Klasse overflowingallen überlaufenden Elementen zuweisen möchten , führen Sie einfach Folgendes aus:

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

Dies gibt dann die Klasse overflowing, wie in <div class="targetElement overflowing">allen Elementen, die überlaufen. Sie können dies dann einem Ereignishandler (Klicken, Mouseover) oder einer anderen Funktion hinzufügen, die den obigen Code ausführt, damit er dynamisch aktualisiert wird.

Maudulus
quelle
3

Teilweise basierend auf Mohsens Antwort (die hinzugefügte erste Bedingung deckt den Fall ab, in dem das Kind vor dem Elternteil versteckt ist):

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

Dann machen Sie einfach:

jQuery('#parent').isChildOverflowing('#child');
Brauliobo
quelle
2

Eine Methode besteht darin, scrollTop gegen sich selbst zu prüfen. Geben Sie dem Inhalt einen Bildlaufwert, der größer als seine Größe ist, und überprüfen Sie dann, ob sein scrollTop 0 ist oder nicht (wenn er nicht 0 ist, hat er einen Überlauf.)

http://jsfiddle.net/ukvBf/

Joseph Marikle
quelle
1

Im Klartext: Holen Sie sich das übergeordnete Element. Überprüfen Sie die Höhe und speichern Sie diesen Wert. Durchlaufen Sie dann alle untergeordneten Elemente und überprüfen Sie ihre individuellen Höhen.

Das ist schmutzig, aber Sie könnten die Grundidee bekommen: http://jsfiddle.net/VgDgz/

Doozer Blake
quelle
1
Es ist ein gutes Beispiel, aber was ist mit der Position. Wenn ein Element ganz oben auf dem übergeordneten Element positioniert ist, kann es überlaufen, selbst wenn die Höhe niedriger als die des übergeordneten Elements ist.
Adeneo
Absolut, es gibt wahrscheinlich einige verschiedene Fälle, die dies verursachen könnten. Nur ein kurzes Beispiel dafür, wo man vielleicht anfangen soll. Op's spezifischer Fall wird wahrscheinlich definieren, worauf geprüft werden muss
Doozer Blake
0

Hier ist eine reine jQuery-Lösung, aber sie ist ziemlich chaotisch:

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

Dies ist die jQuery-Lösung, die für mich funktioniert hat. offsetWidthusw. hat nicht funktioniert.

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

Wenn dies nicht funktioniert, stellen Sie sicher, dass das übergeordnete Element die gewünschte Breite hat (persönlich musste ich es verwenden parent().parent()). Ist positionrelativ zum übergeordneten extra_widthElement . Ich habe es auch hinzugefügt, da meine Elemente ("Tags") Bilder enthalten, für die nur wenig Zeit erforderlich ist Laden, aber während des Funktionsaufrufs haben sie eine Breite von Null, was die Berechnung beeinträchtigt. Um dies zu umgehen, verwende ich den folgenden Aufrufcode:

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

Hoffe das hilft.

Dennis Golomazov
quelle
0

Ich habe dies behoben, indem ich ein weiteres Div in das überlaufende Div eingefügt habe. Dann vergleichen Sie die Höhen der 2 Divs.

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

und die js

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

Das sieht einfacher aus ...

Alex Toader
quelle