• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Zwei Elemente auf einer Zeile mit identischen Seitenabständen

thor.a

Neues Mitglied
Zwei Elemente auf einer Zeile mit jeweils selbem Zwischen- und Seitenabstand?

Hallo,

ich habe längere Zeit versucht, das folgende Problem mit css hinzukriegen, aber ohne Erfolg. Meine Anforderungen sind:

  • flexibles Layout (100% width)
  • zwei verschiedene breite (fixe) Elemente sollen auf einer Zeile nebeneinander angeordnet werden
  • der Seitenabstand der Elemente soll immer identisch breit sein, d.h. der Abstand zwischen den Elementen soll genauso breit sein wie der Abstand zu den Rändern
Mit einem klassischen Tabellenlaout war die Umsetzung kein Problem, aber ich würde mich freuen, wenn mir jemand eine Lösung in css aufzeigen könnte.

Hier eine Demo bei jfiddle Edit this Fiddle - jsFiddle
sowie der Code:
HTML:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="de" xml:lang="de">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<style type="text/css">
#mytable {
    width: 100%;
}
#mytable td {
    white-space: nowrap;
}
#mytable td.cnt1 {
    width: 200px;
    background-color: fuchsia;
}
#mytable td.cnt2 {
    width: 160px;
    background-color: silver;
}
#mytable td.dist {
    background-color: #ffeda0;
}
</style>
</head>
<body>
<ul>
  <li>flexibles Layout</li>
  <li>zwei verschieden breite Elemente</li>
  <li>Zwischen- und Seitenabstände der Elemente sollen flexible, aber immer identisch sein</li>
</ul>
<p><a href="http://jsfiddle.net/ptacS/7/" target="_blank">jsfiddle-Demo</a></p>
<table id="mytable">
  <tr>
    <td class="dist">same width</td>
    <td class="cnt1">large Element1 (200px)</td>
    <td class="dist">same width</td>
    <td class="cnt2" >Element 2 (160px) </td>
    <td class="dist">same width</td>
  </tr>
</table>
</body>
</html>

Ich habe versucht, dieses Layout mit so ziemlich allem, was ich bislang über css weiß, umzusetzen, aber ich habe es mit keiner Positionierungsart geschafft, dass der Abstand zwischen den Elementen exakt den Randabständen entspricht.

Vielen Dank für Eure Tipps bzw. für eine Lösung im Voraus!

Thorsten
 
Zuletzt bearbeitet:
Tabellen werden ausschließlich zur Ausgabe tabellarischer Daten verwendet, aber unter gar keinen Umständen als Layouthilfe missbraucht. Ersetze dieses Konstrukt durch zeitgemäße Tags, dann klappt es auch mit dem Design.
 
Du hast Recht; mein Ziel ist natürlich die Ersetzung des Tabellenlayouts durch zeitgemäßes css.

Mein erster Ansatz war, obige Vorgabe in css mit allen möglichen Konstrukten (floats, prozentuale Abstände, Zentrierungen etc.) hinzubekommen. Nur habe ich es nicht geschafft, die Anforderung (Zwischenabstand = Seitenabstände mit Elementen mit fixer Breite) mit reinem css umzusetzen. Die Umsetzung mittels Layouttabellen war mein letzter Versuch - mit positivem Ergebnis nach ca. 3 min.

Daher hier meine Frage, ob es nicht doch irgendwie mit css geht. Möglicherweise ist die Aufgabe nicht so trivial, wie sie auf Anhieb erscheint.

Würde mich über einen Lösungsansatz freuen.

Thorsten
 
Hi,
ich hatte auch mal mein ein ähnliches Problem.

Bei mir war es damals aber eine einzeilige Navigation am unteren Rand, die absolute festgelegt wurde (hier ohne Links, sondern nur als Tabelle),die ich mit gewünschter Gleichmäßigkeit dargestellt haben wollte und diese gab mir Float leider nicht.

