CSS/Tutorials/Typografie/Spalten

Aus SELFHTML-Wiki
Wechseln zu: Navigation, Suche

Immer breitere Monitore ermöglichen immer breitere Seiten. Dies ist aber nicht lesefreundlich, da man bei langen Zeilen nur schwer den Anfang der neuen Zeile findet. Mit der Eigenschaft columns können Sie Fließtext und lange Listen in mehrere Spalten aufteilen. Im Gegensatz zu bisherigen workarounds ist dieses Layout flexibel, das heißt z. B. dass Spaltenumbrüche nur bei Bedarf erfolgen und die Anzahl der Spalten ebenfalls in Abhängigkeit von der Breite des Browserfensters variabel ist.

Das hier beschriebene Mehrspalten-Layout ist auf Block-Container anwendbar. Damit sind Block-Elemente gemeint, in denen der normale Textfluss (inline flow) gilt oder die nur Block-Elemente enthalten, die der klassischen Blockformatierung folgen. Container-Elemente, die table-, flex- oder grid-Layout verwenden, können nicht für das Mehrspalten-Layout verwenden werden, das von den column-Eigenschaften erzeugt wird.

Beachten Sie: Der Zugriff auf einzelne Spalten, einzelne Spaltenabstände oder einzelne Linien zwischen den Spalten ist nicht möglich.

columns

Die Eigenschaft columns ist eine Zusammenfassung der möglichen Einzelangaben column-width und column-count.

Browserunterstützung
caniuse.com

Die Eigenschaft columns erwartet folgende durch Leerzeichen getrennte Werte:

  • eine Angabe zur Spaltenanzahl (positive ganze Zahl oder auto)
  • eine nicht negative Längenangabe als Mindestspaltenbreite
Funktionsweise von columns ansehen …
.beispiel1 ul {
    columns:         5 7em;
}
.beispiel2 ul {
    columns:         5 12em;
}
.beispiel3 ul {
    columns:         2 12em;
}
<div class="beispiel beispiel1">
    <h2>columns: 5 7em;</h2>
    <p>Bei einer <strong>Mindest</strong>breite von 7em passen 5 Spalten in dieses Element.</p>
    <ul>
         <li>1. Punkt</li>
         <li>2. Punkt</li>
         <li>3. Punkt</li>
         <li>4. Punkt</li>
         <li>5. Punkt</li>
     </ul>
</div>

In diesem Beispiel werden verschiedene Kombinationen für Spaltenanzahl/Spaltenbreite vorgestellt.

Eine Angabe von gap ist im Allgemeinen nicht nötig, da der Standardwert normal ca. 1em Platz lässt.

Der columns-Algorithmus nimmt jedoch keine Rücksicht auf Absätze, sodass teilweise einzeln stehende Zeilen entstehen.

column-width

Mit der Eigenschaft column-width können Sie für ein Element durch die Angabe einer Mindestspaltenbreite bestimmen, ob es in mehreren Spalten angezeigt wird. Die Spalten werden dabei gleichmäßig befüllt. Die Anzahl der Spalten und deren tatsächliche Breite ergeben sich aus dem zur Verfügung stehenden Platz.


Erlaubte Werte:

  • Längenangabe
  • auto: (Standardwert) Er bedeutet, dass die Anzahl der Spalten durch column-count festgelegt wird oder dass es nur eine Spalte gibt.
Beachten Sie, dass lediglich eine Mindestbreite festgelegt wird.
Beispiel ansehen …
 
      .mehrspaltig {
        column-width: 12em;
        max-width: 40em; 
      }

Der Artikel wird in Spalten mit einer Mindestbreite von 12em aufgeteilt. Da die max-width 40em beträgt und der Abstand zwischen den einzelnen Spalten durch den Standardwert von column-gap ca. 1em beträgt, ist die (bei größeren Viewports) angezeigte Breite nahe an den 12em.

Beachten Sie: Gerade beim Bild zeigt sich, dass hier eine größere Mindestbreite verwendet werden sollte.

column-count

Mit der Eigenschaft column-count können Sie für ein Element durch die Angabe der Spaltenanzahl bestimmen, ob es in mehreren Spalten angezeigt werden soll. Die Breite der Spalten richtet sich nach dem zur Verfügung stehenden Platz. column-count gibt dabei die maximale Spaltenanzahl an. Wenn gleichzeitig eine Angabe zur Spaltenbreite gemacht wurde, werden ggf. weniger Spalten erzeugt.


Erlaubte Werte:

  • positive ganze Zahl
  • auto: (Standardwert) Er bedeutet, dass die Anzahl der Spalten durch column-width festgelegt wird oder dass es nur eine Spalte gibt.
Beispiel ansehen …
      ...
      .mehrspaltig {
        column-count: 2;
      }

Der Artikel ist 30em breit und wird, da es keine Angaben zur Mindestbreite gibt, in 2 Spalten aufgeteilt.

column-rule

Die Eigenschaft column-rule ist eine Zusammenfassung der möglichen Einzelangaben column-rule-width, column-rule-style und column-rule-color, mit der Sie das Aussehen der Linien zwischen den Spalten bestimmen können.


