Wie kann ich den Text in einer Tabelle mit Divs linksbündig ausrichten, sodass die Zeilen gleichmäßig verteilt sind?

Ich versuche, einige Namen zu arrangieren. Ich habe sie vor dem Posten mit savedata.com geändert, aber die echten sind in jeder Zeile alphabetisch von links nach rechts geordnet.

Ich versuche herauszufinden, wie ich die "Spalten" gleichmäßig verteilen kann, da Sie sehen können, dass die rechte Spalte auf der rechten Seite überflüssigen Platz hat. In diesem Beispiel möchte ich, dass Tincidunt Nibh Phasellus Company den gleichen Abstand vom Rand des übergeordneten Containers hat wie die linke Seite der ersten Spalte (dh: Ut Quam Vel Company ).

Relevanter Code auf Codepen.io

Bildschirmfoto:

Geben Sie hier die Bildbeschreibung ein

HTML-Markup:

<div class="inner body">
<section class="round-border">
    <div class="distributors-row">
        <div class="distributor-left">Egestas Nunc Sed Company</div>
        <div class="distributor-middle">Hendrerit A Arcu Institute</div>
        <div class="distributor-right">Molestie Sed Id Incorporated</div>
    </div>

    <div class="distributors-row">
        <div class="distributor-left">Ut Quam Vel Company</div>
        <div class="distributor-middle">Donec Egestas Duis LLC</div>
        <div class="distributor-right">Tincidunt Nibh Phasellus Company</div>
    </div>

    <div class="distributors-row">
        <div class="distributor-left">Praesent Luctus Company</div>
        <div class="distributor-middle">Curae; Donec Consulting</div>
        <div class="distributor-right">Magna A LLC</div>
    </div>

    <div class="distributors-row">
        <div class="distributor-left">Malesuada Ut Corporation</div>
        <div class="distributor-middle">Sit Amet Consectetuer Incorporated</div>
        <div class="distributor-right">Cum Sociis Foundation</div>
    </div>

    <div class="distributors-row">
        <div class="distributor-left">Rutrum Fusce Inc.</div>
        <div class="distributor-middle">Iaculis Odio Nam Limited</div>
        <div class="distributor-right">Interdum Libero Dui Institute</div>
    </div>

    <div class="distributors-row">
        <div class="distributor-left">Eget Laoreet LLC</div>
        <div class="distributor-middle">Elit Fermentum Risus Institute</div>
        <div class="distributor-right">Aliquet Proin Velit Company</div>
    </div>
    </section>

</div>    

CSS-Formatierung:

body {
background-color: #eee;
background-image: url(../images/patterns/light_toast.png);
color: rgba(102, 102, 102, 1);
font-family: 'Open Sans', sans-serif;
font-size: 16px;
margin:0px;
padding:0px;
}
.inner {
margin: 0 auto;
max-width: 940px;
padding: 0 40px;
}
.distributor-left {
float: left;
width: 33%;
margin: none;
text-align: left;
}
.distributor-middle {
float: left;
width: 33%;
margin: none;
text-align: left;
}
.distributor-right {
float: left;
width: 33%;
margin-left: none;
text-align: left;
}
.round-border {
border: 1px solid #eee;
border: 1px solid rgba(0, 0, 0, 0.05);
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
border-radius: 4px;
padding: 10px;
margin-bottom: 5px;
clear: both;
}
.round-border:after {
content: "";
display: block;
clear: both;
}
#wrap {
margin: 0 auto;
}

Ich habe ein paar verschiedene Dinge ausprobiert, aber die meisten lösen das Problem nicht. Sie sind eher für horizontale Navigationsmenüs gedacht, was hier nicht zutrifft. Ich habe versucht, das margin-leftfür die .distributor-rightKlasse anzupassen, aber sobald es wurde, margin-left: 10pxfällt es in die nächste Zeile, während margin-left: 9pxes immer noch nicht gut verteilt ist.

Das Endergebnis sollte diesen Abstand haben, wobei diese roten Bereiche automatisch aus dem Text genau gleich sind:

Geben Sie hier die Bildbeschreibung ein

