Responsives Webdesign

Das "Responsive Webdesign" bezeichnet eine Technik, bei der die Bildschirmgröße des Betrachters berücksichtigt wird.

Auf kleinen Displays wie bei Smartphones werden weniger oder andere Inhalte angezeigt als bei den großen Monitoren am Arbeitsplatz, bei denen viel mehr Content dargestellt werden kann. Für "responsives Webdesign" benötigen wir ein "fluides Layout", anpassungsfähigen Inhalt und Layoutumbrüche durch "Media Queries".


Layouts

Das feste Layout

Das "feste" oder "fixe Layout" wird mit der Einheit Pixel erstellt. Eine flexible Anpassung an das Endgerät ist nicht möglich.


Das fluide Layout

Das "fluide" oder "fexible Layout" wird in % des Viewports, also in % der Fensterbreite angegeben. Beim Verändern der Fenstergröße verändern sich die Dimensionen relativ mit.


Das adaptive Layout

Das "adaptive Layout" besteht aus eine "festem Layout" in mehreren Versionen, je nach verfügbarem Platz wird das Layout anders dargestellt. Die Umsetzung wird durch definierte Umbruchpunkte ermöglicht.


Das responsive Layout

Das "responsive Layout" vereint das "adaptive Layout" mit dem "fluiden Layout". Dadurch wird der Inhalt an der Fenstergröße angepasst und bei bestimmten Größen wird ein anderes Layout verwendet.


Flexible Raster - Gridsystem

Das "Grid-System" mit den "960 Pixeln" breite ist schon ein etwas älterer Kollege im Webdesign.

Typisch für seine Zeit war ein einfaches "2-Spalten Layout".

Grundelemente erstellen

<div id="wrapper">
 <div id="nav">
  ...
 </div>
 <div id="main">
  ...
 </div>
</div>
Elemente für Layout definieren

#wrapper {
 width: 960px;
}
#nav {
 width: 300px;
 margin-left: 10px;
 margin-right: 10px;
}
#main {
 width: 620px;
 margin-left: 10px;
 margin-right: 10px;
}

Mit Sicherheit gibt es noch genug Webseiten, die dieses Layout verwenden, weil es eine Standardgröße war, als die Monitore am Arbeitsplatz mit einer Auflösung von "1024 x 768" Pixel weit verbreitet waren. Es ist das Ergebnis aus "12 Spalten" mit je "60 Pixel" und "10 Pixel" links und rechts Außenabstand. Um aus dem festen Pixel flexible Einheiten zu machen, berechnen wir nach einer Formel die % des Viewports.

Formel für Berechnung des Vieweports. Spaltenbreite * 100 / Gesamtbreite

Angenommen, wir müssen ein "960 Pixel" Layout flexibel gestalten, dann rechnen wir die Pixel der Spaltenbreite in % des Viewports um.

Als Erstes die kleine Spalte vom Bereich nav.

Formel für Berechnung der Spaltenbreite. 300px * 100 / 960px = 31.25%

Als Nächstes die breite Spalte vom Bereich "main".

Formel für Berechnung der Spaltenbreite. 620px * 100 / 960px = 64.58333333%

Auch wenn es übertrieben wirkt, mit so vielen Nachkommastellen zu arbeiten, sollten wirklich viele Nachkommastellen verwendet werden. Umso mehr Nachkommastellen angegeben werden, umso geringer ist die Gefahr, dass Rundungsfehler auftreten. Auch bei den kleinen Abständen wird genau gerechnet.

Formel für Berechnung der Spaltenbreite. 10px * 100 / 960px = 1.041666667%

Achtung!

Es ist unbedingt darauf zu achten, dass kein Komma geschrieben wird, sondern ein Punkt als Trennzeichen verwendet wird.

In allen Programmiersprachen wird anstelle des deutschen Kommas ein Punkt verwendet, um Fließkommazahlen anzugeben. Das deutsche Komma wird in der Programmierung zur Aufzählung verwendet.

Jetzt nur noch die festen Pixelwerte in CSS mit den errechneten %-Werten austauschen und nicht vergessen, die Gesamtbreite vom Bereich wrapper auf "100%" zu setzen.

Elemente für Layout flexibel definieren

#wrapper {
 width: 100%;
}
#nav {
 width: 31.25%;
 margin-left: 1.0416666667%;
 margin-right: 1.0416666667%;
}
#main {
 width: 64.5833333333%;
 margin-left: 1.0416666667%;
 margin-right: 1.0416666667%;
}

Schon ist aus einem festen Layout ein fluides Layout geworden.


Layoutumbrüche - Breakpoints

Ein Layoutumbruch wird durch die Technologie "Media Queries" erzeugt.

Media Queries generieren

@media(min-width: 600px) {
 Wird ausgeführt wenn der Viewport mindestens "600px" breit ist.
}

