Strecken Sie ein Blockelement so aus, dass es 100% der vertikalen Bildlaufhöhe des übergeordneten Elements ausfüllt

8

Ich habe ein Layout mit einer vertikalen Bildlaufleiste. Eines der untergeordneten Elemente im scrollbaren div wird absolut mit einem großen oberen Wert positioniert, wodurch eine vertikale Bildlaufleiste auf dem übergeordneten Element ausgelöst wird. Das scrollbare Eltern-Div hat auch einige Child-Div-Elemente (wir nennen sie Säulen), die horizontal nebeneinander über position: absolute und einige linke Werte positioniert sind.

Hier ist das HTML-Markup:

%Vor%

und das CSS:

%Vor%

Ich möchte, dass die Pfeiler-Divs die gesamte Bildlaufhöhe des übergeordneten "Containers" erfassen. Im Moment ist ihre Höhe die Client-Höhe der Eltern (nicht Scroll-Höhe). Wenn Sie also nach unten scrollen, werden Sie feststellen, dass die Säulen nicht die gesamte verfügbare Höhe innerhalb des Überlaufs ausfüllen: scrollen.

Kann jemand Änderungen an CSS-Klassen ( .container und / oder .pillar ) vorschlagen, damit dies funktioniert?

Hier ist ein Link zu js fiddle, der das gleiche Problem zeigt: Ссылка

Danke!

    
Ashwin Prabhu 05.05.2015, 12:38
quelle

3 Antworten

6

Nach vielen Experimenten und Haarziehen habe ich schließlich herausgefunden, dass es keine perfekte CSS-Lösung für dieses Problem gibt. Ich würde es lieben, wenn jemand mir das Gegenteil beweisen kann.

Das Problem, so wie ich es verstehe, ist, dass es kein Weg über reine Cross-Browser-kompatible CSS gibt, damit ein Kindelement 100% vertikal streckt, um seine Eltern zu füllen scrollHeight, wenn die Elternhöhe nicht explizit definiert ist .

Mit der obigen Schlussfolgerung habe ich das Problem dadurch gelöst, dass ich ein Div-Element mit expliziter Größe unter den Scroll-Container platziert habe und eine explizite Mindesthöhe auf die Säulen gesetzt habe. Ich kann die Höhe dieses neuen Übergangsdivs über JavaScript berechnen.

Hier ist das modifizierte HTML-Markup (nur das fixedMinHeight-div ist neu)

%Vor%

und das CSS (.stretchFixed ist eine Ergänzung von früher)

%Vor%

Hier ist der Link zu den Änderungen: Ссылка

Alternativ kann das gleiche Schema für jede einzelne Säule angewendet werden, wodurch keine DOM-Einführung erforderlich ist.

Ich würde gerne falsch bewiesen werden, aber für die Zeit kann ich mit dieser Problemumgehung leben.

    
Ashwin Prabhu 07.05.2015, 10:15
quelle
2

Das div .pillar wird mit position:absolute angegeben, also nimmt es keine Höhe entsprechend dem übergeordneten Element, d. h. .container .

Entfernen Sie einfach position:absolute von css von .pillar .

Hier ist der FIDDLE .

Änderungen in CSS:

%Vor%

Ich habe eine Breite von 32% angegeben, weil die aktuell verwendeten Rahmen nicht in die angegebene Breite passen. Außerdem gibt es no next , um die Werte für left jetzt explizit für jede der Säulen anzugeben. Also habe ich diese Werte gerade außer Kraft gesetzt.

BEARBEITEN : Ich habe es falsch verstanden. Jetzt ist hier der korrigierte.

Geben Sie die Höhe der Säule als 100vmax an. Diese Einheit wird es 100/100 Größe des Ansichtsfensters geben, wie ich verstanden habe. Obwohl das Protokoll noch nicht gemachte Werte für die Höhen zeigt. Aber ich denke, das ist nah genug. Auch die blaue Box kommt in die Quere.

Sieh dir die FIDDLE an.

%Vor%     
Kunjan Thadani 05.05.2015 12:51
quelle
2

Hier sind die Lösungen in meinem Kopf. Ich denke, Sie müssen entweder ein Wrapper-Div im Container hinzufügen:

%Vor%

Oder Sie müssen allen Säulen eine bestimmte Höhe hinzufügen. Dies liegt daran, dass Sie height:100% für die Säule verwenden. Es entspricht also dem nächsten Element, für das eine Höhe angegeben wurde. Darüber hinaus weiß ich nicht, ob es aufgrund Ihrer Szenarioanforderung erforderlich ist, dass Sie .stretch div hinzufügen müssen. Für diesen Fall brauchen Sie dieses Div nicht. Der folgende Code tut das Gleiche wie deines.

%Vor%     
Kangaroo.H 08.05.2015 18:58
quelle