1/3 ist eigentlich 33,333333% :) Viel zusätzlicher Code. Es könnte einfacher sein, nur 3-Spalten-Divs mit internen <p>Tags zu haben, anstatt ein Div für jede einzelne Textzeile.
@Scott oh wusste nicht, dass du dort Dezimalzahlen verwenden kannst. Beantwortet die Frage aber nicht :\
Überprüfen Sie den Stiftlink oben erneut. VIEL einfachere Konstruktion
@Scott, das beantwortet die Frage jedoch nicht. In einer Sekunde mache ich ein Bild, um es besser zu erklären, oder wenn Sie den letzten Satz meines Absatzes lesen, könnte es erklären.
@Scott siehe Bearbeiten
Siehe meine Antwort - linksbündiger Text wird einen ausgefransten rechten Rand haben. Sie sollten sich nicht allzu sehr darum kümmern.
Sie können jederzeit etwas tun , um die Zeilenlänge anzugeben, wenn Sie dies wünschen.
Was Sie tun möchten, wäre nur mit einem sehr komplizierten JavaScript möglich. Ich würde mich darauf konzentrieren, die Behälter gleich groß zu machen und die Linien enden zu lassen, wo sie können.

Antworten (4)

Zuerst würde ich den HTML-Code umstrukturieren. Ein div für jede einzelne Textzeile zu haben, ist übertrieben. Alles, was Sie brauchen, sind 4 divs und dann Absätze für den Text.

Containing div
Dreispaltige divs
Absätze für Text

<div id="wrap">
    <?php include 'menu.php'; ?>

    <div class="inner body">
    <section class="round-border">

        <div class="distributors-row">
            <div class="distributor-left">
              <p>Praesent Luctus Company</p>
              <p>Praesent Luctus Company</p>
              <p>Praesent Luctus Company</p>
              <p>Praesent Luctus Company</p>
          </div>
            <div class="distributor-middle">
              <p>Praesent Luctus Company</p>
              <p>Praesent Luctus Company</p>
              <p>Praesent Luctus Company</p>
              <p>Praesent Luctus Company</p></div>
            <div class="distributor-right">
              <p>Praesent Luctus Company</p>
              <p>Praesent Luctus Company</p>
              <p>Praesent Luctus Company</p>
              <p>Praesent Luctus Company</p></div>
        </div>
        </section>

    </div>

Letztendlich wird dies die Bearbeitung erheblich erleichtern.

Dann sorgen einige einfache Anpassungen am CSS dafür, dass es gut abgespielt wird:

body {
    background-color: #eee;
    background-image: url(../images/patterns/light_toast.png);
    color: rgba(102, 102, 102, 1);
    font-family: 'Open Sans', sans-serif;
    font-size: 16px;
    margin:0px;
    padding:0px;
}

.inner {
    margin: 0 auto;
    max-width: 940px;
    padding: 0 40px;
}


.distributors-row > div { 
    float: left;
    width: 33.3%;
    margin-left: none;
    padding: 5px 0;
    text-align: left; } */ one CSS definition for all 3 columns */
p { margin:0; text-indent: 10px; } */ added to move text off left edge slightly */

.round-border {
    border: 1px solid #eee;
    border: 1px solid rgba(0, 0, 0, 0.05);
    -webkit-border-radius: 4px;
    -moz-border-radius: 4px;
    border-radius: 4px;
    padding: 10px;
    margin-bottom: 5px;
    clear: both;
}

.round-border:after {
    content: "";
    display: block;
    clear: both;
}

#wrap {
    margin: 0 auto;
}

BEISPIELLINK

Beachten Sie, dass in Spalten mit linksbündigem Text ohne Hintergrundfarben die Zeilenlänge des Textes Ihre Wahrnehmung der Spaltenbreite verändern wird. Wenn Sie nicht jede Textzeile rechtfertigen möchten (was ich nicht empfehlen würde), wird der ausgefranste rechte Rand erwartet und sollte kein großes Problem darstellen.

Da diese Liste von links nach rechts alphabetisch geordnet ist, gehe ich davon aus, dass Ihre HTML-Struktur so war, dass das Design, wenn es auf kleineren Ansichtsfenstern gestapelt wird, in alphabetischer Reihenfolge ist, da dies die Reihenfolge in HTML ist. Um jedoch das gewünschte Design zu erreichen, würde ich Medienabfragen verwenden, um zwei verschiedene Listen ein- und auszublenden. Dann würde ich eine ungeordnete Liste nicht in alphabetischer Reihenfolge im HTML verwenden, sondern visuell.

