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.[1][2]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.

Mehrspaltigkeit

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.

Mehrspaltigkeit mit CSS ansehen …
      ...
      .mehrspaltig {
        column-count: 2;
      }

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

Beachten Sie: Auch bei einer geringeren Breite bleibt die Aufteilung in 2 Spalten bestehen!
Wenn gleichzeitig eine Angabe zur Spaltenbreite gemacht wurde, werden ggf. weniger Spalten erzeugt.

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 sind …

  • 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.
Angabe einer Mindestbreite 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 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.

columns

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

Funktionsweise von columns ansehen …
.beispiel1 ul {
    columns:         5 6em;
}
.beispiel2 ul {
    columns:         5 12em;
}
.beispiel3 ul {
    columns:         2 12em;
}

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

Spaltenzwischenräume gestalten

In den Default-Stylesheets der Browser wird bei columns eine 1em breite Spalte ohne Linie erzeugt. Diese können Sie mit CSS genauer formatieren.

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

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.

Beispiel ansehen …
.mehrspaltig {
  column-count:      2;
  column-gap:        10em;
  column-rule-style: double;
}

column-rule-width und gap

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-rule-width: thick;
  column-rule-style: dashed;
  gap:        10em;
}

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

Damit die dicke gestrichelte Trennlinie besser zur Geltung kommt, wurde der Zwischenabstand mit gap auf übertriebene 10em vergrößert. Die Eigenschaft wurde zuerst als column-gap für die vertikalen Zwischenräume im Splatenlayout eingführt, findet sich aber mittlerweiel auch bei Grid Layout und Flexbox.

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

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-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: medium dotted gold;  
  -webkit-hyphens: auto;
  hyphens: auto;  
}

Der mehrspaltige Text erhält mit column-rule: medium dotted gold; eine mittelbreite goldene gepunktete Trennlinie.

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

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

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: medium 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.

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.

widows und orphans

Bisher war es 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.[3]

Mit orphans können Sie bestimmen, wie viele Zeilen eines längeren Fließtextabsatzes auf der Seite vor dem Umbruch mindestens stehen sollen. Erlaubt ist eine Zahl für die Anzahl Zeilen. Voreinstellung ist 2.(DTP-Fachjargon hierzulande: Schusterjungen).[4]

Beispiel
.mehrspaltig {  
  columns: 3 16em;  
  hyphens: auto;  
  orphans:3; 
}

Analog dazu regelt die widows-Eigenschaft, wie viele Zeilen eines längeren Fließtextabsatzes auf der Spalte nach dem Umbruch auf der neuen Seite mindestens stehen sollen.

Beispiel
.mehrspaltig {  
  columns: 3 16em;  
  hyphens: auto;  
  widows:3; 
}

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[5], 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

  1. W3C: CSS Multi-column Layout Module
  2. W3C: Algorithmus zur Bestimmung von Spaltenzahl und -breite
  3. eine Kritik: http://www.castor-und-pollux.de/2010/01/6-typographische-feinheiten-im-web/#vertikal
  4. W3C: Breaks Between Lines: orphans, widows
  5. SELF-Forum: Scroll Snap bei columns vom 13.06.2021