Die Deklarationen im Anweisungsblock werden ausgeführt, wenn der Viewport mindestens eine breite von "600 Pixel" hat.


Schlüsseltechnologie Media Queries

Mit "Media Queries" können Designs für verschiedene Ausgabemedien individuell angepasst werden.

"Media Queries" unterteilen zum einen die "Media-Typen" und zum anderen die "Media-Eigenschaften".


Mediatypen

Die wohl bekanntesten und am häufigsten verwendeten "Mediatypen" sind "screen" für den Bildschirm und "print" für den Drucker.

Mediatyp definieren im link-Element

<link href="design.css" rel="stylesheet" media="screen">

Wenn bei der Referenz zum "Stylesheet" kein "Mediatyp" angegeben wird, dann hat das "Stylesheet" den "Mediatyp" "all".


Innerhalb eines "Stylesheets" definieren wir die Eigenschaften für die verschiedenen "Mediatypen" in geschweiften Klammern.

Mediatyp definieren in CSS

@media screen {
 CSS Deklarationen
}

Bei Import-Anweisungen hängen wir den "Mediatyp" einfach direkt hinten ran.

Mediatyp definieren als import in CSS

@import "farben.css" screen;

Mediaeigenschaften

Neben den "Mediatypen" gibt es noch die "Media-Features" oder einfach die "Media-Eigenschaften". "Mediaeigenschaften" beschreiben unter anderem:

Mediaeigenschaften
  • Größe des Viewport
  • Ausrichtung des Viewport
  • Farbtiefe vom Display
  • Bildschirmauflösung

Die "Mediaeigenschaften" werden direkt bei den "Mediatypen" in runden Klammern geschrieben, bei denen sie gelten sollen.

Mediaeigenschaft definieren im link-Element

<link href="design.css" rel="stylesheet" media="screen and (max-width: 800px")>

Mediaeigenschaft definieren in CSS

@media screen and (max-width: 800px) {
 CSS Deklarationen
}

Mediaeigenschaft definieren als import in CSS

@import url("farben.css") screen and (max-width: 800px);

Mit "Media Queries" werden also Bedingungen geprüft, die ausgeführt werden, wenn das Ergebnis "true" ist, also wenn die Aussage zutrifft. Zwischen den "Mediatypen" und den "Mediaeigenschaften" können wir noch das logische Schlüsselwort "and" verwenden. Die Kombination aus "Mediatyp" dem Schlüsselwort "and" und der "Mediaeigenschaft" stellt sicher, dass der Anweisungsblock nur ausgeführt wird, wenn die Bedingungen zu "Mediatyp" und "Mediaeigenschaft" "true" ergibt.


Adaptives oder responsives Layout?

Beim "adaptiven Layout" wird das Design nur an bestimmten Stellen umgebrochen.

Das "fluide Layout" wächst relativ mit dem verfügbaren Platz. Die Kombination aus "adaptivem Layout" und "fluiden Rastern" eignet sich optimal um "responsive Designs" zu erschaffen. Das "adaptive Layout" bietet die größere Detailkontrolle. Das "responsive Layout" bietet die größere Flexibilität.


Schnelleinstieg responsive Webdesign

Angenommen, es gibt einen grafischen Entwurf mit festen Abmessungen und nun soll daraus eine "responsive Webseite" entstehen.

  • Die Vorgabe hat eine Gesamtbreite von "1400 Pixeln".
  • Über die gesamte Breite erstreckt sich ein Logo im Kopfbereich der Seite.
  • Die Navigation befindet sich auf der linken Seite und hat "280 Pixel" breite.
  • An der rechten Seite befinden sich aktuelle News die "320 Pixel" breit sind.
  • Dann bleiben für den Hauptteil der Webseite "800 Pixel" übrig.

In diesen "800 Pixeln" breiten Hauptfenster befinden sich immer 3 aktuelle Storys, die aus einer Überschrift, einem Bild und etwas Text bestehen. Wenn genug Platz vorhanden ist, stehen die Storys nebeneinander, sollte die Webseite allerdings eine Breite erreichen, die unter "1000 Pixel" liegt, dann sollen die Storys zur besseren Darstellung untereinander stehen. Direkt unter dem Storybereich mit den Bildern befinden sich die älteren Storys ohne Bilder.


Jetzt noch mal Stück für Stück mit dem entsprechenden Quelltext dazu.

Die Vorgabe ist eine maximale Gesamtbreite mit "1400 Pixel".

Elemente erstellen

<body>
 <div id="wrapper">
 </div>
</body>
Gesamtbreite definieren

#wrapper {
 max-width: 1400px;
}

Über die gesamte Breite erstreckt sich ein Logo im Kopfbereich der Seite.

Elemente erstellen

<body>
 <div id="wrapper">
  <header>
   <img src="banner.jpg" alt="Logo" width="1400px">
  </header>
 </div>