Erst wollte ich da auch eine Tabelle nutzen, da es somit einfacher ist. Aber die sollte man ja nicht nutzen.

Dann bin ich damals auf display gestoßen. Denn hiermit kann man amüsanter Weise aus sämtlichen Elementen eine Tabelle erstellen. Über Sinn und Unsinn lässt sich natürlich streiten.

Da ich Links darstellen wollte hatte ich eine ungeordnete Liste genommen und mit Spalten versehen.
Natürlich könnte man auch verschachtelte Divs oder irgendetwas anderes, passenderes nehmen.

Vielleicht hilft es dir ja weiter? Wenn auch nur von der Idee her. ^^

HTML-Code
Code:
<div id="menu">
     <ul>[INDENT=2]<li class="menu_td">Lorem</li>         
<li class="menu_td"></li>
<li class="menu_td">Ipsum</li>
<li class="menu_td"></li>
<li class="menu_td">Dolores </li>[/INDENT]
[INDENT]</ul>[/INDENT]
</div>

CSS-Code;
Code:
#menu {
    position: absolute; 
    bottom: 5px;
    left: 100px;
    width: 595px;
    height: 55px;
    
    margin: 0px;
    padding: 0px;
    
    display: inline-table;
}
#menu li{
    list-style: none;
    line-height: 55px;
    text-align: center;
}

.menu_td{
    display: table-cell;
    min-width: 15%;
    max-width: 120px;
    empty-cells: hide;
}
 
Wie mein Vorposter auch schon schrieb, kannst du es mit display machen. Zwar nicht unbedingt in einem Menü. display: inline;

Hier mal eine kleine Testseite.
Code:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Unbenanntes Dokument</title>

<style type="text/css">
#test {
    display: inline;
}


</style>
</head>

<body>
<div id="test">test1</div><div id="test">test1</div><div id="test">test1</div><div id="test">test1</div>
</body>
</html>
 
Zuletzt bearbeitet:
Danke. Ich habe das mal ausprobiert, aber das ist scheint leider keine Lösung für meine Problemstellung zu sein.

FALLS das tatsächlich mit inline-table klappen sollte, wäre das natürlich absurd: Vermeidung des legacy-Tabellenlayouts durch Einführung von css-Tabellen...

Ich hatte eher auf eine klassische css-Lösung gehofft. Habe aber mittlerweile den Eindruck, dass es diese gar nicht gibt, sondern nur Annhäherungen daran. Aber vielleicht sieht ja noch ein CSS-Guru meine Frage und fühlt sich gefordert!

Thorsten
 
Ich habe mit Eurem Lösungsvorschlag es leider nicht erreicht, eine Verteilung der Elemente so hinzukriegen, dass die Abstände identisch sind. Hier noch mal ein Screenshot, der das Problem verdeutlicht:

cssproblem.jpg

Wäre nett, wenn Ihr dieses Beispiel mit Eurer Methode mal hinkriegen könntet. Ich habe es nicht geschafft. Wichtig ist, dass der gelbe Bereich (same width) sich dem Viewport anpasst und die beiden "boxen" eine fixe Breite haben.

Thorsten
 
Wie wäre es, wenn du deine Conatiner mal floatest. Denke aber daran, dass du später wieder clearst.

;D
Code:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de">
<head>
    <title>Float / Clear</title>
<style type="text/css">
<!--

#inhalt-1 { background: #0000ff; float: left; width: 200px; }
#inhalt-2 { background: #ff0000; float: left; width: 100px; margin-left: 20px;  }
#inhalt-3 { background: #FF0; float: left; width: 150px; margin-left: 20px;  }


-->
</style>
</head>
<body>

  <div id="inhalt-1">
    Inhalt 1
  </div>
  <div id="inhalt-2">
    Inhalt 2
  </div>
    <div id="inhalt-3">Inhal</div>


</body>
</html>
 