Demo: http://jsbin.com/kiyora/

Geben Sie hier die Bildbeschreibung ein

.distributors {
    display: none
}
.distributors-list {
    display: block
}
@media (min-width:870px) { 
    .distributors-list {
        display: none
    }
    .distributors {
        width: 100%;
        padding: 10px;
        display: block;
        overflow:hidden;
        margin:0 auto;
        max-width:980px;
        box-sizing: border-box;
        border-radius: 10px;
        border: 1px solid red;
    }
    .distributors .distributor {
        width: 36%;
        padding: 0;
        margin: 0;
        list-style: none;
        float: left;
        box-sizing: border-box;
    }
    .distributors .distributor:nth-child(even) {
        width: 33%
    }
    .distributors .distributor:last-child {
        width: auto;
        float: right;
    }
}

HTML:

<section class="distributors-list">My alpha list for small viewport widths</section>

<section class="distributors">
   <ul class="distributor">
      <li>Egestas Nunc Sed Company</li>
      <li>Hendrerit A Arcu Institute</li>
      <li>Molestie Sed Id Incorporated</li>
      <li>Ut Quam Vel Company</li>
      <li>Donec Egestas Duis LLC</li>
      <li>Tincidunt Nibh Phasellus Company</li>
   </ul>
   <ul class="distributor">
      <li>Egestas Nunc Sed Company</li>
      <li>Hendrerit A Arcu Institute</li>
      <li>Molestie Sed Id Incorporated</li>
      <li>Ut Quam Vel Company</li>
      <li>Donec Egestas Duis LLC</li>
      <li>Tincidunt Nibh Phasellus Company</li>
   </ul>
   <ul class="distributor">
      <li>Egestas Nunc Sed Company</li>
      <li>Hendrerit A Arcu Institute</li>
      <li>Molestie Sed Id Incorporated</li>
      <li>Ut Quam Vel Company</li>
      <li>Donec Egestas Duis LLC</li>
      <li>Tincidunt Nibh Phasellus Company</li>
   </ul>
</section>

Sie müssen Ihren Code nicht umschreiben

.distributor-middle {
    text-align: center;
}

.distributor-right {
    text-align: right;
}

Dadurch erhalten Sie einen zentrierten Text in der Mitte. margin: 0 autoSie können die einzelnen Elemente auch in ein anderes div packen und dem mittleren ein und text-align: justifyoder etwas und dem letzten eins geben float: right;.

Wenn Sie möchten, dass der Text links ausgerichtet bleibt und Sie nur möchten, dass sich die rechte Kante berührt, wickeln Sie einfach jedes Ding in ein anderes Div zwischen dem Inhalt und und setzen Sie es auf, .distributor-middledamit display: inline-block;das Div zur Dimension des Inhalts wird, und setzen Sie dann das mittlere auf margin: 0 auto;und das .distributor-rightzutext-align: right;

Bitte kommentieren Sie die Antworten anderer nicht in Ihrer eigenen Antwort - verwenden Sie den Kommentarbereich für die anderen Antworten selbst
Danke, aber das funktioniert nicht, ich bin mir nicht sicher, warum es Downvotes bekommt, obwohl die andere Antwort auch nicht wirklich funktioniert. Sie beide bieten alternative Lösungen an.

Ich stimme Scott zu, dass "der ausgefranste rechte Rand erwartet wird und kein großes Problem sein sollte". Es gibt nichts, was Sie dagegen tun können, wenn Sie mit einer Liste von Wörtern arbeiten, deren Länge völlig variabel sein kann, und wenn Sie versuchen, ein ansprechendes Design zu erstellen (was ich denke, dass Ihr Code darauf hinweist).

