2013-07-17 5 views
7

Verwenden Sie entweder Javascript oder jQuery, ich brauche die volle Höhe eines Scroll-Elements. Aber die DOM-Eigenschaft scrollHeightis apparently not 100% reliable.Reliably return Element scrollHeight ohne ScrollHeight Eigenschaft

Ich war vorübergehend das Vorstellungsvermögen Element eine CSS-Höhe von auto geben, seine Größe heraus überprüfen, dann die CSS auf den vorherigen Wert zurückgibt (die selbst Probleme hat - wie bekomme ich die CSS height:100% statt height:1012px wie jQuery .css('height') wird zurückkehren). Aber dann habe ich herausgefunden, dass durch die Art und Weise jQuery CSS-Styling direkt auf ein Element bezieht, einfach mit Anwendung dem Stil '' kehrt es zu seinem normalen Style-Sheet-deklarierten Wert, so theoretisch könnte ich dies tun:

$el.css('height', 'auto'); 
scrollHeight = $el.height(); 
$el.css('height', ''); 

Aber das funktioniert nicht. height:auto überschreibt nicht den ursprünglichen Stil meines Elements 100% und macht das Element seine volle gewünschte Höhe einnehmen.

So denke ich jetzt etwas mehr in diesen Zeilen: Verwenden Sie die Position des oberen Elements des ersten untergeordneten Elements und die Position des unteren Elements des letzten untergeordneten Elements, um die Höhe zu erhalten. (Ich kann für Polsterung und Marge bei Bedarf anpassen, das ist nur ein Proof of Concept ist.)

function scrollHeight($el) { 
    var lastEl = $el.children(':last'); 
    return (
     lastEl.position().top 
     + lastEl.height() 
     - $el.children(':first').position().top; 
    ); 
} 

Einige Arbeiten in der Math.max($el[0].scrollHeight, $el.height()) auch nützlich sein könnte ...

Ist das eine schreckliche Idee? Ich kann nicht die einzige Person sein, die jemals die scrollHeight eines DOM-Elements kennen muss und es zuverlässig sein muss, sich nicht ändern, während das Element gescrollt wird und in allen gängigen Browsern sowie IE 8 funktioniert (obwohl es sein würde interessant zu wissen, eine Lösung für IE 6 & 7).

+1

IE 6 und 7? Sogar Google (ja, sogar auf der weißen Startseite :)) hat die Unterstützung für diese beiden Kerle fallenlassen. –

+0

Könnten Sie uns eine Datei zur Verfügung stellen, die Ihr Problem reproduziert? –

+0

@ RokoC.Buljan Das ist ein ziemlich guter Punkt. Meine eigene Firma verließ IE7 erst im letzten Jahr ... deshalb dachte ich, ich würde gerne wissen, wie ich das unterstützen kann, auch wenn es in der Wildnis knapp wird. Aber ich werde die Frage aktualisieren, um dies zu reflektieren. – ErikE

Antwort

6

Statt

$el.css('height', 'auto');

Try -

$el.attr('style', 'height: auto !important');

ich dies weil Sie erwähnen versuchen sagen -

height: auto ist mein Element der Vorlage nicht überschrieben Stil von 100% und lässt das Element seine volle Höhe einnehmen.

+1

Nun, das zeigt tatsächlich, wo das Problem liegt.Aufgrund der absoluten Position von Vorfahrelementen mit "Höhe" - und "Überlauf" -Werten, die verhindern, dass das Kind seine volle Größe erreicht, funktioniert auch der aktualisierte Vorschlag nicht. Entschuldigen Sie, dass ich diese Information verlassen habe. Ein Kinderspiel wäre eine gute Idee gewesen. – ErikE

+1

Die Verwendung von '.css ('height', 'auto')' wird also gut funktionieren. Ihr Vorschlag ist jedoch exzellent und hat mich in die richtige Richtung gelenkt: Ein bereits existierender Stil verhinderte, dass 'auto' etwas unternimmt. Dieser Stil war "unten: 0; oben: 0', die nicht einmal benötigt wurden. Ich würde mich entschuldigen, dass ich deine Zeit verschwendet habe, aber es war nicht wirklich eine Verschwendung - du hast bis jetzt 35 Wiederholungen bekommen und hast mir bei meinem Problem geholfen, außerdem habe ich etwas gelernt. Vielen Dank! – ErikE

+0

@ErikE Danke, froh, dass ich helfen konnte: ~) – Ross

Verwandte Themen