Vektor-Grafiken haben für Logos, Diagramme und Symbole die fantastische Eigenschaft, bei beliebig hoher Auflösung relativ kleine Dateigrößen zu verursachen. Und hier folgen ein paar Kniffe, um SVG-Grafiken mit der Hilfe von CSS sowohl am Bildschirm als auch im Druck gut aussehen zu lassen.

Seitdem die Unterstützung von SVG-Vektor-Grafiken in jedem modernen Browser kein Problem mehr darstellt, ist der Siegeszug von SVG-Grafiken unaufhaltsam. Ob via <img>, als CSS-Hintergrundbild, oder direkt in ein HTML-Dokument eingebettet: kleine Symbole wie komplexe Grafiken können so responsiv auf den Bildschirm gezaubert werden. Eine Einleitung in das Thema „SVG“ bei CSS-Tricks erklärt die grundsätzlichen Handgriffe.

Fast immer wird eine SVG-Grafik mit einem Vektor-Grafikprogramm (wie zum Beispiel dem kostenlosen Inkscape) erzeugt. Dabei wird oft vergessen, dass SVG-Dateien eigentlich nur aus XML bestehen, das mit Hilfe eines Text-Editors bearbeitet werden kann.

Interessanterweise kann innerhalb eines SVG-Dokuments auch CSS verwendet werden. Und mit CSS können wir auch Media-Queries einsetzen.

Höchste Zeit, den Text-Editor auszupacken und unserem SVG zusätzliches CSS überzuhelfen!

Ein einfaches Print-Stylesheet

Ein einfaches Stylesheet, um beim Druck von HTML- und SVG-Dokumenten im Browser störendes Beiwerk wie die automatisch vom Browser erzeugte Kopf- und Fußzeile loszuwerden, sieht wie folgt aus:

@page {
  margin: 0;
  padding: 0;
}
@page :footer {
  display: none
}
@page :header {
  display: none
}

Genau dieses CSS lässt sich mit einem <style>-Tag direkt in die SVG-Grafik einbauen. Dazu kann man an jeder beliebigen Stelle im Dokument ein solches Tag einfügen, und dann CSS einfügen:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg version="1.1" xmlns="http://www.w3.org/2000/svg">
  <title>…</title>
  <style>
  @page {
    margin: 0;
    padding: 0;
  }
  @page :footer {
    display: none
  }
  @page :header {
    display: none
  }
  </style>
  <!-- your svg here -->
</svg>

Natürlich könnt ihr auch jede andere Media-Query in das Dokument einfügen. Zu beachten: Beim Re-Import in ein Grafik-Programm kann dies möglicherweise nicht mehr korrekt interpretiert werden, und eure Grafik wirkt etwas verspielt. Uns interessiert aber sowieso nur das Ergebnis im Browser.

Druckvorschau

Um die Idee weiterzutreiben, kann man für eine SVG-Grafik im DIN A4 eine praktische Druckvorschau mitliefern. Dazu bauen wir uns ein Dokument mit den entsprechenden Abmessungen von 210×297 Millimetern und erzeugen ein Rechteck, dass exakt dem Seitenrand folgt:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg width="210mm" height="297mm" viewBox="0 0 210 297" version="1.1" xmlns="http://www.w3.org/2000/svg">
  <rect x="0" y="0" width="210" height="297" />
  <!-- your svg here -->
</svg>

Dieses Rechteck ist nun sowohl auf dem Bildschirm als auch im Druck zu sehen. Interessanterweise können wir so ziemlich jedem SVG-Element mittels class und id Attribute mitgeben, die wir (wie aus HTML gewohnt) CSS zuweisen können.

In diesem Fall wollen wir die eigentliche Seite weiß und den nicht druckbaren Bereich grau darstellen. Nicht zuletzt zeigt eine gepunktete Linie die Blattgrenze an:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg width="210mm" height="297mm" viewBox="0 0 210 297" version="1.1" xmlns="http://www.w3.org/2000/svg">
  <title>…</title>
  <style>
  svg {
    margin: 1em auto;
    background-color: #ddd;
  }
  .page {
    stroke: #999;
    stroke-dasharray: 0.5, 0.5;
    fill: #fff;
    display: inline;
  }
  </style>
  <rect class="page" x="0" y="0" width="210" height="297" />
  <!-- your svg here -->
</svg>

Damit wird unsere Kosmetik nun nicht im Druck zu Gesicht bekommen, unterscheiden wir noch zwischen Screen- und Print-Styles:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg width="210mm" height="297mm" viewBox="0 0 210 297" version="1.1" xmlns="http://www.w3.org/2000/svg">
  <title>…</title>
  <style>
  @page {
    margin: 0;
    padding: 0;
  }
  @page :footer {
    display: none
  }
  @page :header {
    display: none
  }
  .page {
    display: none;
  }
  @media screen {
    svg {
      margin: 1em auto;
      background-color: #ddd;
    }
    .page {
      stroke: #999;
      stroke-dasharray: 0.5, 0.5;
      fill: #fff;
      display: inline;
    }
  }
  </style>
  <rect class="page" x="0" y="0" width="210" height="297" />
  <!-- your svg here -->
</svg>

Fertig ist die SVG-Grafik mit Media Queries (in diesem Falle ein Spielbrett für Raumschiffe) – sowohl für die Ausgabe am Bildschirm als auch den Druck vorbereitet.

Weitere Ideen

Die Kombination aus SVG und CSS kann man natürlich noch weiter treiben. Da so ziemlich jede Media-Query im Browser für SVGs funktioniert, können auch Anpassungen an den Dark Mode oder für verschiedene Monitor-Größen direkt im SVG eingebettet werden.


Andere Artikel zum Thema · · · · ·

Zuletzt geändert am

fboës - Der Blog