HTML5 Canvas · Çizim & path
Şekil çizimi: katalog, kısayollar ve boyanmış primitive’ler
Canvas 2D’de «şekil» çoğu zaman bir dikdörtgen, daire veya yuvarlatılmış panel demektir —
tarayıcı
sık kullanılan bu figürleri hazır fonksiyonlarla sunar ki arka plan ızgarası,
düğme
zeminleri ve minimap blokları için tekrar tekrar lineTo zinciri yazmak zorunda
kalmayasınız. Kısayol çağrıları doğrudan piksele yazar; path tabanlı alternatif ise aynı silüeti
beginPath ile kurup fill/stroke ile tamamlamaktır. Bu
sayfa,
hangi API’nin hangi üretim senaryosuna uyduğunu ve şekilleri stil ile nasıl paketleyeceğinizi
canvas
üreticisi gözüyle sabitler.
Alt yol disiplini Path sistemi sayfasında; dolgu ve kontur ayrımı Stroke vs fill sayfasında; eğri ağırlıklı silüetler Eğri mantığı konusunda. Stil dalları ve kırpma State sistemi ile yönetilir — burada geometri seçimi ve şekil kataloğu ön plandadır.
Özet: şekil API’leri
| Aile | Örnek | Özellik |
|---|---|---|
| Dikdörtgen kısayolu | fillRect, strokeRect |
Eksen paralel kutu; path açmadan boyar |
| Temizleme | clearRect |
Piksel siler; boya komutu değildir |
| Yuvarlatılmış kutu | roundRect (path) |
Panel / kart; ardından fill veya stroke |
| Yuvarlak | arc, ellipse |
Path parçası; açılar radyan |
Kısayol mu, path mi: seçim sözleşmesi
fillRect ve strokeRect, tek satırda «şunu çiz» emridir —
parametreleri dünya veya HUD uzayındaki dikdörtgen köşesi ve ölçülerdir (
Koordinat sistemi
). Path tabanlı rect + fill/stroke ise aynı kutuyu
çizer fakat kodun okunabilirliği ve gelecekte aynı path’e kenar efekti (ör.
kesik kontur veya clip) ekleme esnekliği farklıdır. Kural: düz grid, blok harita, basit
düğme
zeminleri → kısayol; seçim çerçevesi hem dolu hem konturlu ve aynı geometri üzerinde birden
fazla
işlem → path.
Kısayollar bağlamın mevcut fillStyle / strokeStyle değerlerini
okur;
dolayısıyla bir yardımcı fonksiyon «sadece grid çizer» diyorsa renk parametresi geçmeden
önce
stil set eden çağıran kod sorumludur — aksi halde önceki modülün rengi sızar. Bu ayrım
Stroke vs fill sayfasındaki stil
disipliniyle örtüşür; burada vurgu, şekil API seçimidir.
Son olarak, döndürülmüş veya eğik dikdörtgen kısayol ile gelmez; rotate veya
genel matris altında fillRect hâlâ eksen paralel bir kutu üretir — sadece
dönük görünür. Eğik «elmas» panel istiyorsanız path veya çokgen gerekir (eğri değilse
dört lineTo yeter).
Dikdörtgenler: fillRect, strokeRect ve clearRect
Üç fonksiyon da axis-aligned dörtgene indirgenebilir. fillRect opak veya yarı
saydam katman için; strokeRect ince çerçeve veya ızgara çizgisi için;
clearRect ise piksel buffer’ını şeffaf veya varsayılan arka plana döndürmek
için
kullanılır — sonuncusu fill/stroke değildir, doğrudan silme işlemidir (
Clear
& redraw
).
Negatif genişlik veya yükseklik, dikdörtgeni sola veya yukarı doğru genişletir; slot tabanlı layout hesaplarında yararlıdır. Üst üste binen dolgular birleşim sırasına göre birikir; bu yüzden «önce koyu zemin, sonra yarı saydam vurgu» gibi katman sırasını bilinçli tutun — composite modlarını istisnai tutmak Composite operations sayfasına bırakılır.
strokeRect çağrısından sonra path durumu hakkında yanlış varsayım yapmayın:
tarayıcı
içeride geçici path kullanır; kendi beginPath zincirinizle karışmaması için
kritik çizim blokları arasında path’i açıkça sıfırlamak
Path · beginPath
disiplinine uyar.
function drawChessBackdrop(ctx, cell, cols, rows) {
ctx.fillStyle = 'rgba(255,255,255,0.06)';
for (let y = 0; y < rows; y++) {
for (let x = 0; x < cols; x++) {
if ((x + y) % 2 === 0) continue;
ctx.fillRect(x * cell, y * cell, cell, cell);
}
}
}
RoundRect: yuvarlatılmış kart ve tek yarıçap
roundRect(x, y, w, h, radii) mevcut path’e bağlı olarak yuvarlatılmış
dikdörtgen
konturu ekler; ardından fill veya stroke ile tamamlanırsınız. Tek
sayı
verilirse dört köşe aynı yarıçapı paylaşır; dizi veya nesne ile köşe başına farklı yarıçap
tanımlanabilir — tasarımda «üst geniş radius, alt sıkı» HUD panellerinde sık tercih edilir.
Yuvarlak köşeli kartın görsel sırası Stroke vs fill · sıra bölümüyle uyumludur: çoğu arayüz önce gövde dolgusu, sonra ince kenarlık çizer. Tarayıcı desteği kritik ise üretim kodunda özellik tespiti veya köşeleri yay + line ile manuel yaklaşım gerekebilir; bu sayfa API sözleşmesini sabitler, polyfill seçimi projeye bağlıdır.
Clip maskesi olarak da kullanılabilir: beginPath → roundRect → clip —
görüntünün
köşeli taşması engellenir; maske sonra
State · clip
dalında kapatılır.
function drawRoundedPanel(ctx, x, y, w, h, r) {
ctx.beginPath();
ctx.roundRect(x, y, w, h, r);
ctx.fillStyle = 'rgba(18, 24, 34, 0.92)';
ctx.fill();
ctx.strokeStyle = '#2ee7f2';
ctx.lineWidth = 2;
ctx.stroke();
}
Daire ve elips: arc, yay ve yüz yüzeyi
Tam dolu daire: beginPath → arc(cx, cy, r, 0, Math.PI * 2) → fill. İnce halka:
yay + stroke — dolgu gerektirmez. «Pasta dilimi» yüzdesi için başlangıç ve
bitiş
açılarını radyan olarak beslersiniz; UI göstergelerinde -Math.PI / 2 ile
12-yönünden
başlatmak sık seçilir. Yay, path’te önceki noktaya otomatik segment eklemez; komşu
segmentlerden
kaçınmak için uygun moveTo gerekebilir (
Path · arc ).
ellipse, yarı eksenleri ve opsiyonel dönüş açısı ile tek çağrıda oval üretir;
oyuncu status balonu veya elips seçim alanı için uygundur. Elips ile daire fill’i
özdeşleşmez —
yan eksen sıfırsa veya iki yarı eksen eşitse görsel olarak dairedir.
Büyük yaylı sahnede çok sayıda daire kümesi tek kare içinde yüzlerce primitive demektir — bu
yüzden
aynı parametreleri tekrar eden bileşenlerde
Path2D önbelleği veya daha az karmaşık
görsel için
kısmen drawImage önbelleği değerlendirilebilir; ikincisi bitmap çözümüdür ve bu
başlıkta
yalnızca hatırlatma olarak yer alır.
Gradyan ve desen: şekille hizalı boya kaynağı
createLinearGradient ve createRadialGradient bağlam nesnesinden
türetilir;
duraklar (addColorStop) ile gövdeden kenara sıcak-soğuk geçiş verilir. Önemli
ayrıntı:
gradyanın başlangıç ve bitiş noktaları bağlam koordinatlarındadır — şekli
translate ile taşıdıysanız gradyanı da aynı dalda tanımlamak veya taşıma
sonrası
koordinatları yeniden hesaplamak gerekir; aksi halde panel kayarken renk bandı sabit kalır.
Düğme veya bar şekli için tipik desen: gradyanı oluştur, fillStyle ata, sonra
roundRect veya fillRect ile doldur. Radyal gradyan vurgu ışığı,
portre çerçevesi veya lens parlaması için kullanılır; merkez ve yarıçapları şekil
sınırlarına
göre ayarlanır.
createPattern(image, repetition) döşeme ve dokulu yüzey sağlar; görüntünün
yüklendiğinden
emin olun — yüklenmemiş pattern şeffaf veya boş kalabilir. Pattern + stroke nadiren birlikte
gerektirir; çoğu arayüz gövdesinde pattern fill yeterli (
2D context
bağlamında stil oluşturmaya daha geniş yer vardır).
function fillChip(ctx, x, y, w, h) {
const g = ctx.createLinearGradient(x, y, x + w, y + h);
g.addColorStop(0, '#2ee7f2');
g.addColorStop(1, '#b56cff');
ctx.fillStyle = g;
ctx.beginPath();
ctx.roundRect(x, y, w, h, 8);
ctx.fill();
}
Path2D: tekrar çizilen silüet ve ikon fabrikası
Aynı rozet, minimap işaretçisi veya özel çokgen onlarca kez çiziliyorsa geometriyi bir kez
Path2D içinde kurup fill(path) / stroke(path) ile
tekrar kullanmak CPU’da path komut tekrarını azaltır. Transform her çağrıda uygulanır — path
kendisi dünya konumu taşımaz; translate + fill(badge) deseni
doğaldır.
SVG path dizesinden new Path2D(d) ile içe aktarım mümkündür; tasarım aracından
gelen vektörü canvas’ta tekrar kullanma yoludur. Hit test (
isPointInPath(path, x, y)) için de Path2D kullanılır; detay
Path · hit test ile örtüşür.
const diamond = new Path2D();
diamond.moveTo(0, -8);
diamond.lineTo(6, 0);
diamond.lineTo(0, 8);
diamond.lineTo(-6, 0);
diamond.closePath();
function drawMarkerAt(ctx, x, y, fillStyle) {
ctx.save();
ctx.translate(x, y);
ctx.fillStyle = fillStyle;
ctx.fill(diamond);
ctx.restore();
}
Metin outlines: fillText ve strokeText
fillText ve strokeText glyph’leri şekil gibi çizer; kontur yazı
için
ince veya neon hat, dolgu yazı için okunabilir gövde verir. font,
textAlign, textBaseline bağlam durumudur ve panel çizimiyle
çakışmaması için
State · iç içe katman
desenine uyar. Metrik ve sarmalama bu sayfanın sınırı dışındadır; burada yalnızca «metin de
boyanabilir primitive» olduğu hatırlatılır.
Okunabilir etiket deseni: önce fillText ile ana renk, sonra ince
strokeText ile kontrast çerçeve — sıra
Stroke vs fill ·
sıra
ile uyumludur; kontur üstte kaldığı için neon veya seçim halkası etkisi netleşir. Ters sıra
dolgunun bir kısmını örter; kasıtlı olmadıkça kaçının.
textAlign ve textBaseline, koordinatın hangi noktaya oturacağını
belirler; düğme merkezinde başlık için 'center' + 'middle'
yaygındır.
Yanlış baseline, dikey hizalı kolonlarda bir satırın diğerinden «milim» kaymasına yol açar —
aynı panelde metin ve dikdörtgen çizerken baseline sözleşmesini sabitleyin.
maxWidth üçüncü parametresi metni sıkıştırır; otomatik satır kırılmaz — çok
satırlı
blok ve ölçüm (
measureText) tam yerleşim düzenleri ayrı bir metin konusuna bırakılır. Bu
sayfada
yalnızca «tek satırlık başlık / sayaç» gibi şekil paketinin parçası olduğunu not ediyoruz.
function drawOutlinedCaption(ctx, x, y, text) {
ctx.font = '600 13px DM Sans, sans-serif';
ctx.textAlign = 'center';
ctx.textBaseline = 'middle';
ctx.lineWidth = 3;
ctx.strokeStyle = 'rgba(4,10,18,0.85)';
ctx.strokeText(text, x, y);
ctx.fillStyle = '#e8f4ff';
ctx.fillText(text, x, y);
}
Hizalama, ölçek ve keskin piksel: canvas boyutu ile ilişki
Şekil konumları attribute width/height piksel ızgarasına oturur;
CSS ile
canvas DOM’u büyütüldüğünde görüntü bulanıklaşabilir
(Resize
mantığı).
İnce çizgili UI ve keskin kutular için bitmap boyutu ile device pixel oranı uyumu ve yarım
piksel kaydırması (translate(0.5, 0.5) + integer grid) sık pratikte denenir —
detay resize konusundadır; bu başlıkta yalnızca «şekil fonksiyonu çağırmadan önce çözünürlük
hazır mı?» sorusunu sabitliyoruz.
Dünya dönüşümü altında kart çizmek yaygındır: mini harita kutusu kamerasından bağımsız kalırken, seçim halo’su dünya ile döner — hangi bileşenin hangi uzayda çizildiğini modül bazında yazmak, ileride hata ayıklamayı kolaylaştırır.
ctx matrisi ile ölçeklenen şekiller piksel ızgarasından uzaklaşır; 1 px
çizgiyi
keskin tutmak için ya ekran uzayında (sıfırlanmış matris) çizin ya da ölçek sonrası
lineWidth telafisi yapın (
Koordinat sistemi
). CSS transform ile canvas öğesini döndürmek tüm bitmap’i «fotoğraf» gibi
eğer;
içerideki fillRect hâlâ eksen paraleldir — hangi dönüşümün nerede uygulandığını
ayırın.
Dikdörtgen ve metinleri aynı hizada tutmak için tamsayı piksel koordinatları tercih edin;
sürekli
kayan kamera için alt piksel kaçınılmalıdır — HUD sabitliyse yuvarlama kuralları (ör.
Math.round) tutarlı kalmalıdır. Piksel snapping tam çözümü resize + koordinat
sayfalarının birleşimidir; burada şekil API’si seçerken uyarı çerçevesi yeterli.
Performans düşünümü: toplu rect ve gereksiz state değişimi
Yüzlerce tile için fillRect düşük seviye maliyeti genelde iyidir; gerçek
tıkanıklık
çoğunlukla her hücrede createLinearGradient oluşturmak veya gereksiz
save/restore fırtınasıdır. Gradyanı kare başında veya stil grubu
başında
bir kez oluşturup yeniden kullanmak daha verimli olabilir — dinamik vurguda ise parametre
günceli
gerekli.
Aynı fillStyle ile çizilen hücreleri gruplayın: renk değişim sayısı azaldıkça
tarayıcı
tarafı daha öngörülebilir olur. Zıt strateji — her karede onlarca farklı gradient — mobilde
maliyeti artırır; ızgara ve harita katmanlarında «katman başına bir gradyan» veya düz renk
sık
yeterlidir; istisnai parlaklık
Composite operations
tarafında düşünülür.
Statik HUD ve dinamik dünya ayrı katmanlara bölündüğünde, sık değişmeyen bileşeni tek sefer çizilmiş bir yüzeye almak mümkündür ( Canvas oluşturma ile çoklu surface düşünümü bazı projelerde kombine edilir); bu sayfa yalnızca «aynı kare içinde» gereksiz tekrardan kaçınmayı işaret eder, mimari seçim projeye kalır.
Aşırı sayıda benzersiz küçük shape (partikül sisi) için canvas yerine tek bir sprite atlası veya WebGL yüz yüzüdür — bu klasör köprüsü başka başlıkta; burada uyarı olarak yalnızca «aynı sahne için API seçimi»nin maliyeti farklılaştığı belirtilir.
Anti-kalıplar: yanlış API, taşan radius ve kör stil
Yuvarlatılmış köşeyi fillRect ile beklemek: Kısayol köşe xırıltısı vermez;
roundRect veya path gerekir.
Radius > yarım kenar: Tarayıcı köşe yuvarlamayı kısar; beklenmedik silüet için yarıçapı min(w,h)/2 ile sınırlayın.
Gradyanı taşımadan translate: Renk bandı panelden ayrı kayar; gradyanı dal içinde yeniden tanımlayın veya matrisle uyumlu koordinat kullanın.
Metin stilini unutmak: Bir modül font değiştirip geri almazsa
HUD
metni bozulur — state disiplini.
Kısayol + path kurgusu: strokeRect veya fillRect
sonrası aynı fonksiyonda lineTo ile devam edip «path temiz» varsaymak — örtük
path
durumu
Path · beginPath ile
sıfırlanmalıdır.
Pattern yüklenmeden fillStyle: Desen görüntüsü hazır değilse dolgu boş veya
tek
renk gibi görünür; async varlık yüklemesinde boyamayı görüntü onload sonrasına
bağlayın.
strokeRect ile sıkı layout: Kontur dışa taştığı için bitişik kutuların
çerçeveleri
görsel olarak birleşir — hücre aralığı veya lineWidth düşürme
Stroke vs fill · rect
ile örtüşür.
Bu sayfanın sınırı
Tam vektör editöründeki karmaşık path operasyonları, boolean birleştirme ve Bézier ara yüzleri Eğri mantığı ve path konularına bölünmüştür. SVG DOM ile canlı bağlantı ve WebGL tessellation bu başlıkta yoktur.
- Şekil kısayolu mu gerekiyor, path esnekliği mi?
roundRectsonrası path temiz mi?- Gradyan / pattern koordinatları hangi uzayda?
- Metin ve panel aynı
savedalında mı;fontgeri alındı mı?
Sıradaki: dolgu–kontur ayrımını netleştirmek
Şekilleri seçtikten sonra aynı silüeti fill ve stroke ile nasıl
boyayacağınız
Stroke vs fill sayfasında
keskinleşir.
Önceki adım:
Path sistemi.