Internet Info, s.r.o. Lupa Měšec Podnikatel Root Zdroják DigiZone Slunečnice Vitalia TopDrive KupDnes Navrcholu NovýTarif Dobrý web Weblogy Woko Jagg Computer.cz SK: MojeLinky

Hlavní navigace

Začínáme s HTML5 canvasem

Canvas je pravděpodobně jednou z nejrevolučnějších značek HTML5. V dnešním článku si tuto značku představíme a naučíme se její základní použití. Ukážeme, jak pomocí ní kreslit základní geometrické útvary přímo do webové stránky.

Tweetni to Twitter Jaggni to! Jagg Del.icio.us Delicious

Tento článek je překladem anglického originálu vydaného na Dev.Opera. Autorem původního textu je Mihai Sucan.

Úvod

Specifikace HTML5 obsahuje řadu nových vlastností, jednou z nich je značka canvas . HTML 5  canvas vám nabízí snadnou možnost kreslení grafiky pomocí JavaScriptu. V každé značce canvas můžete použít „context“, jehož javascriptové metody nakreslí cokoliv chcete. Prohlížeče mohou implementovat více contextů s rozličnými API.

Většina prohlížečů implementovala 2D context canvasu – Opera, Firefox, Chrome a Safari (IE canvas nepodporuje, ale většina API canvasu je v něm snadno emulovatelná pomocí VML – pozn. překl.). Existuje také experimentální build Opery s implementací 3D contextu a rozšíření, které přidá podporu 3D contextu do Firefoxu:

Tento článek vás provede základy 2D contextu canvasu, používáním základních funkcí včetně čar, tvarů, obrázků, textu a dalších. Budeme předpokládat, že znáte základy JavaScriptu.

Můžete si také stáhnout zdrojový kód příkladů z článku.

Základy používání canvasu

Použití canvasu na vaší stránce je velmi jednoduché, stačí přidat značku <canvas> do vašeho HTML, např.:

<canvas id="myCanvas" width="300" height="150">
  Fallback content (náhradní obsah) pro prohlížeče, které canvas nepodporují.
</canvas> 

Definovali jsme id elementu, abychom se na něj mohli snadno odkazovat z JavaScriptu a také jsme definovali jeho šířku a výšku. Tím jsme si vytvořili kreslící plochu. Pojďte si něco nakreslit.

Pro kreslení do canvasu budeme potřebovat JavaScript. Nejprve vytvoříme referenci na náš canvas pomocí getElementById a následně inicializujeme požadovaný context. Pak už můžeme začít kreslit do canvasu pomocí rozhraní contextu, který jsme inicializovali. Následující skript (živá ukázka) do našeho canvasu nakreslí jednoduchý obdélník:

// Odkaz na canvas
var elem = document.getElementById('myCanvas');

// Vždy kontrolujte dostupnost vlastností a metod, to aby skript skript
// v nějakém prohlížeči "nehavaroval".
if (elem && elem.getContext) {
  // získáme 2d context.
  // Zapamatujte si: pro jednu značku canvas můžete inicializovat jen 1 context.
  var context = elem.getContext('2d');
  if (context) {
    // Nyní nakreslíme obdélník.
    // Zadáme souřadnice x,y následované šířkou a výškou.
    context.fillRect(0, 0, 150, 100);
  }
} 

Skript můžete vložit ho hlavičky vašeho dokumentu nebo do externího souboru, to je na vás.

API 2D contextu

Nyní, když jsme si vytvořili náš první příklad, se můžeme podívat na API 2D contextu hlouběji, ať vidíme, co máme k dispozici.

Kreslení čar

Pokud jste si prostudovali příklad výše, je pro vás jednoduché nakreslit obdélník jakékoliv barvy.

Pomocí vlastností fillStyle a strokeStyle snadno nastavíte, jaká barva bude použita pro vyplnění a jaká pro obrys. Můžete používat stejné hodnoty barev jako v kaskádových stylech: šestnáctkové kódy, rgb(), rgba() and dokonce hsla() pokud to prohlížeč podporuje (např. Opera 10 a Firefox 3).

Metoda fillRect nakreslí vyplněný obdélník, metoda strokeRect nakreslí obdélník bez výplně obsahující pouze obrysy. Pokud chcete vyčistit část canvasy, můžete použít metodu clearRect. Všechny tyto tři metody používají stejné argumenty: x, y, width, height. První dva argumenty jsou souřadnice x, y, další dva argumenty jsou šířka a výška obdélníku.

Tloušťku pak nastavíme vlastností lineWidth. Podívejme se na příklad používající metody fillRect, strokeRectclearRect :

context.fillStyle   = '#00f'; // modrá
context.strokeStyle = '#f00'; // červená
context.lineWidth   = 4;

// Nakreslíme obdélníky.
context.fillRect  (0,   0, 150, 50);
context.strokeRect(0,  60, 150, 50);
context.clearRect (30, 25,  90, 60);
context.strokeRect(30, 25,  90, 60); 

