Designbeispiel: ein eleganter Kalender

(Auszug aus "CSS Kochbuch" von Christopher Schmitt)

Kalender eignen sich hervorragend, um Dinge zu organisieren – sie helfen uns dabei, gemeinsame Mittagessen anzusetzen, Geburtstage nicht zu vergessen und unsere Flitterwochen zu planen. Als Designer können wir uns all die Monate, Termine und Verabredungen als tabellarische Daten vorstellen.

Wenn Sie Ihren Kalender in Form einer allgemeinen HTML-Tabelle darstellen, sieht diese vermutlich eher sachlich aus. Wenn der Kalender außerdem noch eine große Anzahl von Ereignissen enthält, kann er schnell überladen wirken. In diesem Designbeispiel benutzen wir CSS, um den Kalender lesbarer zu machen, als dies mit reinem HTML-Code möglich wäre.

In der folgenden Abbildung sehen Sie die reine HTML-Darstellung des Kalenders ohne irgendwelche Stildefinitionen.

Kalender ohne Stildefinitionen

Abbildung: Der Kalender ohne Stildefinitionen.

Als Nächstes werfen wir einen Blick auf die Struktur des Markup-Codes. Wie Sie bereits aus dem Rezept Den Zellzwischenraum einstellen wissen, muss der Wert für das Attribut cellspacing im table-Element selbst festgelegt werden:

<table cellspacing="0">

Es folgen jeweils auf einer eigenen Zeile die Zellen mit den Tabellenüberschriften (th), die das Jahr, den Monat und den Tag enthalten:

<tr>
  <th colspan="7" id="jahr"><a href="jahr.html?davor">&lt;</a> 2001 <a href="jahr.html?danach">&gt;</a></th>
</tr>
<tr>
  <th colspan="7" id="monat"><a href="monat.html?davor">&lt;</a> Oktober <a href="month.html?danach">&gt;</a></th>
</tr>
<tr id="tage">
  <th>Montag</th>
  <th>Dienstag</th>
  <th>Mittwoch</th>
  <th>Donnerstag</th>
  <th>Freitag</th>
  <th>Samstag </th>
  <th>Sonntag</th>
</tr>

Jedes Datum eines Monats enthält einen Link auf den betreffenden Tag (der den Benutzer zu einer detaillierten Liste für diesen Tag führt) sowie einen Link, über den weitere Termine für diesen Tag eingetragen werden können. Umgeben Sie diese beiden Links mit einem div-Element, damit es zwischen den beiden Teilen der Tabellenzelle eine klare Trennung gibt.

Das erste Datum in unserem Kalender ist der 1. Oktober, der auf einen Montag fällt:

<tr>
  <td>
    <div><a href="1.html" class="datum">1</a> <a href="neu.html" class="neuerTermin">+</a></div>
  </td>

Für den folgenden Tag, den 2. Oktober, wurde bereits ein Termin eingetragen. Dieser ist in der Dokumentstruktur als Link markiert und befindet sich unterhalb des div-Elements mit dem Datum und dem Link auf die Funktion neuerTermin:

<td>
  <div><a href="2.html" class="datum">2</a> <a href="neu.html" class="neuerTermin">+</a></div>
  <a href="16.html?id=1" class="termin">Planmäßiges Treffen der Stadtplaner</a>
</td>

