Bringen Sie mich bitte direkt zu den Lösungen.
Eine horizontale Reihe von Objekten zu erstellen, die gleichmäßig voneinander entfernt sind, ist eine weitere dieser Aufgaben im Webdesign, die viel schwieriger ist, als sie sein sollte. Dies kann sehr nützlich sein, insbesondere in Layouts mit fließender Breite, wenn Sie den horizontalen Platz optimal nutzen möchten.

Hier sind die Ziele, die wir erreichen wollen
- Das am weitesten links stehende Objekt ist linksbündig mit seinem Elternelement ausgerichtet.
- Das am weitesten rechts stehende Objekt ist rechtsbündig mit seinem Elternelement ausgerichtet.
- Jedes Objekt ist stets gleichmäßig voneinander entfernt.
- Die Objekte überlappen sich nicht, wenn sich das Browserfenster verengt.
- Die Objekte springen nicht nach unten, wenn sich das Browserfenster verengt.
- Die Technik funktioniert in einer fließenden Umgebung. Selbst wenn sie zentriert ist.
Ich habe verschiedene Techniken ausprobiert, um dies zu erreichen. Gehen wir durch all meine Fehlschläge und dann zur endgültigen Technik, die ziemlich gut zu funktionieren scheint.
FEHLSCHLAG: Jedem Objekt eine prozentuale linke Position geben
Zuerst gab ich jedem Bild eine eindeutige Klasse
<img src="images/shape-red.png" class="first-r">
<img src="images/shape-green.png" class="second-r">
<img src="images/shape-yellow.png" class="third-r">
<img src="images/shape-blue.png" class="fourth-r">
Dann gab ich diesen Klassen eine prozentuale linke Positionierung
img.first-r { left: 0%; position: relative; }
img.second-r { left: 25%; position: relative; }
img.third-r { left: 50%; position: relative; }
img.third-r { left: 75%; position: relative; }
Beachten Sie die relative Positionierung. Diese ist erforderlich, damit das am weitesten links stehende Bild das Elternelement berücksichtigt, vorausgesetzt, der Inhalt ist zentriert und nicht linksbündig. Das Problem dabei ist, dass der linke Rand, der auf das am weitesten rechts stehende Objekt angewendet wird, 75 % der Breite des Browserfensters beträgt, aber beginnend links vom Elternelement und nicht vom Browserfenster aus angewendet wird. Dies kann dazu führen, dass das am weitesten rechts stehende Element vom Bildschirm verschwindet (ohne den rechten Rand des Elternelements zu beachten). Außerdem springen diese Elemente unerklärlicherweise irgendwann um, wenn Sie das Browserfenster ausreichend verengen.
Wenn Sie hier zur absoluten Positionierung wechseln, lösen Sie einige der oben genannten Probleme, aber dann sind Ihre Objekte linksbündig und ignorieren die linke Position des Elternelements vollständig. Außerdem überlappen sich die Bilder bei ausreichend schmalen Browserfenstergrößen. Aber hey, zumindest waren die Objekte gleichmäßig verteilt!
FEHLSCHLAG: Den Objekten einen gemeinsamen linken prozentualen Rand geben
Mein nächster Versuch war, jedem Element, mit Ausnahme des ersten, einen gemeinsamen prozentualen linken Rand zu geben.
<span class="do-not-wrap">
<img src="images/shape-red.png">
<img src="images/shape-green.png" class="mover">
<img src="images/shape-yellow.png" class="mover">
<img src="images/shape-blue.png" class="mover">
</span>
Anwenden des Rands
img.mover {
margin-left: 15%;
}
Sie sollten anhand des prozentualen Wertes erkennen können, dass diese Technik zum Scheitern verurteilt ist. Ich habe nur einen Prozentwert gewählt, der am besten zu funktionieren schien. Mir fiel nichts Mathematisches ein, das hier funktionieren würde. Da das Elternelement ein Prozentsatz der Breite des Browserfensters ist und der Rand ein Prozentsatz des Browserfensters und nicht des Elternelements ist, sind die Wachstumsraten sehr schwer abzugleichen. Beachten Sie auch den "no-wrap"-Span, der notwendig ist, um... warten Sie es ab... Umbruch zu verhindern. Aber hey, zumindest waren die Objekte gleichmäßig verteilt!
FEHLSCHLAG: Verwenden Sie einfach eine Tabelle!
Selbst wenn man CSS aufgibt, scheint es hier nicht zu funktionieren. Ich dachte, das würde sicher funktionieren, da Tabellen die manchmal nützliche, manchmal ärgerliche Fähigkeit haben, ihre Zellen automatisch gleichmäßig zu verteilen.
<table>
<tr>
<td class="leftalign">
<img src="images/shape-red.png">
</td>
<td>
<img src="images/shape-green.png">
</td>
<td>
<img src="images/shape-yellow.png">
</td>
<td class="rightalign">
<img src="images/shape-blue.png">
</td>
</tr>
</table>
Beachten Sie die zusätzlichen Ausrichtungsklassen in der ersten und letzten Zelle. Wenn alle Zellen zentriert sind, können die Objekte gleichmäßig verteilt werden, aber weder das linke noch das rechte Objekt ist am Rand des Elternelements ausgerichtet. Dies ist lösbar, indem der äußersten linken Zelle eine linke Ausrichtung und der äußersten rechten Zelle eine rechte Ausrichtung zugewiesen wird – aber dann sind die Objekte nicht mehr gleichmäßig verteilt. Zurück an den Zeichentisch.
BESTANDEN: Flexbox-Justierung
<div class="container">
<div></div>
<div></div>
<div></div>
<div></div>
</div>
.container {
display: flex;
justify-content: space-between;
}
Siehe den Pen Equidistant Objects von Chris Coyier (@chriscoyier) auf CodePen.
BESTANDEN: Zuerst links, den Rest rechts in gleich großen Boxen schweben lassen
Glücklicherweise hat die Tabellenidee zu einigen Überlegungen angeregt. Das erste Bild muss linksbündig ausgerichtet sein, aber alle anderen könnten rechtsbündig ausgerichtet sein. Tatsächlich, wenn sie es sind und auch in Boxen liegen, die den restlichen Platz gleichmäßig aufteilen, könnte das ausreichen. Vielleicht lässt sich das am besten visuell erklären

