Lerret fra scratch Introduksjon av lærred

Dette er den første artikkelen i en serie som gir deg raskere med HTML5-lerretet, den plugin-less tegningsfunksjonaliteten som er innebygd i moderne nettlesere. I denne innledende artikkelen vil jeg vise deg hvordan du får tilgang til lerretelementet, tegne figurer, endre farger og slette ting. Det er en whistle-stop tur på grunnleggende om denne fantastiske nye webteknologien.


Foretrekker en videoopplæring?


Endre oppløsningen til 720 for et klarere bilde.
Abonner på vår YouTube-side for å se alle videoopplæringene!

Serien blir en spennende tur, og en som jeg håper du nyter. Jeg antar at du allerede er komfortabel med JavaScript, men har liten eller ingen erfaring med lerret. Selv om du er ny til JavaScript, ikke vær redd, siden du fortsatt lærer noe fra disse artiklene.


Vi presenterer lærredelementet

Det er enkelt å bruke lerretet.

Når du tenker på lerret, tenker du nok på den nye HTML5 lerret element. Teknisk er dette bare halvparten av historien, men la oss glemme det for nå. De lerret elementet er det offentlige ansiktet til denne fancy nye funksjonen til nettleseren.

Bruker lerret elementet er dødt lett; Det er en enkel HTML-kode, med en definert bredde og høyde.

   

Dette gjør ikke mye enda. Faktisk, alt det gjør er å sette inn et gjennomsiktig lerret på siden din. Innholdet inne i lerret elementet er reserveinnhold, som bare vises hvis en nettleser ikke støtter lerret.

Nettleserstøtte

Nettleserstøtte for lerret er ganske utrolig.

Det er viktig å påpeke at nettleserens støtte for lerret er ganske utrolig. Hver moderne nettleser støtter den, inkludert den nyeste Internet Explorer.

  • Internet Explorer (9.0+)
  • Safari (3.0+)
  • Firefox (3.0+),
  • Chrome (3.0+)
  • Opera (10,0 +)
  • iOS (1.0+)
  • Android (1.0+)

Interessant, kan du bruke noen lerretfunksjonalitet i Internet Explorer versjon 8 og under, via ExplorerCanvas-plugin.

Lerrets dimensjoner

En viktig leksjon som jeg lærte med lerret er at du må eksplisitt sette bredde og høyde attributter av lerret element når du definerer dimensjonene. Ved å bruke CSS til å angi bredde og høyde, vil det effektivt føre til at lerretet skaleres opp (eller ned) til den størrelsen. Det er en logisk grunn bak dette; det er å gjøre med lerret elementet er en beholder for noe som kalles 2d-renderingskonteksten. Det er imidlertid bare viktig å vite at bruk av CSS for å angi dimensjonene på lerretet vil ha en merkelig effekt.


Oppdage 2d-renderingskonteksten

Jeg nevnte i den siste delen at lerret element er bare en halvdel av historien. Den andre halvdelen er 2d-renderingskonteksten; Den delen av lerret som lar deg gjøre de kule ting du faktisk kan se.

La meg gjøre en ting helt klart: Når du bruker lerret, drar du ikke på lerret selve elementet. I stedet trekker du faktisk på 2d-renderingskonteksten, som du får tilgang til gjennom de lerret element via JavaScript API. Det spiller ingen rolle i den store ordningen av ting, men det er nyttig å vite.

Koordinatsystem

Hvis du har brukt noen 2d grafikkprogrammeringsspråk før (ActionScript, Processing, etc), vil du vite alt om skjermbaserte koordinatsystemer. 2d-renderingskonteksten i lerret er ikke annerledes; Den bruker et standard kartesisk koordinatsystem med opprinnelsespunktet (0, 0) øverst til venstre. Flytting til høyre øker verdien av x akse, mens du beveger deg nedover, øker verdien av y akser. Det er ganske greit.

En enhet i koordinatsystemet er lik en piksel på skjermen (i de fleste tilfeller).

Tilgang til 2d-renderingskontekst

For å faktisk bruke konteksten 2d-rendering, må du bruke JavaScript API. Den delen av API som du vil bruke, er getContext metode, slik som:

    Lerret fra grunnen av          

Merk: Du bruker jQuery her, men bare for å sjekke når DOM er klar. Bruk gjerne ditt favoritt JavaScript-bibliotek i stedet, eller legg koden nederst i dokumentet.

Som et resultat av å ringe getContext, de CTX variabel vil nå inneholde en referanse til 2d-renderingskonteksten. Dette betyr at du nå har alt på plass for å faktisk begynne å tegne på lerretet. Den morsomme delen!


