Es scheint wie in jQuery, wenn ein Element nicht sichtbar ist. Width () gibt 0 zurück. Sinnvoll, aber ich muss die Breite einer Tabelle abrufen, um die Breite des übergeordneten Elements festzulegen, bevor ich das übergeordnete Element zeige.
Wie unten erwähnt, enthält das übergeordnete Element Text, der das übergeordnete Element schief macht und böse aussieht. Ich möchte, dass das übergeordnete Element nur so breit wie die Tabelle ist und der Text umbrochen wird.
<div id="parent">
Text here ... Can get very long and skew the parent
<table> ... </table>
Text here too ... which is why I want to shrink the parent based on the table
</div>
CSS:
#parent
{
display: none;
}
Javascript:
var tableWidth = $('#parent').children('table').outerWidth();
if (tableWidth > $('#parent').width())
{
$('#parent').width(tableWidth);
}
tableWidth gibt immer 0 zurück, da es nicht sichtbar ist (ist meine Vermutung, da es mir eine Zahl gibt, wenn es sichtbar ist). Gibt es eine Möglichkeit, die Breite der Tabelle zu ermitteln, ohne das übergeordnete Element sichtbar zu machen?
quelle
clone.css("visibility","hidden");
umclone.css({"visibility":"hidden", "display":"table"});
das Problem zu beheben, auf das @Dean#some wrapper .hidden_element{/*Some CSS*/}
Du machst das :body .hidden_element
. Das#some_wrapper .hidden_element
wird nicht mehr benutzt! Infolgedessen kann Ihre berechnete Größe von der ursprünglichen Größe abweichen. TLTR: Sie verlieren nur StileBasierend auf Roberts Antwort ist hier meine Funktion. Dies funktioniert bei mir, wenn das Element oder sein übergeordnetes Element über jQuery ausgeblendet wurde, entweder innere oder äußere Dimensionen abrufen kann und auch die Versatzwerte zurückgibt.
/ edit1: Die Funktion wurde neu geschrieben. Es ist jetzt kleiner und kann direkt auf dem Objekt aufgerufen werden
/ edit2: Die Funktion fügt jetzt den Klon direkt nach dem ursprünglichen Element anstelle des Körpers ein, sodass der Klon geerbte Dimensionen beibehalten kann.
quelle
Vielen Dank, dass Sie die realWidth-Funktion oben veröffentlicht haben. Sie hat mir wirklich geholfen. Basierend auf der obigen "realWidth" -Funktion habe ich einen CSS-Reset geschrieben (Grund unten beschrieben).
"realWidth" erhält die Breite eines vorhandenen Tags. Ich habe dies mit einigen Bild-Tags getestet. Das Problem war, wenn das Bild eine CSS-Dimension pro Breite (oder maximale Breite) angegeben hat, erhalten Sie nie die tatsächliche Dimension dieses Bildes. Vielleicht hat das Bild "max-width: 100%", die "realWidth" -Funktion klont es und hängt es an den Körper an. Wenn die Originalgröße des Bildes größer als der Körper ist, erhalten Sie die Größe des Körpers und nicht die tatsächliche Größe dieses Bildes.
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
Wenn Sie die Breite von etwas benötigen, das verborgen ist, und Sie es aus irgendeinem Grund nicht ausblenden können, können Sie es klonen, das CSS so ändern, dass es auf der Seite angezeigt wird, es unsichtbar machen und es dann messen. Der Benutzer ist nicht klüger, wenn er danach ausgeblendet und gelöscht wird.
Einige der anderen Antworten hier machen die Sichtbarkeit nur ausgeblendet, was funktioniert, aber sie nimmt für den Bruchteil einer Sekunde einen leeren Punkt auf Ihrer Seite ein.
Beispiel:
quelle
Bevor Sie die Breite nehmen, lassen Sie die übergeordnete Anzeige anzeigen, nehmen Sie dann die Breite und lassen Sie die übergeordnete Anzeige schließlich ausblenden. Genau wie beim Folgen
quelle
Eine Lösung, die nicht in allen Situationen funktioniert, besteht darin, das Element auszublenden, indem die Deckkraft auf 0 gesetzt wird. Ein vollständig transparentes Element hat eine Breite.
Der Nachteil ist, dass das Element immer noch Platz beansprucht, aber das ist nicht in allen Fällen ein Problem.
Beispielsweise:
quelle
Das größte Problem, das von den meisten Lösungen hier übersehen wird, ist, dass die Breite eines Elements häufig durch CSS geändert wird, je nachdem, wo es sich in HTML befindet.
Wenn ich offsetWidth eines Elements durch Anhängen eines Klons an den Body bestimmen würde, wenn es Stile enthält, die nur in seinem aktuellen Bereich gelten, würde ich die falsche Breite erhalten.
beispielsweise:
// css
.module-container .my-elem {Rand: 60px festes Schwarz; }}
Wenn ich jetzt versuche, die Breite meines Elems im Kontext des Körpers zu bestimmen, wird sie um 120 Pixel größer sein. Sie könnten stattdessen den Modulcontainer klonen, aber Ihr JS sollte diese Details nicht kennen müssen.
Ich habe es nicht getestet, aber im Grunde scheint die Lösung von Soul_Master die einzige zu sein, die richtig funktionieren könnte. Wenn man sich die Implementierung ansieht, ist die Verwendung wahrscheinlich teuer und die Leistung schlecht (wie die meisten der hier vorgestellten Lösungen auch).
Wenn möglich, verwenden Sie stattdessen Sichtbarkeit: versteckt. Dadurch wird das Element weiterhin gerendert, sodass Sie die Breite ohne großen Aufwand berechnen können.
quelle
Zusätzlich zu der Antwort von Tim Banks , die zur Lösung meines Problems folgte, musste ich eine einfache Sache bearbeiten.
Jemand anderes könnte das gleiche Problem haben; Ich arbeite mit einem Bootstrap-Dropdown in einem Dropdown. Der Text kann jedoch an dieser Stelle breiter sein als der aktuelle Inhalt (und es gibt nicht viele gute Möglichkeiten, dies durch CSS zu beheben).
Ich benutzte:
Stattdessen wird der Container auf eine Tabelle gesetzt, deren Breite immer skaliert, wenn der Inhalt breiter ist.
quelle
Beim Hover können wir die Listenelementhöhe berechnen.
quelle
Wie bereits erwähnt, garantiert die Methode zum Klonen und Anhängen an anderer Stelle nicht die gleichen Ergebnisse, da das Styling unterschiedlich sein kann.
Unten ist mein Ansatz. Es wandert die Eltern hinauf und sucht nach dem Elternteil, der für das Verstecken verantwortlich ist. Anschließend wird es vorübergehend ausgeblendet, um die erforderliche Breite, Höhe usw. zu berechnen.
quelle