Notieren Sie Angaben zu Linienstärke, Style und Farbe mit Leerzeichen dazwischen:

  • Linienstärke: optional, Voreinstellung medium
  • style: Voreinstellung none, alle border-style-Werte möglich
  • Farbangabe: Voreinstellung ist die Textfarbe des Elements


Hinweis:
Obwohl die Reihenfolge der Angaben beliebig ist und keine Verwechslungsgefahr besteht, sollten Sie dennoch konsequent bei einer Notation bleiben. Die meisten Werkzeuge zur Fehlersuche verwenden die Reihenfolge column-rule: width style color;.
Anwendungsbeispiel ansehen …
 
.mehrspaltig {
  column-count: 3;
  gap:          1em;
  column-rule:  dashed;
}

Der mehrspaltige Text erhält mit column-rule: dashed eine gestrichelte Trennlinie. Als Strichstärke wird die Voreinstellung medium; als Farbe die Textfarbe verwendet.
Zur Visualisierung sind die Kindelemente des Divs der Klasse „mehrspaltig“ mit einem Hintergrund versehen.

Erzähltext mit Zwischenlinien ansehen …
 
.mehrspaltig {  
  columns: 5 12em;  
  column-rule: 5px dotted gold;  
  -webkit-hyphens: auto;
  hyphens: auto;  
}

Der mehrspaltige Text erhält mit column-rule: 5px dotted gold; eine 5px breite goldene gepunktete Trennlinie.

Zur Visualisierung sind die Kindelemente des Divs der Klasse „mehrspaltig“ mit einem Hintergrund versehen.

column-rule-width

Mit der Eigenschaft column-rule-width können Sie für ein mehrspaltig anzuzeigendes Element die Dicke der Linien zwischen den Spalten bestimmen. Sinnvollerweise sollten Sie diese Angabe zumindest mit einer Angabe zum Linientyp kombinieren, gegebenenfalls aber auch mit einer Festlegung der Linienfarbe.

Erlaubt ist eine numerische Angabe (mit Ausnahme von Prozentwerten) für die Dicke oder einer der folgenden Werte:

  • thin = dünn.
  • medium = mittelstark.
  • thick = dick.
Beachten Sie: Eine Angabe für die Dicke wird nur interpretiert, wenn auch eine Angabe für den Linientyp erfolgt.
Beispiel ansehen …
.mehrspaltig {
  column-count:      2;
  column-gap:        10em;
  column-rule-width: thick;
  column-rule-style: dashed;
}

Zur Visualisierung sind die Kindelemente des Divs der Klasse „mehrspaltig“ mit einem Hintergrund versehen.

column-rule-style

Mit der Eigenschaft column-rule-style können Sie für mehrspaltig anzuzeigende Elemente verschiedene Schmuckrahmen definieren. Damit die Typen zur Geltung kommen, empfiehlt sich die Kombination mit Angaben zur Spaltenrahmendicke und/oder zur Farbe.

Erlaubt ist einer der folgenden border-style-Werte:

  • none, keine Linie
  • hidden, keine Linie
  • dotted, gepunktet
  • dashed, gestrichelt
  • solid, durchgezogen
  • double, doppelt durchgezogen
  • groove, 3D-Effekt
  • ridge, 3D-Effekt
  • inset, 3D-Effekt
  • outset, 3D-Effekt
Beispiel ansehen …
.mehrspaltig {
  column-count:      2;
  column-gap:        10em;
  column-rule-style: double;
}

column-rule-color

Mit der Eigenschaft column-rule-color können Sie für ein mehrspaltig anzuzeigendes Element die Farbe der Linie zwischen den Spalten bestimmen. Die Angabe dazu sollten Sie mit einer Angabe zum Typ und/oder einer Angabe zur Spaltenrahmendicke kombinieren.

Erlaubt ist eine Farbangabe oder der Wert transparent. Initialwert ist die Schriftfarbe des Elements (currentColor).

Beispiel ansehen …
 
.mehrspaltig {
  column-count:      2;
  column-gap:        10em;
  column-rule-style: dotted;
  column-rule-color: red;
      }
Beachten Sie: Eine Angabe zur Rahmenfarbe wird nur interpretiert, wenn auch eine Angabe zum Rahmentyp erfolgt.


column-span

Die Eigenschaft column-span erlaubt es, Elemente über mehrere Spalten zu verteilen, wie es etwa mit dem HTML-Attribut colspan für Tabellen möglich ist.

Folgende Angaben sind möglich:

  • none: Das Element fließt nicht über mehrere Spalten hinweg.
  • all: Das Element fließt über sämtliche Spalten hinweg. Der Inhalt davor wird automatisch zwischen den Spalten ausgeglichen.
Spalten verbinden ansehen …
 
.mehrspaltig {  
  columns: 5 12em;  
  column-rule: 5px dotted gold;  
  hyphens: auto;  
} 
 
h2 {
  font-family: 'Parisienne', cursive;
  column-span: all; 
}

Der mehrspaltige Text besteht aus bis zu 5 Spalten mit Textabsätzen und Überschriften.
Die h2-Überschriften werden mit column-span: all; über alle Spalten ausgedehnt.