Tegning rektangler

Nå som du har tilgang til 2d-renderingskonteksten, kan du begynne å ringe tegningsmetodene til APIen. En av de mest grunnleggende er fillRect, som trekker et rektangel som er fylt ut i en bestemt farge (svart som standard).

Legg til følgende kode under CTX variabel fra tidligere:

 ctx.fillRect (50, 50, 100, 100);

Dette vil tegne et svart firkant som er satt litt vekk fra venstre og toppkanter av lerretet, slik som:

Du har nettopp trukket din første form ved hjelp av HTML5 lerret. Føles bra, rett?

Merk: Du vil merke at du bruker rektangelmetoden til JavaScript API for å tegne firkanter. Dette er fordi det ikke finnes noen metoder i lerret for å tegne firkanter direkte, enkle fordi firkanter er rektangler (de har fire sider med rette vinkler mellom dem).

Det er fire argumenter i en samtale for å fylle ut:

  • Den første er x posisjon av opprinnelsespunktet (øverst til venstre).
  • Den andre er y posisjon av opprinnelsespunktet.
  • Den tredje er bredde.
  • Og den andre er den høyde.

Skrevet er pseudokode, fillRect ville se slik ut:

 ctx.fillRect (x, y, bredde, høyde);

Den kule tingen er at du ikke er begrenset til bare fylte rektangler. Nei. Du kan også tegne strokede rektangler; det vil si rektangler med et omriss rundt dem. Til det du kan bruke strokeRect Metoden for JavaScript API, slik som:

 ctx.strokeRect (50, 50, 100, 100);

Den bruker nøyaktig de samme argumentene som fillRect, og resultatet vil bli en nydelig oversikt over et kvadrat:

Enkel. Elegant. Lett. Det oppsummerer virkelig lerret. Alle metodene er enkle når man ser på hverandre, men når de brukes sammen, lar de deg tegne noen ganske fantastiske ting.


Tegnebaner

Bortsett fra rektangler (de eneste figurene som kan tegnes med en enkelt API-metode), har du baner. Stier lar deg tegne linjer, både rett buede, som kan kombineres for å skape ganske komplekse former.

Tegning av en enkel bane krever bruk av noen nye API-metoder:

  • beginPath starter en ny bane.
  • flytte til Flytter punktet som banen er trukket fra.
  • lineTo trekker en rett bane til dette punktet fra punktet definert i moveTo, eller punktet fra det siste anropet til lineTo.
  • closePath lukker banen ved å koble det siste punktet til startpunktet.
  • fylle fyller banen med en farge.
  • hjerneslag skisserer banen.

Prøv følgende kode:

 ctx.beginPath (); ctx.moveTo (50, 50); ctx.lineTo (50, 250); ctx.lineTo (250, 250); ctx.closePath (); ctx.fill ();

Som vil tegne en trekantbane, og fylle den:

Du kan bruke det samme konseptet til å tegne en hvilken som helst annen form du vil ha. Den andre artikkelen i denne serien vil dekke mer avanserte baner i lerret, som buer (for å lage sirkler) og Bezier-baner (for å lage kule kurvede linjer).

Det viktige å huske akkurat nå er at stiene er ganske mye den eneste måten å tegne noe mer komplisert på enn et rektangel.


Endre farge

Hittil har alt du har tegnet blitt fylt eller strøket i svart. Hvor spennende! Heldigvis finnes det et par egenskaper i JavaScript API som lar deg endre fargen på figurene du tegner. Disse egenskapene er fyllstil og strokeStyle.

De er begge ganske selvforklarende, så la oss hoppe inn og endre fyllefargen til et rektangel:

 ctx.fillStyle = "rgb (255, 0, 0)"; ctx.fillRect (50, 50, 100, 100);

Dette gir deg et fint rødt firkant, slik som:

Eller du kan endre stokefarge på et rektangel:

 ctx.strokeStyle = "rgb (255, 0, 0)"; ctx.strokeRect (50, 50, 100, 100);

Som vil gi deg et firkant med en rød oversikt:

Skjønnheten i fyllstil og strokeStyle er at de begge aksepterer normale CSS fargeværdier. Det betyr at du kan bruke RGB, RGBA, HSA, fargeord (f.eks. "Rødt") og heksadesimale verdier.

Det er verdt å peke på at endring av fargen i lerret ikke påvirker noe som allerede er tegnet. Hvis du for eksempel tegner et svart rektangel, endrer du fyllestilen til rød, og tegner et annet rektangel. Det første rektangelet vil fortsatt være svart.


Endring av linjebredde