Výstup tohoto příkladu najdete na obrázku 1.

Ukázka použití fillRect, strokeRect a clearRect.

Obr. 1: Ukázka použití fillRect, strokeRect a clearRect.

Cesty (paths)

Cesty vám umožní kreslit libovolné tvary. Napřed vyznačíte obrys, ten pak můžete vyplnit a nakreslit obrysovou čáru, pokud chcete. Vytvoření tvaru je jednoduché – na začátku zavoláte beginPath(), následně nakreslíte cestu pomocí čar a dalších metod. Jakmile jste hotovi, zavoláte fill a stroke  – pokud chcete tvar vyplnit nebo vykreslit obrysovou čáru. Na konci zavoláte metodu  closePath().

Následuje příklad – tento kód nakreslí trojúhelník:

// Nastavení stylu
context.fillStyle   = '#00f';
context.strokeStyle = '#f00';
context.lineWidth   = 4;

context.beginPath();
// Začíná se v levém horním rohu
context.moveTo(10, 10); // souřadnice (x,y)
context.lineTo(100, 10);
context.lineTo(10, 100);
context.lineTo(10, 10);

// Hotovo. Nyní tvar vyplníme a nakreslíme obrys.
// Pozn.: vyznačený tvar nebude viditelný, dokud nezavoláte jednu z těchto dvou metod.
context.fill();
context.stroke();
context.closePath(); 

Výsledek bude stejný jako na obrázku 2.

Triangle

Obr. 2: Trojúhelník.

Připravil jsem pro vás i komplikovanější cesty kombinující čáry, křivky a oblouky – jen se podívejte.

Vkládání obrázků

Metoda drawImage vám dovolí vložit do vašeho canvasu obrázek (ze značek img nebo canvas). V Opeře můžete do canvasu nakreslit i SVG obrázky. (Metoda drawImage je jednou z metod, kterou není možné emulovat v Internet Exploreru – pozn. překl.) Jedná se o komplikovanou metodu, která používá tři, pět nebo devět argumentů:

  • Tři argumenty: základní použití drawImage obsahuje argument odkazující na vkládaný obrázek a dvě souřadnice obsahující místo vložení do vašeho contextu v canvasu.
  • Pět argumentů: o něco komplikovanější varianta drawImage obsahuje předchozí tři argumenty a navíc šířku a výšku vkládaného obrázku (pro případ, že chcete změnit jeho velikost).
  • Devět argumentů: nejkomplikovanější použití drawImage obsahuje předchozích pět argumentů a navíc dvě souřadnice uvnitř vkládaného obrázku a také šířku a výšku. Tuto variantu použijete, pokud chcete obrázek dynamicky oříznout před jeho vložením do canvasu.

Následující kód ukazuje všechny tři způsoby použití  drawImage :

// Tři argumenty: element, cílové souřadnice (x,y).
context.drawImage(img_elem, dx, dy);

// Pět argumentů: element, cílové souřadnice (x,y)
// a cílová šířka s výškou.
context.drawImage(img_elem, dx, dy, dw, dh);

// Devět argumentů: element, zdrojové souřadnice (x,y), šířka a výška pro oříznutí,
// cílové souřadnice a cílová šířka s výškou (pro změnu velikosti).
context.drawImage(img_elem, sx, sy, sw, sh, dx, dy, dw, dh); 

Výsledek bude vypadat jako na obrázku 3.

Ukázka kreslení metodou drawImage.

Obr. 3: Příklad použití drawImage .

Pokračování příště

To není všechno. Příště vás seznámíme s dalšími možnostmi canvasu, jakou je práce s pixely, textem a používání gradientů.

Tento článek je překladem textu HTML 5 canvas – the basics, jehož autorem je Mihai Sucan a je zde zveřejněn s laskavým svolením Opera Software.

Anketa

Použili jeste někdy canvas?

       

Martin Hassman

Martin Hassman

Martin Hassman vymyslel a založil projekt Zdroják. Absolvoval Vysokou školu chemicko-technologickou v Praze. Pracoval jako webový vývojář a specialista na technologie Mozilla.org.

Školení Google+ pro firmy

DW - Školení PPC
  • Jak využít Google+ pro firemní komunikaci a marketing.
  • Čím se liší Google+ od Twitteru a Facebooku z pohledu firemního využití.
  • Jak využít Google+ v souladu s pravidly užívání.
  • Založení Google+ Page (Stránky) krok po kroku, včetně praktických tipů.

Detailní informace o školení Google+ »

Přehled názorů

super
MD 10. 4. 2009 09:21
Nový
Praktické využitie?
Ján Januška 10. 4. 2009 11:54
Nový
├ 
Re: Praktické využitie?
Martin Hassman 10. 4. 2009 13:06
Nový
│
└ 
Re: Praktické využitie?
Ján Januška 10. 4. 2009 14:04
Nový
│
 
├ 
Re: Praktické využitie?
MD 10. 4. 2009 14:15
Nový
│
 