Beachten Sie: Sobald column-count den Wert auto hat, füllt der mit column-span: all; versehene Inhalt nur die erste Spalte. Dies kann mit einer expliziten Angabe für width behoben werden.

Vertikaler Rhythmus

Auch wenn Sie wahrscheinlich noch nie vom vertikalen Rhythmus gehört haben, ist dies eine der typografischen Feinheiten, die Ihrer Webseite den letzten Schliff geben können. Das menschliche Auge orientiert sich unbewusst an gleichmäßigen Linien und Strukturen. Dies macht einen Text nicht nur optisch ansprechender sondern auch lesbarer, da das Hirn Zeit zum Erfassen der Textstruktur spart.

Im Printbereich soll mehrspaltiger Text in einem vertikalen Rhythmus so layoutet werden, dass die Zeilenlinien der verschiedenen Spalten eine gemeinsame Höhe haben. Dazu müssen Schriftgröße, Abstände und eventuelle Randlinien genau aufeinander abgestimmt werden. Mit der neuen lh-Einheit können Sie die Zeilenhöhe als zentrale Einheit für Zeilenhöhe, Abstände anderes zu verwenden.

Browserunterstützung
caniuse.com

Andererseits ist es sowieso nicht möglich, die column-Eigenschaft so zu steuern, dass bei Absätzen nicht einzelne Zeilen isoliert am Ende (Schusterjunge), bzw. Beginn (Hurenkind) der Spalte überstehen.[1]

Vertikaler Rhythmus mit columns und lh ansehen …
 
.mehrspaltig {  
  columns: 3 16em;  
  hyphens: auto;  
}  

.baseline-grid {
	line-height: 1.4;
	background-color: gold;
	background-image: repeating-linear-gradient(
		transparent 0 calc(1lh - 1px), 
		midnightblue calc(1lh - 1px) 1lh
	);
}

.baseline-grid * {
	line-height: 1lh;
	margin-block: 1lh;
	text-indent: 1lh;
}

.baseline-grid .smaller {
	font-size: 0.8em;
}

In diesem Beispiel wird ein Text in drei Spalten mit einer Mindestbreite von 16em aufgeteilt, wenn der Viewport genügend groß ist. Damit die Abstände zwischen den einzelnen Wörtern nicht zu groß werden, wurde eine Silbentrennung mit hyphens hinzugefügt.

Die line-height wird mit einem Wert von 1.4lh festgelegt. Dieser Wert wird dazu verwendet, mittels eines repeating-linear-gradient() mit calc(1lh - 1px) den Text mit Linien zu versehen.

Alle Kindelemente, auch die h2, fügen sich in diesen vertikalen Rhythmus ein.


Exkurs: Scroll Snap bei columns

Ist es möglich bei einer variablen Anzahl von Spalten, die mit columns erzeugt wurden, von einer Spalte zur anderen zu scrollen (siehe auch: Scroll Snap)? Das Problem ist ja, dass man die einzelnen Spalten nicht selektieren kann, andererseits aber nicht weiß, welche Kindelemenente sich in welcher Spalte befinden.

Die Lösung, die Gunnar Bittermann fand[2], scheint verblüffend einfach:

Scroll Snap bei multi-columns ansehen …
 
body {
	height: 100vh;
	padding: 1em 2em 0;
	display: flex;
	flex-direction: column;
}

div {
	overflow: auto;
	padding: 0.5em 0;
	column-width: 15em;
	column-gap: 3em;
	scroll-snap-type: x mandatory;
}

section {
	margin: 1.4em 0;
	break-inside: avoid;
	scroll-snap-align: start;
}

Jedes section-Element enthält mit scroll-snap-align: start; eine Fangposition. Die Browser ignorieren die zusätzlichen Angaben, falls sich mehrere Fangpositionien an gleicher Stelle befinden.

Probleme:

  • In Chromia braucht der Container noch tabindex="0", damit man den Tastaturfokus darauf setzen und mit Pfeiltasten scrollen kann.
  • Im Firefox kann man mit zwar vorwärts scrollen, mit aber nicht mehr zurück.
  • Die Spaltenbreite wird so berechnet, dass eine ganzzahlige Anzahl von Spalten ins Containerelement passt. Das mag zwar chic aussehen, auf Systemen, die – solange man nicht scollt – keine Scrollbar zeigen (macOS, iOS, Android?), haben Nutzer aber keinen visuellen Hinweis darauf, dass da rechts noch mehr Inhalt ist, zu dem man horizontal scrollen kann.
    Besser wäre es, wenn rechts eine Spalte angeschnitten wäre oder man irgend einen anderen Hinweis (Pfeil?) bekäme.

Siehe auch

Anzahl und Breite der Spalten

Abstände zwischen den Spalten

Linien zwischen den Spalten

Steuerung von Spaltenumbrüchen


Weblinks

  • eine Kritik: http://www.castor-und-pollux.de/2010/01/6-typographische-feinheiten-im-web/#vertikal
  • SELF-Forum: Scroll Snap bei columns vom 13.06.2021