Anstelle einer Methode dafür habe ich mir die Freiheit genommen, Scotts vorgeschlagene Optimierungen mit einigen meiner eigenen zu verbessern. Ich habe auch ein paar einfache Vorschläge für die Gestaltung dieser Liste. Ich werde sie im Stichpunktformat darstellen, um den Konsum zu erleichtern.

  • Die alphabetische Liste sollte horizontal statt vertikal geordnet werden, da die visuelle Verbindung und Nähe zwischen den Listenelementen imo viel mehr horizontal als vertikal verläuft. (Möglicherweise haben Sie dies bereits geplant, aber ich weiß es nicht aus dem generierten Beispielinhalt).

  • Drei Fünferspalten, wie Scott vorschlägt, sind für mich viel sinnvoller als fünf Dreierreihen, da sie auf der Seite aussehen. Noch wichtiger ist jedoch, dass, wenn die Dinge in einem alten Browser falsch gerendert werden, der Schaden mit den 5 Reihen von 3 wahrscheinlich viel größer sein wird als mit 3 Spalten von 5.

  • Schwimmer sollten unbedingt vermieden werden! Ich habe lange Zeit damit verbracht, Floats zu verwenden und nach einer Alternative zu suchen, aufgrund der schrecklichen Fehler in einigen IEs und der lästigen Problemumgehungen, die erforderlich sind. Es gibt Alternativen und sie funktionieren viel besser! Ich persönlich entscheide mich dafür, Tabelleneigenschaften per CSS auf Elemente anzuwenden.

  • Um meinen Punkt zu betonen, CSS-Tabelleneigenschaften verschlechtern sich sogar sehr gut und werden zurück zu IE5 unterstützt. Wenn Inhalte gequetscht werden oder etwas Seltsames passiert, zeigt der Browser immer noch CSS-markierte Tabelleninhalte an, egal was passiert. Es wird überlaufen und alles Notwendige tun, wobei der Anzeige des Inhalts in einem tabellarischen Element höchste Priorität eingeräumt wird - insbesondere Textinhalt (opfern Sie manchmal Bilder, um Text anzuzeigen).

  • Ein bisschen mehr Leerraum zwischen den Listenelementen scheint den Fokus etwas von der ausgefransten rechten Kante abzulenken, zumindest tut es das in meinem Kopf. Ich habe eine Zeilenhöhe von 1,5 verwendet

  • Das Platzieren des abgerundeten Rahmens auf dem <section>Element ist eine schlechte Idee, da abgerundete Rahmen breiter unterstützt werden als HTML5 (glaube ich), also habe ich es <section>stattdessen in das direkte untergeordnete Element von verschoben, mit dem gleichen Ergebnis.

Hier sind meine Optimierungen

Der HTML-Code:

<div id="wrap">
  <?php include 'menu.php'; ?>
  <div class="inner">
    <section>
      <div class="container round-border">
        <ol class="column">
          <li>Egestas Nunc Sed Company</li>
          <li>Ut Quam Vel Company</li>
          <li>Praesent Luctus Company</li>
          <li>Malesuada Ut Corporation</li>
          <li>Rutrum Fusce Inc.</li>
          <li>Eget Laoreet LLC</li>
        </ol>
        <ol class="column">
          <li>Hendrerit A Arcu Institute</li>
          <li>Donec Egestas Duis LLC</li>
          <li>Curae; Donec Consulting</li>
          <li>Sit Amet Consectetuer Incorporated</li>
          <li>Iaculis Odio Nam Limited</li>
          <li>Elit Fermentum Risus Institute</li>
        </ol>
        <ol class="column">
          <li>Molestie Sed Id Incorporated</li>
          <li>Tincidunt Nibh Phasellus Company</li>
          <li>Magna A LLC</li>
          <li>Cum Sociis Foundation</li>
          <li>Interdum Libero Dui Institute</li>
          <li>Aliquet Proin Velit Company</li>
        </ol>
      </div>
    </section>
  </div>
</div>

Das CSS:

*, ol, li {
  margin: 0;
  padding: 0;
  list-style-type: none;
  vertical-align: middle;
  text-align: left;
}

body {
  background-color: #eee;
  background-image: url(../images/patterns/light_toast.png);
  color: rgba(102, 102, 102, 1);
  font-family: 'Open Sans', sans-serif;
  font-size: medium;
}

#wrap, .inner {
  margin: 0 auto;
}

.inner {
  display: block;
  width: auto;
  max-width: 940px;
}

.container {
  display: table;
}

.round-border {
  border: 0.100em solid #eee;
  border: 0.100em solid rgba(0, 0, 0, 0.05);
  -webkit-border-radius: 0.400em;
  -moz-border-radius: 0.400em;
  border-radius: 0.400em;
  padding: 0.600em;
  margin-bottom: 0.500em;
}

.column {
  display: table-cell;
  width: 33.333333333333333%;
  width: calc(100/3);
}

.column li {
  display: inline-block;
  width: 100%;
  line-height: 1.5;
}