Danke für Deinen Beitrag. Allerdings ändern sich bei Dir nicht die Zwischenabstände zwischen den Elementen, da Du sie mit margin-left fest eingestellt hast. Diese Abstände sollen flexibel sein. Ich habe meine Anforderungen offenbar nicht eindeutig beschrieben, sorry.

Hier noch einmal meine Anforderungen, etwas besser formuliert:

  1. zwei verschieden breite Elemente sollen auf einer Zeile nebeneinander angeordnet werden
  2. der Abstand zwischen den Elementen soll immer genauso groß sein wie der jeweilige Randabstand des linken bzw. rechten Elementes zum Fensterrand
  3. Bedingung Nr. 2 soll bei unterschiedlichen Fenstergrößen funktionieren (flexibles Layout); die Zeile dehnt sich also zu 100% über das ganze Fenster aus
Die Elemente werden also gleichmäßig auf der Seite angeordnet, auch wenn sich die Fenstergröße ändert. Die Zwischenabstände und Seitenabstände sind variabel, aber immer gleich breit.

Mit prozentualen Abständen ist das nicht lösbar, da die Elemente unter Punkt 1 eine feste Breite besitzen.

Ich hoffe, es ist jetzt klarer beschrieben. Bitte probiere es mit dem ursprünglichen Layout-Tabellendesign im ersten Beitrag selbst aus; das ist exakt, was ich mit CSS erreichen möchte.

Thorsten
 
Hmm, eigentlich löst man so etwas wirklich mit width in %, Aber falls das bei dir aus irgendwelchen Gründen nicht klappen sollte, mach es doch über jQuery.

Nach deinem Screenshot zu urteilen, hat die large box eine width von 2/12, die small box 1/12 und die Abstände dazwischen jeweils 3/12 des Bodys. In jQuery lassen sich Funktionen wie width() und outerWidth() nicht nur auf das document, sondern auf jedes Element mit einem HTML- oder CSS-Selektor anwenden. Damit kann man eine einfache Formel für pixelgenaue Formatierung erstellen.
 
Da ich mich bislang nicht in jQuery eingearbeitet habe, werde ich diesen Ansatz zurzeit jemand anderem überlassen müssen.

Ist schon sehr interessant: Ein simples Tabellenlayout, in ca. 2 min geschrieben, scheint mit einfachen CSS-Selektoren nicht realisierbar zu sein, sondern bedarf zur Laufzeit eines separaten Frameworks mit permanenter Neuberechnung der Positionierung. Und funktioniert ohne Javascript natürlich überhaupt nicht. Habe ich eigentlich nicht erwartet.


Zur Motivation dieser Aufgabenstellung:
Das Ganze ist keine rein akademische Frage, sondern ein konkretes Problem, welches bei der Umsetzung eines vorgegebenen Designs auf einer Webseite aufgetaucht ist. Die beiden Elemente mit fixer Breite sind vorgegebene grafische Elemente, die sich auf einer Zeile auch bei unterschiedlich breiten Browserfenstern gleichmäßig auf dieser Zeile verteilen sollen. Wie gesagt: mit verpöntem Tabellenlayout einfach umsetzen.

Vielleicht hat ja jemand noch gelegentlich eine Idee, die jquery-unabhängig funktioniert.

Thorsten
 
Bei einem Tabellenlayout verteilt sich die Spaltenbreite by Default gleichmäßig nach Anzahl der <td> Elemente. Für abweichende Werte muss man selber Hand anlegen, und ähnlich verhält es sich mit der Formatierung beliebiger HTML-Elemente via CSS. Dass du es nicht hinbekommst, bedeutet nicht zwangsläufig, dass so etwas unmöglich wäre. Der Ansatz mit jQuery oder JavaScript war hingegen nur als Hilfskonstrukt gedacht, aber wenn es für dich zu komplex sein sollte, damit eine einfache Formel zu erstellen, wirst du dich wohl noch weiter in die Materie vertiefen müssen.
 