</body>

Die Navigation befindet sich auf der linken Seite und hat "280 Pixel" breite.

Elemente erstellen

<body>
 <div id="wrapper">
   ...
  </header>
  <nav id="nav">
   <ul>
    <li><a href="index.html">Startseite</a></li>
    <li><a href="#">Übersicht</a></li>
    <li><a href="#">Geschichte</a></li>
    <li><a href="#">Impressum</a></li>
   </ul>
  </nav>
 </div>
</body>
Navigationsbereich definieren

#nav {
 width: 280px;
 float: left;
}
erster Teil des Layouts

Neben der Navigation sind der Hauptinhalt (mittig) und ein Newsbereich (rechts). Beide werden wir in einem extra <div>-Bereich packen und nach rechts schieben, um ein überlappen mit der Navigationsleiste zu verhindern, die wir mit "float" nach links gestellt haben.

Elemente erstellen

<body>
 <div id="wrapper">
   ...
  </nav>
  <div class="main-wrapper">
   <main>
   </main>
   <aside>
   </aside>
  </div>
 </div>
</body>
main-wrapper definieren

.main-wrapper {
 width: 1120px;
 margin-left: 280px;
}

An der rechten Seite befinden sich aktuelle News die "320 Pixel" breit sind.

Elemente erstellen

<body>
 <div id="wrapper">
   ...
   <aside>
    <h2>News</h2>
    <p>Schlagzeilen</p>
    <p>Unglaubliches</p>
    <p>Presse</p>
    <h3>Sport</h3>
    <p>Basketball</p>
    <p>Tennis</p>
    <p>Golf</p>
   </aside>
  </div>
 </div>
</body>
aside-Bereich definieren

aside {
 width: 320px;
}

Dann bleiben für den Hauptteil der Webseite "800 Pixel" übrig. Um den Hauptbereich mittig zu platzieren und die News nach rechts zu schieben, verwenden wir wieder "float" und "margin-left".

main und aside-Bereich definieren

main {
 float: left;
 width: 800px;
}
aside {
 width: 320px;
 margin-left: 800px;
}
erweiterte Webseite für Layoutexperiment

Der Hauptbereich beinhaltet 2 <section>-Elemente, einen für die neuen Storys und einen für die alten Storys. Das <section>-Element für die neuen Storys bekommt für jede Story ein <article>-Element, in dem ein Bild, eine Überschrift und etwas Text stehen.

Elemente erstellen

<body>
 <div id="wrapper">
   ...
   </nav>
   <div class="main-wrapper">
    <main>
    <section class="neue-storys">
     <article class="storybox">
      <img src="board.jpg" alt="Bild" width="270px">
      <div class="story">
       <h2>Neue Architektur für Prozessorkerne</h2>
       <p>Durch einen neuen Denkansatz wurde eine Prozessorarchitektur entwickelt, die eine so hohe Recheneffizenz hat dass die Messungen noch nicht abgeschlossen werden konnten.</p>
      </div>
     </article>
     <article class="storybox">
      <img src="math.jpg" alt="Bild" width="270px">
      <div class="story">
       <h2>Neue Zahlenarten entdeckt</h2>
       <p>Neben den bekannten natürlichen Zahlen, ganzen Zahlen, rationalen Zahlen und reellen Zahlen gibt es jetzt die Kategorie der ungewöhnlichen Zahlen.</p>
      </div>
     </article>
     <article class="storybox">
      <img src="speedlimit.jpg" alt="Bild" width="270px">
      <div class="story">
       <h2>Tempolimit im Internet</h2>
       <p>Weil für Spionageagenturen der Datenverkehr zu schnell zum mitlesen geworden ist, soll ein Tempolimit im Internet eingeführt werden.</p>
      </div>
     </article>
    </section>
    <section class="alte-storys">
    </section>
   </main>
   <aside>
    ...
   </aside>
  </div>
 </div>
</body>

Das <section>-Element für die alten Storys bekommt in unserem Beispiel nur eine Überschrift und etwas Text.

Elemente erstellen

<body>
 <div id="wrapper">
   ...
   </nav>
   <div class="main-wrapper">
    <main>
    <section class="neue-storys">
    ...
    </section>
    <section class="alte-storys">
     <h2>Alte Storys</h2>
     <p>Hier können die alten Storys aufgeführt werden.</p>
    </section>
   </main>
   <aside>
    ...
   </aside>
  </div>
 </div>
</body>

Bis hier, haben wir eine Seite mit einem "3-Spalten-Layout" und einer Größenangabe wie in der Designvorlage.

erweiterte Webseite für Layoutexperiment, mit 3-Spalten Layout

Um jetzt Richtung "responsives Layout" zu gehen, werden wir aus dem festen Pixelwerten wieder ein "fluides Layout" mit %-Angaben machen.