Der übrige Markup-Code besitzt eine ähnliche Struktur. Um Samstag und Sonntag als Wochenendtage hervorzuheben, weisen Sie den entsprechenden Zellen eine eigene Klasse (class) zu.

    <td>
      <div><a href="3.html" class="datum">3</a> <a href="neu.html" class="neuerTermin">+</a></div>
    </td>
    <td>
      <div><a href="4.html" class="datum">4</a> <a href="neu.html" class="neuerTermin">+</a></div>
    </td>
    <td>
      <div><a href="5.html" class="datum">5</a> <a href="neu.html" class="neuerTermin">+</a></div>
      <a href="5.html?id=1" class="termin">Papas Geburtstag</a>
    </td>
    <td class="wochenende">
      <div><a href="6.html" class="datum">6</a> <a href="neu.html" class="neuerTermin">+</a></div>
    </td>
    <td class="wochenende">
      <div><a href="7.html" class="datum">7</a> <a href="neu.html" class="neuerTermin">+</a></div>
      <a href="7.html?id=1" class="termin">FSU bei UM</a>
    </td>
  </tr>

  [...] 

  <tr>
    <td class="weekend">
      <div><a href="29.html" class="datum">29</a> <a href="neu.html" class="neuerTermin">+</a></div>
      <div class="termin">Süßigkeiten kaufen</div>
    </td>
    <td>
      <div><a href="30.html" class="datum">30</a> <a href="neu.html" class="neuerTermin">+</a></div>
      <a href="16.html?id=1" class="termin">Planmäßiges Treffen der Stadtplaner</a>
    </td>
    <td>
      <div><a href="31.html" class="datum">31</a> <a href="neu.html" class="neuerTermin">+</a></div>
      <a href="31.html?id=1" class="termin">Halloween</a>
      <a href="31.html?id=2" class="termin">Grippeimpfung</a>
    </td>
    <td>
     <div class="leer">&nbsp;</div>
    </td>
    <td>
      <div class="leer">&nbsp;</div>
    </td>
    <td class="wochenende">
      <div class="leer">&nbsp;</div>
    </td>
    <td class="wochenende">
      <div class="leer">&nbsp;</div>
    </td>
  </tr>
</table>

Nachdem die Struktur des Kalenders fertig ist, können wir uns nun den Stildefinitionen zuwenden. Als Erstes definieren wir die Stile für die Tabelle selbst und die enthaltenen Links. Die Breite der Tabelle wird auf 100% des sichtbaren Bereichs festgelegt. Für die Darstellung wird das Modell der zusammengefassten Rahmen (border-collapse: collapse) verwendet (siehe das Rezept Rahmen und Innenabstände für Zellen einstellen). Dies ist das von den meisten Webdesignern benutzte Modell, das vom größten Teil der CSS-fähigen Browser richtig interpretiert wird. Außerdem wird die Unterstreichung der Links abgeschaltet (siehe folgende Abbildung):

table {
 width: 100%;
 border-collapse: collapse;
}
td a:link, td a:visited {
 text-decoration: none;
}

Unterstreichung der Links wurde entfernt

Abbildung: Die Unterstreichung der Links wurde entfernt.

Im nächsten Schritt nehmen wir die Gestaltung der ersten drei Tabellenzeilen vor. Diese Zeilen werden jeweils über einen ID-Selektor angesprochen, da die Stile nur einmal im Dokument vorkommen sollen. Alle drei Zeilen mit Tabellenüberschriften sollen in einer Schrift mit fester Zeichenbreite dargestellt werden. Dabei erhält der Monat die höchste Schriftgröße, es folgen Jahr und Tage in absteigender Größe (siehe die nächste Abbildung):

#jahr {
 font-family: monospace;
 font-size: 1.5em;
 padding: 0;
 margin: 0;
}
#monat {
 font-family: monospace;
 font-size: 2em;
 padding: 0;
 margin: 0;
}
#tage {
 background-color: black;
 color: white;
 font-family: monospace;
 width: 75px;
}

Stildefinitionen für die ersten drei Zeilen

Abbildung: Stildefinitionen für die ersten drei Zeilen.

Jetzt ist es an der Zeit, die Datums- und "Neuer Termin"-Links mit Stilen zu versehen. Um die in den meisten Kalendern verwendeten "Datumskästchen" nachzubilden, werden die Rahmenseiten rechts und unterhalb des Textes hervorgehoben und der Inhalt per Definition als Float nach links verschoben.

Die Links zum Hinzufügen neuer Termine sollen möglichst nah beim Datum stehen. Wenn Sie den Link per Floating rechts anordnen, wird er neben dem Datum für den folgenden Tag angezeigt. Ordnen Sie ihn dagegen links an, so teilen Sie dem Benutzer mit, dass sich das Pluszeichen (+) auf einen neuen Termin für den aktuellen Tag bezieht (siehe nächste Abbildung):

.datum {
 border-right: 1px solid black;
 border-bottom: 1px solid black;
 font-family: monospace;
 text-decoration: none;
 float: left;
 width: 1.5em;
 height: 1.5em;
 background-color: white;
 text-align: center;
}
.neuerTermin {
 display: block;
 float: left;
 width: 1em;
 height: 1em;
 text-align: center;
 background-color: #666;
 color: white;
 font-weight: bold;
 text-decoration: none
}