HTML
<img src="images/shape-red.png">
<div id="movers-row">
<div><img src="images/shape-green.png"></div>
<div><img src="images/shape-yellow.png"></div>
<div><img src="images/shape-blue.png"></div>
</div>
CSS
#movers-row {
margin: -120px 0 0 120px;
}
#movers-row div {
width: 33.3%;
float: left;
}
#movers-row div img {
float: right;
}
Es gibt eine Beispielseite, auf der ich daran gearbeitet habe. Sie ist nicht schön... aber Sie können den Gewinner unten sehen. Ich bin sicher, einige von Ihnen haben bessere Lösungen dafür, also lassen Sie es mich wissen!
BESTANDEN: Verwendung von Inline-Block und Blocksatztext
Dies kann durch Setzen der Elemente auf display: inline-block; und des Elternelements auf text-align: justify; erreicht werden. Nun, es ist etwas komplizierter und was ich einen echten CSS-Trick nenne. Sie fügen ein zusätzliches Element hinzu (über ein Pseudo-Element), das 100 % breit ist, und die vorherigen Inline-Blöcke werden ausgerichtet.
<div id="container">
<div></div>
<div></div>
<div></div>
<div></div>
</div>
#container {
height: 125px;
text-align: justify;
border: 10px solid black;
font-size: 0.1px; /* IE 9/10 don't like font-size: 0; */
min-width: 600px;
}
#container div {
width: 150px;
height: 125px;
display: inline-block;
background: red;
}
#container:after {
content: '';
width: 100%; /* Ensures there are at least 2 lines of text, so justification works */
display: inline-block;
}
Demo
Check out this Pen!
Sehr gut, obwohl sie bei kleinen Bildschirmen zusammenrücken, aber ich glaube nicht, dass das beim Surfen jemanden stört, der etwas Ähnliches betrachten muss. Gute Arbeit.
Ich verstehe nicht, warum es mit Tabellen nicht funktioniert.... Jedenfalls, wenn Sie keine Tabellen wollen und Ihnen der zusätzliche Div nichts ausmacht, funktioniert dies in Firefox und wahrscheinlich auch in anderen Browsern...
CSS
HTML
Es ist nur eine versteckte Tabelle =)
Interessant :)
Chris, danke für diesen tollen Tipp! Diesen Trick werde ich mir auf jeden Fall merken :D
Es tut mir leid wegen meines obigen Beitrags, da ich den Teil nicht beachtet hatte, dass die linke und rechte Grafik die Ränder berühren müssen. Danke für den Tipp, weiter so und ich liebe die Videos.
Danke! Das sieht nach der perfekten Lösung aus. Ich werde es sicher bei meiner nächsten CSS-Herausforderung ausprobieren.
Weiter so,
Michal
Gott sei Dank! Das hat mich eine Weile beschäftigt, also bin ich froh, dass jemand mit mehr Verstand als ich es herausgefunden hat. Ich werde es definitiv benutzen!
Ach, die süße, süße Float-Eigenschaft. Die Float-Eigenschaft rettet alles!
Ooh, das ist hilfreich! Ich sitze hier und versuche genau das zu tun, und Sie schreiben darüber! :)
Nun, es ist unordentlich, aber ich glaube, es gibt keinen besseren Weg. Danke für den Vorschlag.
Es scheint, dass die Beispielseite immer noch das Kriterium "nicht überlappen" nicht erfüllt, zumindest in meinem FF2. Wenn ich das Fenster verenge, beginnen sich die Bilder zu überlappen und zu schneiden, von
OOOO
zu etwas wie
OICO
Die Elemente scheinen in der Reihenfolge (von links nach rechts) angeordnet zu sein: 1432, was Sinn macht, da sie bei rechtschwebenden Elementen in der gleichen Reihenfolge im Markup erscheinen würden (vermute ich – ich habe das Markup noch nicht tatsächlich betrachtet).
Der Grund, warum sich die Elemente im ersten Versuch "unerklärlicherweise" umbrechen, ist, dass position:relative eine Box relativ zu der Position verschiebt, die sie sonst hätte (und nicht relativ zum Elternelement).
Außerdem beziehen sich die Prozentsätze nicht unbedingt auf das Browserfenster – sie beziehen sich auf den nächsten Vorfahren, der selbst positioniert ist. Wenn Sie Prozentsätze relativ zum Elternelement verwenden möchten, fügen Sie einfach "position: relative" zum Elternelement hinzu.
Die richtige Verwendung von absoluter und relativer Positionierung würde all Ihre Probleme lösen. Und wenn Sie wirklich diese hässlichen Tabellen verwenden wollen, könnten Sie leicht ein display:[inline][block] usw. hinzufügen. Mit Stil kann jedes Element ein Span sein; Sie müssen nur den Standardstil des Elements entfernen.
Man braucht ein paar Hacks, damit es in IE6 funktioniert...
Danke an alle, die darauf hingewiesen haben, dass die "erfolgreiche" Lösung tatsächlich immer noch Überlappungen verursacht. Das habe ich übersehen. Dennoch eine ziemlich effektive Lösung, wie ich finde, und ich denke, ich bevorzuge Überlappungen gegenüber Umbrüchen in den meisten Fällen, in denen ich dies verwenden würde.
Was ist mit ganzen Codeblöcken wie Bannern? Ich habe 4 generierte Anzeigen und möchte sie so zusammenfügen (ohne Tabellen).
Interessante Technik. Danke dafür. Ich werde sie ausprobieren und sehen, wie gut sie funktioniert.
Sie haben mein Lesezeichen!
Ich habe das von Grund auf neu versucht und kam zu fast der gleichen Lösung wie Sie
HTML
<div id="container">
<div id="butlast">
<div><img src="images/shapes-red.png"></div>
<div><img src="images/shapes-green.png"></div>
<div><img src="images/shapes-yellow.png"></div>
</div>
<img src="images/shapes-blue.png">
</div>
CSS
#container {
min-width: 480px;
}
#butlast div {
float: left;
width: 33%;
}
#butlast {
margin-right: 120px;
}
Der einzige wirkliche Unterschied ist, dass ich alle bis auf das letzte gruppiert habe, anstatt alle bis auf das erste, und linke Floats anstelle von rechten verwendet habe. Allein das Umhüllen des Ganzen mit min-width: 480px löst das Problem der Überlappung.
Gute Arbeit, Vineet. Lustig, dass es eine exakte inverse Lösung ist =). Und danke für den Hinweis auf min-width, wenn man das auf den übergeordneten Container anwendet, hilft das definitiv beim Problem der Überlappung für Browser, die es unterstützen.
Das funktioniert auch gut – und verwendet semantischeres Markup
Benötigt nur einen Wrapper-Div namens expando und eine Standard-UL darin – fertig
http://www.fu2k.org/alex/css/cssjunk/equidistant
2 Methoden.
Die erste ist eine Variation Ihrer Methode, aber der erste rote Kreis befindet sich im Wrapper-Div und verwendet absolute Positionierung, um ihn nach links zu schieben.
Die zweite verwendet einfach absolute Positionierung.
Min-width auf der Body (und ein Ausdruck für IE6) verhindert die Überlappung.
Zwei verschiedene Alex, zwei weitere gute Beispiele. Gute Arbeit, ihr beiden!
Man muss Alex Morris zugutehalten, dass seine Lösung in Firefox und IE funktioniert.
Danke Alex !!!
Verdammt! Jetzt sehe ich, dass Bill G. und Steve B. trotz ihrer Milliarden von Dollar und tausenden von Entwicklern IE7 nicht dazu bringen können, die Reihenfolge der Listenelemente in Alex Morris' ansonsten eleganter Lösung zu parsen.
Hey, wissen Sie was – vergessen Sie das "first-child"-Zeug, das schlechte Browser nicht verstehen.
Man sollte meinen, dass vier Elemente, die auf 25 % gesetzt sind, korrekt schweben und 100 % ergeben sollten
Lustigerweise machen gute Browser das problemlos, aber IE nicht – also müssen Sie nur entweder ein separates Stylesheet für IE einstellen und den %-Wert auf knapp unter 25 % setzen, sagen wir 24,9 %, und es wird perfekt gerendert. Kurz gesagt, alles, was Sie brauchen, ist
und das CSS ist einfach
#expando ul {
margin:0;
padding:0;
list-style-type:none;
}
#expando li span {
height:95px;
width:95px;
background:#f39;
}
#expando ul li {
width: 24.9%;
float: right;
background:#000;
margin:0 0 10px 0;
text-align:center;
}
Sie haben mir Hoffnung gemacht.
Gute Lösung, obwohl ich gehofft hatte, Sie würden ein anderes Problem lösen. Ich suche nach einer Lösung, die dasselbe tut wie oben, nur für eine Liste von Elementen, die sich über mehrere Zeilen erstreckt.
Wenn jemand eine gute Lösung für dieses Problem hat, bitte teilen Sie sie mit :)
Nicht, wenn Sie position: relative zum Container hinzufügen, wodurch ein neuer Positionierungskontext geschaffen wird (d. h. alle Elemente mit position: relative/absolute werden nun relativ zum übergeordneten Container und nicht zum Browserfenster platziert).
FEHLSCHLAG: Verwendung von it’s statt its.
Diese hier unterscheidet sich ein wenig von Alex's: http://tjkdesign.com/lab/equidistant/
Die Methode verwendet kein "float", sondern beruht auf "position:absolute" für alle außer dem letzten Element (wodurch die gesamte Reihe nicht aus dem Fluss genommen wird).
Außerdem verwende ich einen negativen linken Rand anstelle von rechten (ich glaube, das ist weniger mühsam).
Danke Chris für die Idee
Gute Arbeit Thierry, danke fürs Teilen!
Jetzt wird die eigentliche Herausforderung darin bestehen, eine Möglichkeit zu finden, dies zu tun, ohne eindeutige IDs verwenden zu müssen, mit Objekten beliebiger Größe. Hmmmmm
Gut. Ich habe es immer so gemacht, dass ich einen negativen Rand in Höhe des Abstands verwendet habe, sodass
<ul>
<li>Element eins</li>
<li>Element zwei</li>
<li>Element drei</li>
<li>Element vier</li>
<li>Element fünf</li>
<li>Element sechs</li>
</ul>
div {
width : 600px; }
ul {
overflow : hidden; /* vergrößert die ul um die floated li's */
margin-left : -40px; }
li {
float : left;
display : block; width : 160px; margin-left : 40px; }
\Entschuldigung, die Mathematik ist da ganz durcheinander, hier ist mein eigener Bericht: http://mattwilcox.net/archive/entry/id/977/
und hier ist der Beispielcode: http://mattwilcox.net/sandbox/edge-to-edge/edge-to-edge-alignment.html
@Chris: Danke
Ich denke, mit benachbarten Geschwisterselektoren könnten wir ohne die IDs auskommen, aber das "beliebige Größe"-Ding ist knifflig ;-)
@Matt: Die Idee ist, das Ganze in einem fließenden Container zum Laufen zu bringen.
In Ihrem Beispiel würde das Entfernen/Ändern der Breite von #content das Layout zerstören.
@Thierry
Warum könnten Sie die von mir in meinem Beispiel verwendeten px nicht durch Prozentsätze ersetzen?
Hier, ein Beispiel für eine fließende Version
http://mattwilcox.net/sandbox/edge-to-edge/edge-to-edge-alignment-fluid.html
@Matt: Ihr erstes Beispiel verwendet einen Container mit fester Breite und darin Elemente mit fester Breite, und das neueste verwendet einen fließenden Container mit fließenden Elementen.
Soweit ich weiß, verwenden die bisher gegebenen Beispiele feste Elemente (vier) in einem fließenden Container.
Beachten Sie, dass vier Teil der Herausforderung sind, da es viel einfacher ist, drei auseinander zu halten.
Beispiel: http://tjkdesign.com/lab/equidistant/three_is_easy.asp
@Thierry
Bitte schauen Sie sich den Link an, den ich oben angegeben habe, für eine fließende Variante.
Meine Technik erlaubt eine beliebige Anzahl von Elementen in einer Zeile, Sie müssen nur die Mathematik ändern; die Technik bleibt gleich, egal ob Sie drei auf einer Zeile oder fünf oder eine beliebige Anzahl haben: Wenden Sie einen negativen Rand auf das enthaltende Element an, der dem Abstand zwischen den Elementen entspricht. Der einzige komplizierte Teil ist die Berechnung der Mathematik, um die gewünschte Anzahl pro Zeile zu erhalten.
Meine Technik erfüllt alle Punkte, die im Hauptteil des Beitrags aufgeführt sind. Weitere Verfeinerungen sind durch die Angabe von min-width-Werten für den Container möglich, zum Beispiel.
Außerdem, zu Ihrer Information, die im Hauptteil des Beitrags gezeigten Beispiele haben KEINE vier festen Elemente pro Zeile. Sie haben vier ELASTISCHE Container pro Zeile, die jeweils ein festes Element enthalten. Sie können genau denselben Effekt mit meinem Beispiel erzielen, indem Sie einfach ein Bild in die LIs einfügen. Sie können sogar text-align verwenden, um sie innerhalb des LIs zu verschieben.
Aber nur um zu demonstrieren, wie einfach es ist, hier ist ein Beispiel mit 4 pro Zeile und einer Mindestbreite pro "Zelle" von 120px
http://mattwilcox.net/sandbox/edge-to-edge/edge-to-edge-alignment-fluid-4.html
Wenn Sie Inhalte wie Bilder in die li's einfügen möchten, ist das nur Markup. Das "Layout" ist der Trick hier, mit Inhalten zu spielen ist trivial.
@Matt
Aber wir versuchen, die Bilder zu verteilen, nicht ihre Container. Schauen Sie sich Chris' Diagramm an, wo "PASS" steht. Schauen Sie sich die großen Punkte an.
Warum erstellen Sie kein weiteres Beispiel, bei dem Bilder sich wie im Diagramm verhalten (mit diesem zusätzlichen Markup)? So vergleichen wir nicht Äpfel mit Birnen.
Aaah, ich sehe die Unterscheidung jetzt (die, obwohl ich den Beitrag zum dritten Mal gelesen habe, nirgends tatsächlich angegeben ist. Meine Lösung erfüllt alle Punkte und verfehlt dennoch den genauen Effekt, der gesucht wird, weil das Beispiel spezifischer ist als die Beschreibung der gewünschten Funktionen).
OK, mit der etablierten Nuance kann ich keine flexible Methode sehen, dies mit meiner Methode zu erreichen (oder mit irgendeiner anderen Methode als den genannten).
Auf der anderen Seite ist die im Beitrag beschriebene Methode auch sehr spezifisch und eher begrenzt. Sie hat viel überflüssiges Markup und eignet sich nicht gut für mehrere Zeilen oder dynamisch generierte Inhalte (ich verwende meine Methode hauptsächlich für Kategorie-Seiten auf E-Commerce-Websites, wo es eine unbekannte Anzahl von Elementen in einem Raster gibt). Wie oft möchten Sie vier Bilder, von denen jedes genau die gleiche (vordefinierte) Breite haben muss, damit die Technik funktioniert, auf einer Seite in einer Reihe, in einem fließenden Layout?
Es ist eine Lösung, die funktioniert, aber für etwas so Spezifisches und das so exakte Bilder erfordert, denke ich, wäre es viel einfacher, einfach die UL als position: relative zu setzen und dann die Bilder direkt absolut zu positionieren (das habe ich auch schon gemacht). Wenn wir wissen, dass die Bilder eine exakte Breite haben müssen, können sie auch eine festgelegte maximale Höhe haben, also setzen wir die UL auf block und geben ihr auch eine Höhe, um "clearing"-Probleme zu vermeiden.
Notiz an mich selbst, Positionierung ist doch nicht so einfach wie gedacht.
Heh, interessant! Dieses Detail "Objekte müssen eine feste Breite haben", das in der Beschreibung fehlt, macht das Leben sehr schwierig. :-)
Gute Diskussion, Jungs! Es ist interessant, dass es die Objekte mit statischer Breite schwierig macht. Ich denke, wir sind uns alle einig, dass dies viel kniffliger ist, als es sein sollte.
Hier wurden einige großartige Ideen gepostet, aber ich denke immer noch, dass das Problem bei all diesen (einschließlich meiner) darin besteht, dass es einfach zu viel Abhängigkeit von der Festkodierung aller Details gibt. Bei den meisten Techniken muss man wissen, WIE VIELE und WIE BREIT und beides festkodieren. Einige Techniken erfordern sogar eindeutige IDs für jedes einzelne Element. In einer perfekten Welt sollten wir das tun können, ohne irgendetwas davon zu wissen.
Ich würde sogar so weit gehen zu sagen, dass dies ein großes Versäumnis von CSS ist (und etwas, das wahrscheinlich nicht in CSS3 behoben wird).
Aber Chris, was du willst, ist mit CSS2.1 möglich. `display:table` erledigt die Arbeit. Ich habe die Seite, auf die ich zuvor verwiesen habe, aktualisiert
http://www.fu2k.org/alex/css/cssjunk/equidistant
#wrapper3 span
{
display: table-cell;
}
#wrapper3 span img
{
float: right;
}
#wrapper3 span:first-child
{
width: 1px;
}
Man muss nicht wissen, wie viele Elemente es geben wird. Auch keine Höhen oder Breiten sind erforderlich, außer 100% auf der "Tabelle", damit sie sich dehnt, um die verfügbare Breite auszufüllen, und 1px für die linkeste "Tabellenzelle", um sicherzustellen, dass sie auf die Breite des darin enthaltenen Bildes reduziert wird. Ja, das ist im Grunde wieder deine ursprüngliche, fehlerfreie Idee.
Es funktioniert in allen Browsern, die `display:table` unterstützen (einschließlich IE8b)
Sehr schön, Alex!
Leider nicht gut für IE6 und 7.
Wie bei vielen Dingen wäre das Leben viel einfacher, wenn wir _alle_ Teile von CSS in einer Produktionsumgebung nutzen könnten, aber dank fehlender Unterstützung für einige Attribute in bestimmten beliebten Browsern können wir das nicht.
Was diese Herausforderung so schwierig macht, ist, dass wir Einheitentypen mischen, und CSS ist darin schlecht. Wir können in Pixeln arbeiten, oder wir können in % arbeiten, aber die Mischung beider ist in vielen Fällen unmöglich. Wenn CSS Ausdrücke unterstützen würde, wäre dies nicht so schwierig (width : 90%-120px;). Nachdem ich die CSS3-Spezifikationen durchgesehen habe, glaube ich nicht, dass dort etwas ist, das uns in dieser Situation helfen würde.
@matt wilcox
> Nicht gut für IE6 und 7, leider.
Nun, offensichtlich. Aber mein Punkt ist, dass es ein Versäumnis bestimmter aktueller Browser-Implementierungen ist, nicht etwas, das CSS nicht kann.
Die `display:table`-Lösung funktioniert nachweislich in jedem Browser, der `display:table` unterstützt. Ergo gibt es keinen Grund, nach CSS3 zu suchen und zu klagen. (Obwohl eine ordnungsgemäße offizielle Methode, `display: spaced-out` oder so ähnlich, vorzuziehen wäre).
Ebenso offensichtlich ist, dass es derzeit keine praktikable Lösung ist, es sei denn, Sie ergänzen sie mit einem Ansatz nach Dean Edwards und verwenden JavaScript, um `display:table` in tatsächliche Tabellen für diese kniffligen IEs umzuwandeln.
Das ist, wie ich es mache
.equidistant > * {
display: inline;
width: 30%;
float: left;
}
.equidistant > *:first-child { float: left; width: auto; }
.equidistant > * > * { float: right; }
Alex' Lösung in IE lt 8 zum Laufen bringen
Mit `setExpression()`
Es ist keine gute Lösung, da es einen Reflow gibt und Ausdrücke irgendwie "böse" sind, aber sie können in einigen Fällen nützlich sein (und der Reflow ist kein Problem, wenn sich die Elemente unterhalb des sichtbaren Bereichs befinden).
Es scheint, dass `:first-child` der beste Weg ist, etwas wie das zu erreichen. Es funktioniert sowohl in FF als auch in IE7 perfekt (der IE7-Teil hat mich beim ersten Versuch überrascht).
Ja, es gibt ein Problem mit IE6, aber wann gibt es KEIN Problem mit IE6? Wahrscheinlich hacken Sie bereits oder verwenden sowieso ein bedingtes CSS für andere Probleme, sodass ein paar zusätzliche Codezeilen, um `:first-child` zum Laufen zu bringen, keine große Sache sein sollten.
Es gibt tatsächlich einen einfachen Weg, das mit einer Tabelle zu machen. Manchmal macht CSS die Dinge schwieriger. Die Tabellenlösung ist nicht so elegant wie die CSS-Lösung, aber sie funktioniert genauso gut. Und sie bricht im Quirks-Modus nicht. :-)
Sie können die Bilder in der `FarLeftCell`, `MiddleCells` und `FarRightCell` beliebig breit machen, solange sie nicht die Breite des übergeordneten Objekts überschreiten. (Wenn die Gesamtbreite Ihrer Bilder 500px beträgt, das übergeordnete Element aber nur 400px, wird die Tabelle 500px groß).
Die Tabelle kann nicht kürzer sein als die Gesamtbreite der Bilder in ihren Zellen. Das CSS setzt die Breite der `MiddleCells` auf 1px, aber es könnte auch 0px sein. Die Tabelle erkennt, dass das Bild größer ist und dehnt die Zelle, um es herumzupassen. Die mittleren Zellen bestimmen den gleichen Abstand zwischen den anderen Zellen. Sie müssen diese zwischen die anderen Zellen einfügen. Ändern Sie die Breite im CSS, um der Anzahl der von Ihnen gewünschten mittleren Zellen zu entsprechen. Wenn Sie 4 `MiddleCells` in der Tabelle haben, teilen Sie 100% durch 4 = 25%. Wenn Sie 6 `MiddleCells` haben, 100% geteilt durch 6 = 16,66%.
SEHR WICHTIG: Stellen Sie sicher, dass Sie ein nicht umbrechendes Leerzeichen ( ) in jeder der `SpacerCells` einfügen. Die leeren Tabellen-`SpacerCells` verhalten sich sonst nicht richtig.
HTML
CSS
Nach einem Wochenende voller Versuche, dies auf die richtige Weise zu tun, habe ich die einfache Methode herausgefunden.
Dies ist nicht meine bevorzugte Methode, aber ich habe eine `div` auf `{text-align: justify}` gesetzt und ein Platzhalterbild am Ende der Bilder hinzugefügt, die ich gleichmäßig verteilen wollte, in diesem Fall Kacheln über mehrere Zeilen mit einer ausreichenden Breite, um sicherzustellen, dass es eine eigene Zeile benötigt.
Nicht schön, aber wirklich einfach und es funktioniert.
Ich habe vor einiger Zeit eine alternative Methode entwickelt, die dasselbe ohne zusätzliche HTML-Elemente ermöglicht.
Schauen Sie sich an
meinen Blog... er funktioniert in allen üblichen Verdächtigen.
Ich wollte ein ähnliches, aber anderes Problem lösen: Elemente gleichmäßig verteilen, aber etwas Platz an den Rändern lassen (genauer gesagt, 1/2 des Abstands zwischen den Objekten an jedem Rand). Meine Lösung ähnelt Ihrer unter Verwendung von `inline-block` und zentriertem Text, musste aber das HTML ändern zu
Weiß jemand eine "sauberere" Methode, die keine Änderungen am HTML erfordert?
Warum nicht einfach etwas `padding` auf Ihren Container anwenden und die Breite etwas reduzieren?
Dan, ich wollte eine Lösung, die für unterschiedlich große Fenster funktioniert, ohne die Mathematik in JavaScript durchführen zu müssen.
Danke Chris, ein weiterer schöner Artikel zu einem interessanten Thema
Eigentlich bin ich nach dem Lesen dieses Artikels auf eine neue Idee gekommen, das Problem zu lösen.
Die Hauptidee ist, dass der Rand per Mathematik mit Pixeln und % gemischt werden muss.
Wir können also `margin` für Pixel und `padding` für % verwenden.
Ich erkläre es hier im Detail
http://mohammad-sabbagh.com/responsive-equidistant-menu-css/
Wie wäre es, wenn Sie 100+ Bilder mit fester Höhe hätten, aber das Seitenverhältnis eine variable Breite hat. Sie möchten so viele wie möglich pro Zeile unterbringen, aber wenn das Browserfenster wächst oder schrumpft, wächst oder schrumpft die Anzahl der Bilder und vielleicht sogar die Größe des Bildes. Ein Beispiel wäre Google oder Bing Bildersuche. Erweitern/verkleinern Sie den sichtbaren Bereich des Browsers und sehen Sie, was ich meine. Ich möchte dieses Verhalten für eine Menge von N Bildern nachahmen.
Ich versuche, dies mit vier Bildern unterschiedlicher Breite (Firmenlogos) zu tun. Ich möchte, dass das erste Logo am linken Rand beginnt und das letzte Logo am rechten Rand ausgerichtet ist, wobei die Logos 2 und 3 einen gleichen Abstand zwischen ihnen lassen. Aus dem obigen Text kann ich nicht erkennen, ob eine der vorgeschlagenen Lösungen für mein Szenario funktioniert?
Ich habe eine Variation davon verwendet, um einige Links gleichmäßig zu verteilen, aber ich konnte dies tun, ohne spezifische Größen definieren zu müssen. Es funktioniert unter der Bedingung, dass Ihr Inhalt niemals breiter ist als der Container, in dem er sich befindet, sonst wird er auf eine andere Zeile umgebrochen. Bei einem schnellen Test scheint es auch mit Bildern zu funktionieren. Der Trick ist, leere `div`s auf beiden Seiten hinzuzufügen.
Also ist das CSS
und das HTML ist
In IE9+ kann man etwas noch Einfacheres mit `calc()` und `margin` machen. Ich denke, es ist besser gekapselt und könnte mit ein paar Argumenten in ein Sass-Mixin umgewandelt werden.
Codepen: http://codepen.io/robwierzbowski/pen/fromp
Kurz gesagt, falls der Pen verschoben wird
...ähem,