# HTML: Mit canvas Zeichenflächen für JavaScript erstellen

Mit dem HTML-Element `<canvas>` erstellen Sie eine Fläche, die über JavaScript mit Grafiken oder Animationen gefüllt werden kann. Dafür wird ein 2D-Kontext-Objekt angelegt. Mit verschiedenen Methoden für die API des `<canvas>`-Tags legen Sie dann den gewünschten Inhalt fest.

## Was ist das HTML-`<canvas>`-Tag?

HTML `<canvas>` ist ein Element, das eine Zeichenfläche zur Verfügung stellt, in der Sie mit [JavaScript](https://www.ionos.de/digitalguide/websites/web-entwicklung/javascript-in-html-einbinden/) **Grafiken oder Animationen erzeugen** können. Der verfügbare Bereich wird dabei durch Höhen- und Breitenangaben definiert. Die Fläche kann mithilfe des praktischen [HTML-Tags](https://www.ionos.de/digitalguide/websites/web-entwicklung/html-tags/) in jedem Bereich eines [HTML](https://www.ionos.de/digitalguide/websites/web-entwicklung/was-ist-html/)-Dokuments hinterlegt werden.

Der Inhalt dieser „Leinwand“ (die deutsche Übersetzung von *canvas*) ist kein eigentlicher Bestandteil einer Webseite, sodass eine Anwendung von [CSS](https://www.ionos.de/digitalguide/websites/webdesign/css-lernen-leicht-gemacht/) oder anderen HTML-Elementen nicht möglich ist. Wird HTML `<canvas>` von einem Browser nicht unterstützt, wird der Inhalt daher als Fallback angezeigt. Moderne Browser unterstützen das Element allerdings nativ.

## HTML-`<canvas>`-Tag: Die Syntax

Das HTML-`<canvas>`-Element selbst stellt keine Werkzeuge zur Gestaltung zur Verfügung, sondern erstellt lediglich den Rahmen, in dem Sie mit JavaScript Grafiken erzeugen können. Die grundsätzliche Syntax des Elements liest sich wie folgt:

```html
<canvas id="BeispielCanvas" width="[Wert in Pixeln]" height="[Wert in Pixeln]"></canvas>
```

Sie benennen das Element über `id` und weisen ihm mit `width` und `height` die gewünschten Maße zu. Optional können Sie weitere Parameter verwenden, um die Gestaltung der Grafik zu präzisieren.

## Die Funktionsweise von `<canvas>` an einem einfachen Beispiel erklärt

Mithilfe der obigen Syntax können Sie jederzeit eine einfache Fläche erstellen. In unserem folgenden Beispiel soll diese Fläche eine Länge von 500 Pixeln und eine Höhe von 250 Pixeln haben. Dies ist der passende Code:

```html

<html>
<body>
<h1>Beispiel für HTML canvas</h1>
<canvas id="BeispielCanvas" width="500" height="250" style="border: 1px solid grey"></canvas>
<div class="hash d-none" hidden>hash_1ae923d355303e50c5821f2fcbd3f5b8689c7802</div><script data-shy-copy-guard>(function(){var C=[0x00AD,0x200B,0x200C,0x200D,0x2060,0xFEFF];var s=function(t){for(var i=0;i<C.length;i++){t=t.split(String.fromCharCode(C[i])).join("");}return t;};document.addEventListener("copy",function(e){var sel=document.getSelection();if(!sel||sel.isCollapsed||!e.clipboardData){return;}e.clipboardData.setData("text/plain",s(sel.toString()));try{var d=document.createElement("div");d.appendChild(sel.getRangeAt(0).cloneContents());e.clipboardData.setData("text/html",s(d.innerHTML));}catch(x){}e.preventDefault();});})();</script></body>
</html>
```

Mehr als eine bloße freie Fläche erhalten Sie auf diese Weise allerdings nicht. Nur mit JavaScript können Sie das erzeugte HTML-`<canvas>`-Element mit **Formen, Bildern, Texten oder Verläufen** füllen und diese Objekte bei Bedarf animieren. Die Inhalte werden in Form von Pixeln in einer Bitmap hinterlegt. Diese kann später in eine *PNG*-Grafik umgewandelt werden.

Um das Element zu nutzen, verwenden Sie die Methode `getElementById()`. Dies funktioniert nur, wenn Sie der `<canvas>`-Fläche eine eindeutige ID zugeordnet haben. Möchten Sie in dem festgelegten Bereich malen, zeichnen oder anderweitig interagieren, müssen Sie ein **2D-Kontext-Objekt erstellen**. Das funktioniert für unser Beispiel von oben mit dem folgenden Code:

```html
const BeispielCanvas = document.getElementById("BeispielCanvas");
const ctx = BeispielCanvas.getContext("2d");
```

Nun sind alle Vorbereitungen getroffen, um das HTML-`<canvas>`-Element tatsächlich als Leinwand zu nutzen. Mit der Funktion `fillRect()` können wir nun ein einfaches Rechteck im definierten Bereich platzieren. Dieses soll in Petrol (engl. „teal“) gehalten werden und 200 Pixel breit und 150 Pixel hoch sein. Wir platzieren es 10 Pixel vom linken Rand und 50 Pixel vom oberen Rand entfernt. Der gesamte Code sieht folgendermaßen aus:

```html

<html>
<body>
<h1>Beispiel für HTML canvas</h1>
<canvas id="BeispielCanvas" width="500" height="250" style="border:1px solid grey"></canvas>
<script>
const BeispielCanvas = document.getElementById("BeispielCanvas");
const ctx = BeispielCanvas.getContext("2d");
ctx.fillStyle = "teal";
ctx.fillRect(10, 50, 200, 150);
</script>
<div class="hash d-none" hidden>hash_1ae923d355303e50c5821f2fcbd3f5b8689c7802</div><script data-shy-copy-guard>(function(){var C=[0x00AD,0x200B,0x200C,0x200D,0x2060,0xFEFF];var s=function(t){for(var i=0;i<C.length;i++){t=t.split(String.fromCharCode(C[i])).join("");}return t;};document.addEventListener("copy",function(e){var sel=document.getSelection();if(!sel||sel.isCollapsed||!e.clipboardData){return;}e.clipboardData.setData("text/plain",s(sel.toString()));try{var d=document.createElement("div");d.appendChild(sel.getRangeAt(0).cloneContents());e.clipboardData.setData("text/html",s(d.innerHTML));}catch(x){}e.preventDefault();});})();</script></body>
</html>
```

## Wofüt kann HTML `<canvas>` genutzt werden?

Während wir in unserem Beispiel von oben lediglich ein einfaches Rechteck aufgezogen haben, können Sie mit dem `<canvas>`-Element auch deutlich komplexere Darstellungsformen realisieren. Möglich sind unter anderem **Kreisbögen, Texte, Transparenzen, Farbverläufe und Grafiken** in den Formaten *GIF*, *JPEG* und *PNG*. Diese können Sie beschneiden, skalieren und beliebig positionieren. Über die Zeitfunktion von JavaScript lassen sich außerdem Animationen innerhalb eines HTML-`<canvas>`-Tags umsetzen.

## Welche Abmessungen darf ein `<canvas>`-Element haben?

Die maximal möglichen Abmessungen für HTML `<canvas>` variieren je nach Browser und Umgebung. Für iOS beträgt die Grenze zum Beispiel 4096 x 4096 Pixel, während andere Systeme auch Maße von mehr als 10.000 x 10.000 Pixeln erlauben. Da sich die Fläche allerdings immer **am Seitenverhältnis orientiert**, sind die Elemente responsiv und so für verschiedene Devices geeignet.

## Methoden für die API von HTML `<canvas>` im Überblick

Wir haben bereits über die Erstellung eines 2D-Kontext-Objekts geschrieben. Mit einem solchen via `getContext("2d")` eingebundenen Objekt können Sie die `<canvas>`-Fläche jederzeit füllen. Nachfolgend haben wir die wichtigsten Methoden innerhalb der API zusammengefasst.

### Text

<table>
  <thead>
    <tr>
      <th>Methode</th>
      <th>Beschreibung</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>`font`</td>
      <td>Legt die Schriftart für Textinhalte fest</td>
    </tr>
    <tr>
      <td>`fillText()`</td>
      <td>Fügt Text (vollständig ausgefüllt) im HTML `<canvas>` ein</td>
    </tr>
    <tr>
      <td>`strokeText()`</td>
      <td>Fügt Text (nur Konturen) ein</td>
    </tr>
  </tbody>
</table>

### Bild

<table>
  <thead>
    <tr>
      <th>Methode</th>
      <th>Beschreibung</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>`drawImage()`</td>
      <td>Hinterlegt ein Bild oder Video innerhalb eines HTML-`<canvas>`-Elements</td>
    </tr>
  </tbody>
</table>

### Zeichnung

<table>
  <thead>
    <tr>
      <th>Methode</th>
      <th>Beschreibung</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>`fillRect()`</td>
      <td>Zeichnet ein ausgefülltes Rechteck</td>
    </tr>
    <tr>
      <td>`strokeRect()`</td>
      <td>Zeichnet ein leeres Rechteck</td>
    </tr>
    <tr>
      <td>`clearRect()`</td>
      <td>Bereinigt bestimmte Pixel innerhalb eines Rechtecks</td>
    </tr>
  </tbody>
</table>

### Pfade

<table>
  <thead>
    <tr>
      <th>Methode</th>
      <th>Beschreibung</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>`beginPath()`</td>
      <td>Beginnt einen neuen Pfad</td>
    </tr>
    <tr>
      <td>`lineTo()`</td>
      <td>Zieht eine Linie zu dem Pfad</td>
    </tr>
    <tr>
      <td>`moveTo()`</td>
      <td>Bewegt den Pfad zu einem Punkt innerhalb der Leinwand</td>
    </tr>
  </tbody>
</table>

### Gestaltung

<table>
  <thead>
    <tr>
      <th>Methode</th>
      <th>Beschreibung</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>`addColorStop()`</td>
      <td>Legt die Farben und Positionen für einen Verlauf fest</td>
    </tr>
    <tr>
      <td>`createLinearGradient()`</td>
      <td>Erstellt einen geraden Verlauf</td>
    </tr>
    <tr>
      <td>`createPattern()`</td>
      <td>Wiederholt ein Element</td>
    </tr>
    <tr>
      <td>`shadowBlur`</td>
      <td>Legt die Unschärfe für einen Schatten fest</td>
    </tr>
    <tr>
      <td>`shadowColor`</td>
      <td>Bestimmt die Farbe eines Schattens</td>
    </tr>
  </tbody>
</table>

### Weitere Funktionen

<table>
  <thead>
    <tr>
      <th>Methode</th>
      <th>Beschreibung</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>`restore()`</td>
      <td>Stellt einen vorherigen Stand wieder her</td>
    </tr>
    <tr>
      <td>`save()`</td>
      <td>Speichert den aktuellen Stand und all seine Attribute</td>
    </tr>
  </tbody>
</table>

## HTML-`<canvas>`-Beispiel mit Text und Farbverlauf

Ein paar dieser Methoden nutzen wir nun für unser abschließendes Beispiel. Hierfür erschaffen wir via HTML-`<canvas>`-Tag zunächst einen Rahmen mit den Maßen **500 x 250 Pixel**. Dann erstellen wir ein **2D-Kontext-Objekt**. Abschließend fügen wir dort eine Headline ein und einen weiteren Satz, der einen Farbverlauf erhält. Der passende Code dafür sieht aus wie folgt:

```html

<html>
<body>
<h1>Beispiel für HTML Canvas mit Text und einem Farbverlauf</h1>
<h2>Wir nutzen die Methoden strokeText() und gradient</h2>
<canvas id="BeispielCanvas" width="500" height="250" style="border:1px solid grey"></canvas>
<script>
const c = document.getElementById("BeispielCanvas");
const ctx = c.getContext("2d");
ctx.font = "40px Calibri";
ctx.strokeText("Hier steht eine Headline", 20, 50);
ctx.font = "30px Calibri";
var gradient = ctx.createLinearGradient(0, 0, c.width, 0);
gradient.addColorStop("0", "teal");
gradient.addColorStop("0.5", "blue");
gradient.addColorStop("1.0", "green");
ctx.strokeStyle = gradient;
ctx.strokeText("Hier steht ein weiterer Satz", 20, 90);
</script>
<div class="hash d-none" hidden>hash_1ae923d355303e50c5821f2fcbd3f5b8689c7802</div><script data-shy-copy-guard>(function(){var C=[0x00AD,0x200B,0x200C,0x200D,0x2060,0xFEFF];var s=function(t){for(var i=0;i<C.length;i++){t=t.split(String.fromCharCode(C[i])).join("");}return t;};document.addEventListener("copy",function(e){var sel=document.getSelection();if(!sel||sel.isCollapsed||!e.clipboardData){return;}e.clipboardData.setData("text/plain",s(sel.toString()));try{var d=document.createElement("div");d.appendChild(sel.getRangeAt(0).cloneContents());e.clipboardData.setData("text/html",s(d.innerHTML));}catch(x){}e.preventDefault();});})();</script></body>
</html>
```


This is a markdown version of: [https://www.ionos.de/digitalguide/websites/web-entwicklung/html-canvas/](https://www.ionos.de/digitalguide/websites/web-entwicklung/html-canvas/) for AI/LLM consumption.