Ich muss die Höhe eines Elements ermitteln, das sich in einem versteckten Div befindet. Im Moment zeige ich das Div, erhalte die Höhe und verstecke das übergeordnete Div. Das scheint ein bisschen albern. Gibt es einen besseren Weg?
Ich verwende jQuery 1.4.2:
$select.show();
optionHeight = $firstOption.height(); //we can only get height if its visible
$select.hide();
javascript
jquery
html
css
mkoryak
quelle
quelle
Antworten:
Sie könnten so etwas tun, ein bisschen hackig, vergessen
position
Sie , wenn es bereits absolut ist:quelle
position:relative
, möchten Sie dies natürlich nachher anstelle von festlegenstatic
.Ich hatte das gleiche Problem beim Abrufen der Breite versteckter Elemente, daher habe ich diesen Plugin-Aufruf jQuery Actual geschrieben , um das Problem zu beheben. Anstatt zu verwenden
verwenden
gibt Ihnen den richtigen Wert für verstecktes Element oder Element hat ein verstecktes übergeordnetes Element.
Die vollständige Dokumentation finden Sie hier . Es gibt auch eine Demo auf der Seite.
Ich hoffe das hilft :)
quelle
Sie verwechseln zwei CSS-Stile, den Anzeigestil und den Sichtbarkeitsstil .
Wenn das Element durch Festlegen des CSS-Stils für die Sichtbarkeit ausgeblendet wird, sollten Sie in der Lage sein, die Höhe zu ermitteln, unabhängig davon, ob das Element sichtbar ist oder nicht, da das Element noch Platz auf der Seite einnimmt .
Wenn das Element durch Ändern des Anzeige-CSS-Stils in "Keine" ausgeblendet wird, nimmt das Element keinen Platz auf der Seite ein, und Sie müssen ihm einen Anzeigestil zuweisen, der bewirkt, dass das Element in einem bestimmten Bereich bei gerendert wird An welchem Punkt können Sie die Höhe ermitteln.
quelle
visibility
aufhidden
löste mein Problem nicht, aber es brachte mich auf die Idee, es einzustellen,position: fixed; top: 100%
und es funktioniert wie ein Zauber!Ich habe tatsächlich manchmal auf ein paar Tricks zurückgegriffen, um damit umzugehen. Ich habe ein jQuery-Bildlaufleisten-Widget entwickelt, bei dem ich auf das Problem gestoßen bin, dass ich nicht im Voraus weiß, ob der scrollbare Inhalt Teil eines versteckten Markups ist oder nicht. Folgendes habe ich getan:
Dies funktioniert größtenteils, aber es gibt ein offensichtliches Problem, das möglicherweise auftreten kann. Wenn der Inhalt, den Sie klonen, mit CSS gestaltet ist, dessen Regeln Verweise auf übergeordnetes Markup enthalten, enthält der geklonte Inhalt nicht das entsprechende Design und weist wahrscheinlich leicht unterschiedliche Maße auf. Um dies zu umgehen, können Sie sicherstellen, dass auf das Markup, das Sie klonen, CSS-Regeln angewendet werden, die keine Verweise auf das übergeordnete Markup enthalten.
Dies ist mir bei meinem Scroller-Widget auch nicht aufgefallen. Um jedoch die entsprechende Höhe des geklonten Elements zu erhalten, müssen Sie die Breite auf die gleiche Breite des übergeordneten Elements einstellen. In meinem Fall wurde immer eine CSS-Breite auf das eigentliche Element angewendet, sodass ich mir darüber keine Gedanken machen musste. Wenn auf das Element jedoch keine Breite angewendet wird, müssen Sie möglicherweise eine Art Rekursiv ausführen Durchlaufen der DOM-Abstammung des Elements, um die Breite des entsprechenden übergeordneten Elements zu ermitteln.
quelle
Aufbauend auf der Antwort von Benutzer Nick und dem Plugin von Benutzer hitautodestruct in JSBin habe ich ein ähnliches jQuery-Plugin erstellt, das sowohl Breite als auch Höhe abruft und ein Objekt zurückgibt, das diese Werte enthält.
Es kann hier gefunden werden: http://jsbin.com/ikogez/3/Aktualisieren
Ich habe dieses winzige kleine Plugin komplett neu gestaltet, da sich herausstellte, dass die vorherige Version (oben erwähnt) in realen Umgebungen, in denen viele DOM-Manipulationen stattfanden, nicht wirklich verwendbar war.
Das funktioniert perfekt:
quelle
sizes = {"width": $wrap.width(), "height": $wrap.height()};
diethis
Verweise auf das Originalelement, das nicht sichtbar ist.$wrap
ist in Ordnung (zumindest in meinen Tests). Ich habe es mit dem versuchtthis
und offensichtlich würde es die Größe nicht erfassen, da es sichthis
immer noch auf das versteckte Element bezieht.Aufbauend auf Nicks Antwort:
Ich fand es besser, dies zu tun:
Durch das Festlegen von CSS-Attributen werden diese inline eingefügt, wodurch alle anderen Attribute in Ihrer CSS-Datei überschrieben werden. Durch Entfernen des style-Attributs im HTML-Element wird alles wieder normal und immer noch ausgeblendet, da es an erster Stelle ausgeblendet wurde.
quelle
$("#myDiv").css({'position':'absolute','visibility':'hidden', 'display':'block'}); optionHeight = $("#myDiv").height(); $("#myDiv").css({'position':'','visibility':'', 'display':''});
Sie können das ausgeblendete Div auch mit einem negativen Rand vom Bildschirm positionieren, anstatt die Anzeige zu verwenden: keine, ähnlich wie beim Ersetzen von Bildern mit Texteinzug.
z.B.
Auf diese Weise ist die Höhe () noch verfügbar.
quelle
Ich versuche, eine funktionierende Funktion für versteckte Elemente zu finden, aber mir ist klar, dass CSS viel komplexer ist, als jeder denkt. Es gibt viele neue Layouttechniken in CSS3, die möglicherweise nicht für alle vorherigen Antworten wie flexible Boxen, Raster, Spalten oder sogar Elemente in komplexen übergeordneten Elementen funktionieren.
Flexibox Beispiel
Ich denke, die einzige nachhaltige und einfache Lösung ist das Echtzeit-Rendering . Zu diesem Zeitpunkt sollte der Browser die richtige Elementgröße angeben .
Leider bietet JavaScript kein direktes Ereignis, um zu benachrichtigen, wenn ein Element angezeigt oder ausgeblendet wird. Ich erstelle jedoch eine Funktion basierend auf der DOM Attribute Modified API, die die Rückruffunktion ausführt, wenn die Sichtbarkeit des Elements geändert wird.
Weitere Informationen finden Sie in meinem Projekt GitHub.
https://github.com/Soul-Master/visible.event.js
Demo: http://jsbin.com/ETiGIre/7
quelle
style
Attributänderungen verursacht werden (siehe Zeile 59 hier ), während Sichtbarkeitsänderungen auch durch Änderungen imclass
Attribut verursacht werden können.Nach der Lösung von Nick Craver können Sie durch Einstellen der Sichtbarkeit des Elements genaue Abmessungen erhalten. Ich habe diese Lösung sehr sehr oft verwendet. Da ich die Stile jedoch manuell zurücksetzen muss, finde ich dies umständlich, da ich beim Ändern der anfänglichen Positionierung / Anzeige des Elements in meinem CSS durch Entwicklung oft vergesse, den zugehörigen Javascript-Code zu aktualisieren. Der folgende Code setzt die Stile nicht per say zurück, sondern entfernt die durch Javascript hinzugefügten Inline-Stile:
Die einzige Annahme hier ist, dass es keine anderen Inline-Stile geben kann, sonst werden sie auch entfernt. Der Vorteil hierbei ist jedoch, dass die Stile des Elements auf das zurückgesetzt werden, was sie im CSS-Stylesheet waren. Infolgedessen können Sie dies als eine Funktion aufschreiben, bei der ein Element durchlaufen wird und eine Höhe oder Breite zurückgegeben wird.
Ein weiteres Problem beim Festlegen der Stile inline über js ist, dass Sie beim Umgang mit Übergängen über css3 gezwungen sind, die Gewichte Ihrer Stilregeln so anzupassen, dass sie stärker sind als ein Inline-Stil, was manchmal frustrierend sein kann.
quelle
Per Definition hat ein Element nur dann eine Höhe, wenn es sichtbar ist.
Nur neugierig: Warum brauchst du die Höhe eines versteckten Elements?
Eine Alternative besteht darin , ein Element effektiv auszublenden, indem es hinter einem Overlay (unter Verwendung des Z-Index) platziert wird.
quelle
Unter meinen Umständen hatte ich auch ein verstecktes Element, das mich daran hinderte, den Höhenwert zu erhalten, aber es war nicht das Element selbst, sondern einer seiner Eltern ... also habe ich einfach nach einem meiner Plugins gesucht, um zu sehen, ob es ist versteckt, sonst finde das nächste versteckte Element. Hier ist ein Beispiel:
Tatsächlich ist dies eine Zusammenführung der Antworten von Nick, Gregory und Eyelidlessness, um Ihnen die Verwendung der verbesserten Methode von Gregory zu ermöglichen. Sie verwendet jedoch beide Methoden, falls das Stilattribut etwas enthalten soll, das Sie zurücksetzen möchten, und sucht ein übergeordnetes Element.
Mein einziger Kritikpunkt an meiner Lösung ist, dass die Schleife durch die Eltern nicht ganz effizient ist.
quelle
Eine Problemumgehung besteht darin, ein übergeordnetes Div außerhalb des Elements zu erstellen, dessen Höhe Sie ermitteln möchten, eine Höhe von '0' anzuwenden und einen Überlauf auszublenden. Nehmen Sie als Nächstes die Höhe des untergeordneten Elements und entfernen Sie die Überlaufeigenschaft des übergeordneten Elements.
quelle
Hier ist ein Skript, das ich geschrieben habe, um alle Dimensionsmethoden von jQuery für versteckte Elemente zu behandeln, sogar für Nachkommen versteckter Eltern. Beachten Sie, dass dies natürlich zu einem Leistungseinbruch führt.
quelle
Wenn Sie das Element bereits zuvor auf der Seite angezeigt haben, können Sie die Höhe einfach direkt aus dem DOM-Element übernehmen (in jQuery mit .get (0) erreichbar), da es auch dann festgelegt wird, wenn das Element ausgeblendet ist:
Gleiches gilt für die Breite:
(Danke an Skeets O'Reilly für die Korrektur)
quelle
undefined
display='none'
, funktioniert dies nicht.