Fluides Layout erstellen

#wrapper {
 width: 100%;
}
#nav {
 width: 20%;
 float: left;
}
.main-wrapper {
 width: 80%;
 margin-left: 20%;
}
main {
 float: left;
 width: 71.4285714285%;
}
aside {
 width: 28.5714285715%;
 margin-left: 71.4285714285%;
}
/*Das Bild im header soll sich auch an den Viewport orientieren*/
header img {
 width: 100%;
}

Die 3 Spalten und das Bild im <header> verhalten sich jetzt wie gewollt und passen sich an die breite des Browserfensters an.


Betrachten wir wieder den Hauptbereich mit den Storys

Wenn genug Platz vorhanden ist, stehen die Storys nebeneinander, sollte die Webseite allerdings eine Breite erreichen, die unter "1000 Pixel" liegt, dann sollen die Storys untereinander dargestellt werden. Hierfür greifen wir auf die "Media Queries" zurück.

Media Queries mit Breakpoint

@media screen and (max-width: 1000px) {
 .storybox {
  width: 100%;
 }
 .storybox img {
  width: 55%;
  float: left;
  margin: .4rem;
 }
}
@media screen and (min-width: 1001px) {
 .neue-storys {
  display: flex;
 }
 .storybox {
  margin: .8rem;
  flex: 1;
 }
 .storybox img {
    width: 100%;
 }
}

Bei einem Viewport bis "1000 Pixel" stehen die Storys untereinander.

Storys stehen untereinander

Bei einem Viewport ab "1001 Pixel" stehen die Storys nebeneinander.

Storys stehen nebeneinander

Hier noch mal der komplette Quelltext (<body>-Element) zum Kopieren und ausprobieren.

HTML-Datei (nur <body>)

<body>
 <div id="wrapper">
  <header>
   <img src="banner.jpg" alt="Logo" width="1400px">
  </header>
  <nav id="nav">
   <ul>
    <li><a href="index.html">Startseite</a></li>
    <li><a href="#">Übersicht</a></li>
    <li><a href="#">Geschichte</a></li>
    <li><a href="#">Impressum</a></li>
   </ul>
  </nav>
  <div class="main-wrapper">
  <main>
    <section class="neue-storys">
     <article class="storybox">
      <img src="board.jpg" alt="Bild" width="270px">
      <div class="story">
       <h2>Neue Architektur für Prozessorkerne</h2>
       <p>Durch einen neuen Denkansatz wurde eine Prozessorarchitektur entwickelt, die eine so hohe Recheneffizenz hat dass die Messungen noch nicht abgeschlossen werden konnten.</p>
      </div>
     </article>
     <article class="storybox">
      <img src="math.jpg" alt="Bild" width="270px">
      <div class="story">
       <h2>Neue Zahlenarten entdeckt</h2>
       <p>Neben den bekannten natürlichen Zahlen, ganzen Zahlen, rationalen Zahlen und reellen Zahlen gibt es jetzt die Kategorie der ungewöhnlichen Zahlen.</p>
      </div>
     </article>
     <article class="storybox">
      <img src="speedlimit.jpg" alt="Bild" width="270px">
      <div class="story">
       <h2>Tempolimit im Internet</h2>
       <p>Weil für Spionageagenturen der Datenverkehr zu schnell zum mitlesen geworden ist, soll ein Tempolimit im Internet eingeführt werden.</p>
      </div>
     </article>
    </section>
    <section class="alte-storys">
     <h2>Alte Storys</h2>
     <p>Hier können die alten Storys aufgeführt werden.</p>
    </section>
   </main>
   <aside>
    <h2>News</h2>
    <p>Schlagzeilen</p>
    <p>Unglaubliches</p>
    <p>Presse</p>
    <h3>Sport</h3>
    <p>Basketball</p>
    <p>Tennis</p>
    <p>Golf</p>
   </aside>
  </div>
 </div>
</body>
Komplette CSS-Datei

#wrapper {
 width: 100%;
}
#nav {
 width: 20%;
 float: left;
}
.main-wrapper {
 width: 80%;
 margin-left: 20%;
}
main {
 float: left;
 width: 71.4285714285%;
}
aside {
 width: 28.5714285715%;
 margin-left: 71.4285714285%;
}
/*Das Bild im header soll sich auch an den Viewport orientieren*/
header img {
 width: 100%;
}
@media screen and (max-width: 1000px) {
 .storybox {
  width: 100%;
 }
 .storybox img {
  width: 55%;
  float: left;
  margin: .4rem;
 }
}
@media screen and (min-width: 1001px) {
 .neue-storys {
  display: flex;
 }
 .storybox {
  margin: .8rem;
  flex: 1;
 }
 .storybox img {
    width: 100%;
 }
}

Weiter mit Animationen