Dass du es nicht hinbekommst, bedeutet nicht zwangsläufig, dass so etwas unmöglich wäre.
Ich habe auch nicht behauptet, dass es unmöglich sei. Ich habe hier im Forum um Hilfe zu meinem Problem gebeten, aber bislang leider keine befriedigende Antwort bekommen. Und ich würde eine Lösung ohne jQuery bevorzugen.

Falls Du denkst, die Problemstellung ist zu simpel, dann wird es Dich ja nur ein Lächeln kosten, kurz mal die Lösung zu posten. Würde mich sehr freuen, da ich dann auf das Tabellenlayout verzichten kann. Ich habe nach diversen Stunden Herumexperimentierens aufgegeben, für diese Aufgabenstellung eine Lösung in css zu finden. Sieht alles sehr simpel aus. Ist es aber nicht. (Vielleicht ist es aber simpel mit jQuery; daran hatte ich bislang noch nicht gedacht.)

Thorsten
 
Edit this Fiddle - jsFiddle

Oder so ...
Ich fand das Problem relativ interessant nachdem ich daran gescheitert bin das mit CSS zu lösen habe ich etwas in JS herumexperimentiert.
Der Code ist relativ Quick'n Dirty funktioniert aber.

Spontan (und auch nach längerem experimentieren) würde mir momentan keine Lösung in reinem CSS einfallen.

Es lassen sich übrigens beliebig viele Elemente da reinsetzen.
 
Danke für Deine Lösung! Scheint also keine reine CSS-Lösung zu geben; ich habe offenbar Talent dazu, Problemfälle zu finden...

Ist vmtl. eine gute Gelegenheit für mich, mich endlich jQuery zu nähern. Ich hoffe, ich werde nach einiger Einarbeitung Deinen kompletten Code verstehen!

Thorsten
 
Wie wäre es hiermit?

HTML:
<!DOCTYPE html>
<html>
<head>
	<style type="text/css">
	body {
		width: 100%;
	}
	div {
		height: 50px;
		float: left;
	}
	#small-box, #large-box {
		background: red;
	}
	#small-box {
		width: 7%
	}
	#large-box {
		width: 18%;
	}
	.spacer {
		width: 25%;
		background: yellow;
	}
	</style>
</head>
<body>
<nav>
	<div class="spacer"></div>
	<div id="large-box"></div>
	<div class="spacer"></div>
	<div id="small-box"></div>
	<div class="spacer"></div>
</nav>
</body>
</html>
 
Hallo Tronjer,

meine Anforderungen lauten aber anders:

- die mittlerern, zu verteilenden Boxen haben eine beliebige, aber vor allem fixe Breite, und keine relative.

Sorry, falls ich diese Anforderung aus meinem ersten Beitrag nicht klar und deutlich herausgestellt habe. Jetzt dürfte es aber klar sein.

Mit relativer Breite für die zu verteilenden Boxen ist das natürlich ein Kinderspiel; da hätte ich hier nicht gewagt zu fragen. Nochmal zur Motivation: die zu verteilenden Boxen sind grafische Element mit natürlich fester Breite. Stell Dir einfach zwei Logos vor. Das geht nicht mit relativer Breite.

Thorsten
 
Ok, dann hatte ich die Frage tatsächlich falsch verstanden. Ein anderer Ansatz als jQuery würde mir dazu jetzt auf Anhieb auch nicht einfallen, und dazu hat Space Cookie ja bereits eine Lösung gepostet.

Wobei eigentlich auch nichts gegen jQuery spricht, solange du keine Seite große kommerzielle Seite betreibst, die unbedingt auch noch den letzten IE7-User mit abgeschaltetem JS einfangen will. Das Problem habe ich gerade bei meinem aktuellen Projekt.

Schau dir dieses Framework ruhig mal an, mit vorhandenen CSS-Kenntnissen solltest du dich darin ziemlich schnell zurechtfinden.
 
Zurück
Oben