04/04/2023
- HTML5 Canvas: Grafisk Magi for Mobilen
- Opsætning af Canvas til Mobile Enheder
- Responsivt Canvas: Tilpasning til Orientering
- Canvas Konteksten: Dit Tegneværktøj
- Genoptegning efter Orientationsændring
- Håndtering af Billeder på Canvas
- Upload af Billeder til Canvas
- Download Canvas Indhold som Billede
- Tegning på Canvas: Tekst og Figurer
- Grundlæggende Figurer
- Canvas Stier: Linjer, Cirkler og Kurver
- Canvas Transformationer
- Kompatibilitet og Fallback
- Konklusion
HTML5 Canvas: Grafisk Magi for Mobilen
HTML5 har introduceret en række spændende nye elementer, der har revolutioneret webudviklingen, især når det kommer til mobile enheder. Blandt disse skiller canvas-elementet sig ud som en sand game-changer. Canvas giver webudviklere mulighed for at skabe dynamisk, script-drevet grafik direkte i browseren, uden behov for plugins som Flash eller Silverlight. Dette åbner op for en verden af muligheder, lige fra interaktive spil og animationer til avancerede datavisualiseringer og billedredigeringsværktøjer – alt sammen tilgængeligt på tværs af mobile platforme.

I denne omfattende guide vil vi udforske, hvordan du kan udnytte kraften i HTML5 canvas til at skabe engagerende grafiske oplevelser på mobile enheder. Vi starter med det grundlæggende – opsætning af et canvas, der tilpasser sig forskellige skærmstørrelser og orienteringer – og bevæger os derefter videre til at håndtere billeder, tegne tekst, forme kurver og anvende forskellige transformationer. Gør dig klar til at slippe din kreativitet løs!
Opsætning af Canvas til Mobile Enheder
Selve canvas-elementet er simpelt at implementere. Du placerer det blot i din HTML-kode med de ønskede bredde- og højdeattributter:
<canvas id="mycanvas" width="250" height="250"></canvas>Dette skaber et canvas med en fast størrelse. Men for mobile applikationer ønsker vi ofte, at canvaset skal fylde en bestemt del af enhedens skærm. At forsøge at sætte bredde og højde til procenter som width="100%" og height="100%" virker desværre ikke direkte. Løsningen ligger i at udnytte JavaScript til at hente enhedens aktuelle skærmdimensioner via window.innerWidth og window.innerHeight.
Her er et eksempel på, hvordan du dynamisk kan sætte canvasets dimensioner:
var canvas = document.getElementById('mycanvas'); canvas.width = window.innerWidth; canvas.height = window.innerHeight; For at sikre, at canvaset fylder hele browserens synsfelt og fjerner eventuelle scrollbars, kan du supplere med lidt CSS. For at gøre det lettere at se canvasets grænser i eksemplerne, tilføjer vi også en stribet kant.
Responsivt Canvas: Tilpasning til Orientering
En af de mest kritiske aspekter ved mobiludvikling er at håndtere ændringer i enhedens orientering (portræt til landskab og omvendt). Et responsivt canvas skal automatisk tilpasse sig disse ændringer. Dette opnås ved at tilføje event listeners til 'resize' og 'orientationchange' begivenhederne. Når en af disse begivenheder udløses, genberegnes og sættes canvasets dimensioner til de nye vinduesdimensioner.
Her er koden, der sikrer et responsivt canvas:
var canvas; var ctx; function init() { canvas = document.getElementById('canvas'); if (canvas.getContext) { ctx = canvas.getContext("2d"); window.addEventListener('resize', resizeCanvas, false); window.addEventListener('orientationchange', resizeCanvas, false); resizeCanvas(); // Initial resize } } function resizeCanvas() { canvas.width = window.innerWidth; canvas.height = window.innerHeight; // Her kan du gentegne indholdet, hvis nødvendigt } init(); Det er vigtigt at bemærke, at mens orientationchange er mest relevant for mobile browsere, vil resize-eventet håndtere ændringer på desktop. Ved at inkludere begge sikrer vi bred kompatibilitet.
Canvas Konteksten: Dit Tegneværktøj
For at kunne manipulere og tegne på canvaset skal vi først have fat i dets 2D-kontekst. Dette gøres via getContext('2d')-metoden. Konteksten giver adgang til en række tegne-API'er, som vi vil udforske nærmere.
var canvas = document.getElementById('mycanvas'); var ctx = canvas.getContext('2d'); Genoptegning efter Orientationsændring
En vigtig bivirkning ved at ændre canvasets dimensioner er, at alt indhold slettes. Hvis du vil bevare det, der allerede er tegnet, skal du gemme det, før du ændrer størrelsen, og derefter tegne det igen. En effektiv metode er at bruge getImageData() til at kopiere det eksisterende indhold og derefter putImageData() til at indsætte det på det resizede canvas.
Kodeeksempel for at bevare indhold:
// Kopier canvas som billeddata var imgData = ctx.getImageData(0, 0, canvas.width, canvas.height); // Ændr størrelsen på originalt canvas canvas.width = window.innerWidth; canvas.height = window.innerHeight; // Indsæt billeddata på det resizede canvas ctx.putImageData(imgData, 0, 0); Hvis du ønsker at skalere indholdet, så det passer til den nye størrelse, kan du kopiere canvasets indhold til et midlertidigt canvas og derefter tegne det tilbage med de nye dimensioner. Dette giver dig mulighed for at skalere billedet efter behov.
Håndtering af Billeder på Canvas
Canvas gør det nemt at indlæse og manipulere billeder. Du kan tegne et billede direkte på canvaset ved hjælp af drawImage()-metoden, som tager billedet og dets x,y-koordinater som argumenter. Du kan også skalere billedet ved at angive bredde og højde.
Indlæsning af et billede fra DOM:
<img id="image-lenna" src="lenna.png" style="display:none" /> <canvas id="image-canvas"></canvas> var canvas = document.getElementById('image-canvas'); var ctx = canvas.getContext('2d'); var img = document.getElementById('image-lenna'); img.onload = function() { var x = canvas.width / 2 - img.width / 2; var y = canvas.height / 2 - img.height / 2; ctx.drawImage(img, x, y); } Du kan også indlæse billeder direkte fra en URL ved at oprette et nyt Image-objekt og sætte dets src-attribut:
var img = new Image(); img.src = 'http://example.com/example.jpg'; img.onload = function() { ctx.drawImage(img, x, y); } Upload af Billeder til Canvas
Med HTML5 File API kan brugere uploade billeder direkte fra deres enhed. Dette åbner en dialog, hvor brugeren kan vælge et billede eller endda tage et nyt med kameraet. Billedet kan derefter læses som en data-URL og tegnes på canvaset.
<canvas id="imgdisplay" width="500" height="500" style="border:1px solid grey"></canvas> <input type="file" id="imageLoader" name="imageLoader" /> var imageLoader = document.getElementById('imageLoader'); imageLoader.addEventListener('change', loadImage, false); function loadImage(e) { var reader = new FileReader(); reader.onload = function(event) { var img = new Image(); img.onload = function() { ctx.drawImage(img, 0, 0); } img.src = event.target.result; } reader.readAsDataURL(e.target.files[0]); } Bemærk: På nogle Android-enheder kan der opstå problemer med websiden, der genindlæses, hvis hukommelsen er lav, når en fil vælges.
Download Canvas Indhold som Billede
Du kan nemt gemme indholdet af dit canvas som en billedfil ved hjælp af toDataURL()-metoden. Denne metode returnerer en data-URL, som kan bruges i et <a>-element med download-attributten for at muliggøre download.
<a href="" download="canvas-image.png" id="canvas-download">Download som billede</a> var download = document.getElementById('canvas-download'); download.addEventListener('click', function() { var data = canvas.toDataURL(); download.href = data; }, false); Vær opmærksom på potentielle sikkerhedsrestriktioner ved brug af billeder fra forskellige domæner.

Tegning på Canvas: Tekst og Figurer
Med 2D-konteksten kan du tegne tekst og figurer. Til tekst har du fillText() til udfyldt tekst og strokeText() til tekstkonturer.
ctx.fillText("Hello, World!", 20, 20); ctx.strokeText("Hello, World!", 20, 20); Du kan style din tekst og dine figurer ved at ændre egenskaber som fillStyle, strokeStyle, lineWidth og font.
Grundlæggende Figurer
Canvas understøtter tegning af rektangler med strokeRect() (kontur) og fillRect() (udfyldt).
ctx.strokeRect(10, 10, 100, 100); // Tegner en rektangelkontur ctx.fillRect(20, 20, 200, 80); // Tegner en udfyldt rektangel For at rydde canvaset kan du bruge clearRect().
Canvas Stier: Linjer, Cirkler og Kurver
For at tegne mere komplekse former skal du oprette stier. Dette gøres ved at starte en sti med beginPath(), flytte til startpunktet med moveTo(), tegne linjer med lineTo(), og afslutte med stroke() (kontur) eller fill() (udfyldt).
Cirkler tegnes med arc(), som tager position, radius og start-/slutvinkler som argumenter.
ctx.beginPath(); ctx.arc(canvas.width / 2, canvas.height / 2, 20, 0, Math.PI * 2); ctx.stroke(); Canvas understøtter også kvadratiske og Bezier-kurver med henholdsvis quadraticCurveTo() og bezierCurveTo(), som giver dig præcis kontrol over formen.
Canvas Transformationer
Du kan nemt transformere dit canvasindhold ved hjælp af funktioner som translate() (forskydning), rotate() (rotation) og scale() (skalering). Disse transformationer påvirker alt, der tegnes efterfølgende.
Det er ofte nødvendigt at kombinere transformationer, f.eks. at rotere omkring et objekts centrum ved først at flytte (translate) til objektets midtpunkt, rotere og derefter flytte tilbage.
// Translation ctx.translate(100, 100); // Rotation (vinkel i radianer) ctx.rotate(Math.PI / 4); // 45 grader // Skalering ctx.scale(2, 2); // Dobbel størrelse Der findes også en mere generel transform()-funktion, der giver dig mulighed for at anvende brugerdefinerede matrix-transformationer for endnu større fleksibilitet.
Kompatibilitet og Fallback
Selvom canvas-understøttelsen er bred i moderne mobile browsere, er det altid en god idé at inkludere fallback-indhold. Dette kan gøres ved at placere alternativer indhold (f.eks. et billede eller en tekstbesked) inde i <canvas>-tagget. Skærmlæsere kan derefter få adgang til dette fallback-indhold, da canvasets indhold i sig selv ikke er tilgængeligt.
<canvas id="mycanvas"> Dit indhold her. Din browser understøtter ikke canvas. </canvas> Konklusion
HTML5 canvas-elementet er et utroligt kraftfuldt værktøj for enhver webudvikler, der ønsker at skabe rige og dynamiske grafiske oplevelser på mobile enheder. Fra grundlæggende tegneoperationer til komplekse transformationer giver canvas dig fuld kontrol over pixelmanipulation. Med bred browserunderstøttelse og et væld af anvendelsesmuligheder er canvas en essentiel del af den moderne webudviklers værktøjskasse. Udforsk, eksperimenter, og bring dine grafiske ideer til live!
Ofte Stillede Spørgsmål (FAQ)
- Hvad er forskellen på Canvas og SVG? Canvas tegner pixelbaseret grafik, mens SVG bruger vektorbaserede former, der skalerer perfekt uden kvalitetstab. SVG er ofte bedre til interaktive elementer og grafik, der skal skaleres meget.
- Hvordan gør jeg canvas-indhold tilgængeligt? Brug fallback-indhold inden i canvas-tagget eller ARIA-attributter (som
role="img"ogaria-label) for at give skærmlæsere information om canvasets indhold. Undgå at bruge canvas til ren tekst, da det ikke kan tilpasses af brugeren. - Kan jeg bruge canvas til spil? Ja, canvas er ideelt til at udvikle 2D-spil på nettet takket være dets evne til at håndtere hurtige tegneoperationer og brugerinput.
- Hvordan håndterer jeg touch-input på canvas? Du kan lytte til touch-events (
touchstart,touchmove,touchend) og konvertere touch-koordinater til canvas-koordinater, ligesom du ville gøre med muse-events. Husk at forhindre standard browser-gestus (som scrolling), når brugeren interagerer med canvaset.
Tabel: Sammenligning af Canvas og SVG
| Egenskab | HTML5 Canvas | SVG |
|---|---|---|
| Rendering | Pixelbaseret (bitmap) | Vektorbaseret |
| Skalering | Kan miste kvalitet ved opskalering | Skalerer uden kvalitetstab |
| Performance | Ofte hurtigere til mange objekter/pixels | Kan være langsommere med mange DOM-elementer |
| Interaktivitet | Kræver JavaScript for at håndtere events på individuelle elementer | Events kan knyttes direkte til DOM-elementer |
| Tilgængelighed | Kræver fallback-indhold eller ARIA for semantik | Indbygget DOM-struktur giver bedre tilgængelighed |
| Anvendelsesområder | Spil, billedredigering, animationer, datavisualiseringer | Diagrammer, ikoner, brugerdefinerede UI-elementer, illustrationer |
Hvis du vil læse andre artikler, der ligner HTML5 Canvas: Grafisk Magi for Mobilen, kan du besøge kategorien Teknologi.