Bortsett fra endring av farge, kan du også endre bredden på en strektegning. For å gjøre dette kan du bruke linje bredde Egenskapen til JavaScript API.

Ved å bruke koden fra forrige eksempel kan du endre bredden på oversikten:

 ctx.lineWidth = 20; ctx.strokeStyle = "rgb (255, 0, 0)"; ctx.strokeRect (50, 50, 100, 100);

Som vil gi deg et vakkert og tykt rødt slag:

Det samme konseptet fungerer også for stier. For eksempel kan du endre trekanten fra tidligere for å ha en tykkere oversikt:

 ctx.lineWidth = 20; ctx.beginPath (); ctx.moveTo (50, 50); ctx.lineTo (50, 250); ctx.lineTo (250, 250); ctx.closePath (); ctx.stroke ();

Som vil gi deg en utrolig spennende trekant:

Det er også noen andre funksjoner i JavaScript API som lar deg endre måten linjer trekkes på. For eksempel, lineCap endrer måten slutten av en linje ser ut, og lineJoin endrer måten hjørnene i en linje ser ut. Du bør definitivt sjekke ut disse funksjonene (og mer) i lerretspesifikasjonen.


Slette lerretet

Det siste jeg vil lære deg, er hvordan du kan slette lerretet. Du har lært hvordan du tegner figurer, men ikke hvordan du faktisk skal kvitte seg med dem, noe som kan være pent darn nyttig.

Heldigvis er det enkelt å slette lerretet. du trenger bare en metode fra JavaScript API. Den metoden er clearRect, og jobben er å gjøre hver piksel i rektangelet gjennomsiktig.

I denne artikkelen er lerretet 500 piksler bredt og 500 piksler høyt, slik at du enkelt kan slette hele lerretet ved å ringe clearRect som så:

 ctx.fillRect (50, 50, 100, 100); ctx.clearRect (0, 0, 500, 500);

Det er ingen bruk som viser deg et skjermbilde av dette, fordi hvis det virket, burde du se absolutt ingenting. Det fylte rektangelet blir faktisk trukket, men det blir umiddelbart fjernet, så du får ikke se det.

Merk: Argumentene i clearRect er det samme som fillRect; x, y, bredde og høyde.

Hvis du ikke er sikker på bredden og høyden på lerretet, kan du også slette det slik:

 ctx.clearRect (0, 0, canvas.width, canvas.height);

Dette bruker bredde og høyde egenskaper av lerret elementet selv, noe som er utrolig nyttig og en mye bedre måte å gjøre ting på.

Slette en liten del av lerretet

Du trenger ikke å slette hele lerretet hvis du ikke vil. Du kan ganske enkelt slette bare en liten del i stedet. For eksempel, tenk at du hadde et svart firkant tegnet ved siden av et rødt firkant:

 ctx.fillRect (50, 50, 100, 100); ctx.fillStyle = "rgb (255, 0, 0)"; ctx.fillRect (200, 50, 100, 100);

Som ville normalt se slik ut:

Du kan slette det svarte torget og la det røde torget være intakt ved å legge til et anrop til clearRect under:

 ctx.clearRect (50, 50, 100, 100);

Legg merke til hvordan denne ringen til clearRect definerer en posisjon og størrelse som er den samme som den svarte firkanten. Dette betyr i utgangspunktet at det bare vil endre pikslene i kvadratet til gjennomsiktig svart (slette dem):

Ganske fint, ikke sant? Å slette lerretet er ikke noe du vil bruke mye med statiske tegninger, men det er noe du vil bruke mye når du lærer å animere senere i denne serien.


Innpakning Ting opp

Lerret er lett å bruke, raskt å lære, og dødt kraftig når du presser det til grensene.

Så, som jeg håper du kan se, lerret er en spesielt kraftig ny del av nettleseren. Det lar deg lage grafikk, bruke kode, og uten å bruke en enkelt plugin. Det er enkelt å bruke, det er raskt å lære, og det er dødt kraftig når du presser det til grensene.

I neste artikkel ser du på noen av de mer avanserte funksjonene i lerretet, som å tegne sirkler, buede stier og noe som kalles tegningstilstanden. Og hvis det ikke er nok, ser du senere i serien at du skal forvandle tegninger (som rotasjon og skala), hvordan å manipulere bilder, og slutte med en titt på hvordan å animere. Det kommer til å bli veldig spennende ting, stole på meg.

For nå håper jeg at jeg har gitt deg nok til å appetitten for lerret og å gå ut og lære mer om det. Lerret er en fantastisk teknologi som virkelig er verdt å forstå, selv om du ikke planlegger å bruke det med en gang.