Stildefinitionen für Datums- und Neuer Termin-Links

Abbildung: Stildefinitionen für die Datums- und "Neuer Termin"-Links.

Nun befassen wir uns mit den Stildefinitionen für die Terminlisten. Da die vorangehenden Links als Float definiert wurden, wird eine sichtbare Abgrenzung benötigt. Gleichzeitig sollen die Termineinträge unterhalb des Datums angezeigt werden.

Die sichtbare Trennung erreichen Sie durch die Eigenschaft clear. Damit können Sie festlegen, welche Seiten eines Elements nicht neben einem Float stehen dürfen. In diesem Fall soll die linke Seite der Terminbeschreibung nicht neben den Datums- und "Neuer Termin"-Links stehen. Für den Fall, dass sich das Design in der Zukunft ändert, benutzen wir hier vorsichtshalber den Wert both anstelle von left.

Danach ändern wir die Darstellungsrolle des Links auf block und versehen ihn an seiner Unterseite mit einem Innenabstand (siehe nächste Abbildung). Durch diese Anpassungen soll verhindert werden, dass sich mehrere Termineinträge in der gleichen Tabellenzelle überschneiden. Zudem schafft der Innenabstand einen netten visuellen Puffer, durch den das Auge leicht zwischen zwei Terminen unterscheiden kann:

.termin {
 clear: both;
 padding-left: 1em;
 padding-bottom: .75em;
 display: block;
}

Links zu Terminen werden als Block-Level-Elemente behandelt

Abbildung: Die Links zu den Terminen werden als Block-Level-Elemente behandelt.

Jeder Tabellenzelle wird eine Breite von 14% zugewiesen, da die Gesamtbreite der Tabelle (100% des sichtbaren Bereichs) auf die 7 Wochentage verteilt ungefähr den Wert 14 ergibt. Die Zellen werden mit einem weißen Rahmen umgeben, und ihr Inhalt wird mit Hilfe der Eigenschaft vertical-align oben angeordnet (siehe nächste Abbildung):

td {
 width: 14%;
 background-color: #ccc;
 border: 1px solid white;
 vertical-align: top;
}

Zelleninhalt wird oben ausgerichtet

Abbildung: Der Zelleninhalt wird oben ausgerichtet.

Die Hintergrundfarbe für die Termine am Wochenende wird dunkler dargestellt als die der übrigen Wochentage (siehe folgende Abbildung):

.wochenende {
 background-color: #999;
}

Wochenendtage werden durch dunkelgrauen Hintergrund hervorgehoben

Abbildung: Die Wochenendtage werden durch einen dunkelgrauen Hintergrund hervorgehoben.

Die übrigen Tage im Kalender werden mit einem leichten Grauton hinterlegt (siehe nächste Abbildung):

.leer {
 border-right: 1px solid #666;
 border-bottom: 1px solid #666;
 font-family: monospace;
 text-decoration: none;
 float: left;
 width: 1.5em;
 height: 1.5em;
 background-color: #ccc;
 text-align: center;
}

Stildefinitionen für leere Daten des folgenden Monats

Abbildung: Stildefinitionen für leere Daten des folgenden Monats.

Der aktuelle Tag (in unserem Beispiel der 27.) wird durch einen 2 Pixel breiten schwarzen Rahmen markiert:

#heute {
 border: 2px solid black;
}

Und damit ist der Kalender fertig (siehe folgende Abbildung).

Aktuelles Datum wird durch dunkleren Rahmen gekennzeichnet

Abbildung: Das aktuelle Datum wird durch einen dunkleren Rahmen gekennzeichnet.

  

<< zurück vor >>

 

 

 

Tipp der data2type-Redaktion:
Zum Thema CSS bieten wir auch folgende Schulungen zur Vertiefung und professionellen Fortbildung an:

Copyright der deutschen Ausgabe © 2007 by O’Reilly Verlag GmbH & Co. KG
Für Ihren privaten Gebrauch dürfen Sie die Online-Version ausdrucken.
Ansonsten unterliegt dieses Kapitel aus dem Buch "CSS Kochbuch" denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.

O’Reilly Verlag GmbH & Co. KG, Balthasarstr. 81, 50670 Köln