Hi-de-ho
Diese Woche hatte ich auf Arbeit ein ungewöhnliches Problem, mit dem ich an die Grenzen von CSS gestoßen bin. Ich bekam die Aufgabe einige Screendesigns umzusetzen, an sich nichts Ungewöhnliches, allerdings gab es einige Bedingungen bezüglich der Sidebar: ein Widget – also eine Box innerhalb der Sidebar – sollte sich immer am unteren Rand der Sidebar aufhalten, wobei Sidebar und Content immer gleich hoch sein sollten, je nachdem, welches der beiden höher ist.
Das Problem
Ich dachte also erstmal nach, wie ich die beiden Teilprobleme lösen könnte. Eine Box an den unteren Rand einer anderen Box zu schieben ist einfach zu lösen. Die Sidebar bekäme ein position:relative
und das Widget position:absolute
sowie einen kleinen Wert für bottom
. Wie lässt man jedoch Content und Sidebar gleich hoch sein? Dafür gibt es verschiedene Ansätze. Man könnte zum Beispiel eine Tabelle benutzen oder man suggeriert das Ganze (faux columns), indem man eine Hintergrundgrafik benutzt.
Ich konnte keine Tabelle benutzen, weil man position:relative
auf td
Tags nicht anwenden kann und die andere Variante viel weg, weil ich wirklich zwei gleich hohe DIVs brauchte. Da saß ich also und hatte ein schier unlösbares Problem.
“Man müsste irgendwie abfragen können, wie hoch die beiden DIVs sind und sie dann entsprechend anpassen.”, hab ich mir gedacht und hatte damit die Lösung schon gefunden. Nach Absprache mit einem Kollegen stand fest: Mir bleibt nichts anderes übrig als JavaScript zu benutzen.
Die Lösung
Ich entschied mich für jQuery, das sich in einigen anderen Projekten bereits als extrem nützlich und vielseitig erwiesen hatte. Es ist außerdem sehr einfach zu erlernen und bringt neben einer guten Dokumentation auch viele coole Plugins mit sich. “Die ganze Bibliothek nur für eine simple Abfrage?”, wird sich mancher an dieser Stelle denken. Ja. Natürlich geht das auch mit reinem JavaScript aber da ich jQuery auch noch an anderer Stelle im Template gebraucht habe, wäre es dumm gewesen, die jQuery Funktionen nicht zu nutzen.
Ich habe also die aktuelle jQuery Version eingebunden und mir dann kurz überlegt, was mein Script machen muss:
- Hol dir die Höhe der Sidebar und die Höhe des Contents
- Vergleiche beide Werte und bilde das kleinste gemeinsame Vielfache (kgV)
- Setze die Höhe der beiden DIVs auf das kgV
Die Umsetzung
Soweit zur Theorie, kommen wir zur Praxis:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | //sync height of Content and Sidebar function syncheight(){ //Reset auf 'auto' $('#content').height('auto'); $('#sidebar').height('auto'); //hole aktuelle Werte var contentheight = $('#content').height(); var sidebarheight = $('#sidebar').height(); var fullheight; //vergleiche beide Hoehen, bilde kleines gemeinsames Vielfaches if (contentheight>=sidebarheight || contentheight==sidebarheight) { fullheight = contentheight; } else { fullheight = sidebarheight; }; //setze beide auf gleiche Hoehe $('#content').height(fullheight); $('#sidebar').height(fullheight); } |
Das ist die ganze Funktion. #content
und #sidebar
stehen für die ID des Contents bzw. der Sidebar. Hinzu kam noch das Zurücksetzen der beiden Höhen auf den Wert auto
. Das ist notwendig, will man später die Funktion in einem anderen JavaScript aufrufen. Möchte man, dass die Funktion automatisch aufgerufen wird, nachdem die Seite geladen ist, muss man die Funktion noch in eine document.ready
– Funktion legen:
1 2 3 | $(document).ready(function() { //hier die Funktion rein }); |
Durch diese Funktion wartet der Browser bis die Seite vollständig aufgebaut wurde und führt dann erst das Script aus.
Demo
Mein Problem war gelöst, mein Chef zufrieden und ich denke mal, dem einen oder anderen könnte die kleine Funktion auch helfen.
Viel Spaß wünsch ich damit
9 Kommentare RSS
Also mit einer Table würde es schon gehen
http://kaloeffel.ka.funpic.de/Krams/table.html
ja, notfalls hätte ich sowas machen müssen.. aber als extra td ist das ja alles nicht mehr so schön flexibel, wie es mit DIVs ist und außerdem sind tabellen ja eh doof
danke trotzdem für das gute beispiel
Tabelle wäre aber für dieses Problem heutzutage auch nicht mehr wirklich zeitgemäß.
Und JS kann deaktiviert werden, ich denke in diesem Fall ist es einfach Geschmackssache.
Das Ganze ist jetzt schon etwas lange her, wie ich sehe, trotzdem hoffe ich, dass diese Webseite hier noch aktiv ist
Auf jeden Fall benötige ich Hilfe. bei mir will das nicht funktionieren. Kann es daran liegen, dass mein Code ein Joomla Template ist? habe es aber selber gemacht, sollte wie eine richtige Seite funktionieren :/
was von den oben genannten Sachen hast du denn umgesetzt?
Hallo Norman,
erst einmal vielen Dank für deine Überlegungen auf dieser Seite!
Habe gerade eben deine Anleitung befolgt – but it didn’t work out.
Will sagen, die rechte (bei mir) sidebar und der content bleiben unverändert (php script).
Wahrscheinlich liegt es an meiner Umsetzung – bei Interesse maile ich Dir mein script.
Gruß
Ralph
Ja sehr nützlich,
es funktioniert prima.
Alternativ habe ich das Container-Problem schon mal mit einer Grafik gelöst indem ich einen Pixelstreifen im Content der unter den Beiden content_left und content_right liegt mit repead-y habe.
MfG
3mutable…
…