│
├ 
Re: Praktické využitie?
Ján Januška 10. 4. 2009 14:26
Nový
│
 
│
└ 
Re: Praktické využitie?
xurpha 10. 4. 2009 22:12
Nový
│
 
│
 
└ 
Re: Praktické využitie?
Martin Hassman 10. 4. 2009 22:28
Nový
│
 
├ 
Re: Praktické využitie?
Martin Hassman 10. 4. 2009 14:35
Nový
│
 
│
└ 
Re: Praktické využitie?
Karel Fučík 10. 4. 2009 17:15
Nový
│
 
│
 
└ 
Re: Praktické využitie?
Martin Hassman 10. 4. 2009 18:15
Nový
│
 
│
 
 
└ 
Re: Praktické využitie?
Karel Fučík 10. 4. 2009 18:42
Nový
│
 
│
 
 
 
└ 
Re: Praktické využitie?
Martin Hassman 10. 4. 2009 20:48
Nový
│
 
│
 
 
 
 
└ 
Re: Praktické využitie?
Karel Fučík 10. 4. 2009 22:38
Nový
│
 
│
 
 
 
 
 
├ 
Re: Praktické využitie?
Karel Fučík 10. 4. 2009 22:41
Nový
│
 
│
 
 
 
 
 
└ 
Re: Praktické využitie?
Martin Hassman 10. 4. 2009 23:07
Nový
│
 
│
 
 
 
 
 
 
└ 
Re: Praktické využitie?
Karel Fučík 12. 4. 2009 09:20
Nový
│
 
└ 
Re: Praktické využitie?
anonymní uživatel 14. 4. 2009 14:10
Nový
│
 
 
└ 
Re: Praktické využitie?
Martin Hassman 14. 4. 2009 14:17
Nový
│
 
 
 
└ 
Re: Praktické využitie?
anonymní uživatel 14. 4. 2009 15:00
Nový
│
 
 
 
 
└ 
Re: Praktické využitie?
Martin Hassman 14. 4. 2009 15:08
Nový
└ 
Re: Praktické využitie?
MD 10. 4. 2009 13:09
Nový
 
├ 
Re: Praktické využitie?
mofo 10. 4. 2009 13:18
Nový
 
│
└ 
Re: Praktické využitie?
MD 10. 4. 2009 13:59
Nový
 
└ 
Re: Praktické využitie?
Petr Šnobl 10. 4. 2009 13:26
Nový
 
 
└ 
Re: Praktické využitie?
anonymní uživatel 10. 4. 2009 14:47
Nový
 
 
 
└ 
Re: Praktické využitie?
Petr Šnobl 10. 4. 2009 15:45
Nový
 
 
 
 
└ 
Re: Praktické využitie?
Martin Hassman 10. 4. 2009 18:18
Nový
 
 
 
 
 
└ 
Re: Praktické využitie?Re: Praktické využitie?
Petr Šnobl 11. 4. 2009 00:13
Nový
 
 
 
 
 
 
└ 
Re: Praktické využitie?Re: Praktické využitie?
Martin Hassman 11. 4. 2009 07:25
Nový
nebylo by jednodušší použít SVG?
xurpha 10. 4. 2009 22:10
Nový
├ 
Re: nebylo by jednodušší použít SVG?
Martin Hassman 10. 4. 2009 22:27
Nový
│
└ 
Re: nebylo by jednodušší použít SVG?
xurpha 11. 4. 2009 12:32
Nový
│
 
└ 
Re: nebylo by jednodušší použít SVG?
Martin Hassman 11. 4. 2009 13:28
Nový
│
 
 
└ 
Re: nebylo by jednodušší použít SVG?
xurpha 11. 4. 2009 21:58
Nový
│
 
 
 
└ 
Re: nebylo by jednodušší použít SVG?
Martin Hassman 12. 4. 2009 07:19
Nový
├ 
Re: nebylo by jednodušší použít SVG?
Makovec 12. 4. 2009 09:38
Nový
└ 
Re: nebylo by jednodušší použít SVG?
anonymní uživatel 12. 4. 2009 20:39
Nový
kreslení grafů v gnuplotu: HTML canvas terminál
anonymní uživatel 13. 4. 2009 22:07
Nový
└ 
Re: kreslení grafů v gnuplotu: HTML canvas terminál
Martin Hassman 13. 4. 2009 22:27
Nový
 
└ 
Re: kreslení grafů v gnuplotu: HTML canvas terminál
anonymní uživatel 14. 4. 2009 14:27
Nový
 
 
└ 
Re: kreslení grafů v gnuplotu: HTML canvas terminál
Martin Hassman 14. 4. 2009 14:43
Nový
       

Tento text je již více než dva měsíce starý. Chcete-li na něj reagovat v diskusi, pravděpodobně vám již nikdo neodpoví. Pro řešení aktuálních problémů doporučujeme využít naše diskusní fórum.

Zasílat nově přidané příspěvky e-mailem