تخطَّ إلى المحتوى

🟨 شرح جافاسكريبت

الرسم على Canvas

الدرس 31 من 32· ⏱ 2 دقائق قراءة

عنصر canvas

<canvas> وسم HTML يعطيك مساحة رسم خام تتحكّم بها بالكامل عبر JavaScript — كل بكسل، كل شكل، كل حركة. تحصل على "سياق رسم" (context) منه ثم ترسم عليه:

<canvas id="board" width="400" height="300"></canvas>
const canvas = document.querySelector("#board");
const ctx = canvas.getContext("2d"); // سياق الرسم ثنائي الأبعاد

رسم الأشكال الأساسية

// مستطيل معبّأ
ctx.fillStyle = "purple";
ctx.fillRect(10, 10, 100, 60); // x, y, width, height

// مستطيل بحدود فقط
ctx.strokeStyle = "cyan";
ctx.lineWidth = 3;
ctx.strokeRect(130, 10, 100, 60);

// مسح جزء من اللوحة
ctx.clearRect(20, 20, 30, 20);

رسم دائرة ومسارات مخصّصة

Canvas لا يملك دالة "دائرة" جاهزة — تبني مسارًا (path) بأوامر ثم تملأه أو تحدّده:

ctx.beginPath();
ctx.arc(200, 150, 50, 0, Math.PI * 2); // x, y, radius, startAngle, endAngle
ctx.fillStyle = "orange";
ctx.fill();

// مسار حر بخطوط
ctx.beginPath();
ctx.moveTo(50, 200);
ctx.lineTo(150, 250);
ctx.lineTo(250, 200);
ctx.strokeStyle = "black";
ctx.stroke();

النصوص والصور

ctx.font = "24px Arial";
ctx.fillStyle = "black";
ctx.fillText("مرحبًا Canvas", 50, 280);

const img = new Image();
img.src = "/logo.png";
img.onload = () => {
  ctx.drawImage(img, 300, 10, 80, 80); // ارسم بعد اكتمال التحميل فقط
};

الرسوم المتحركة: requestAnimationFrame

setInterval غير مناسب للرسوم المتحركة السلسة — requestAnimationFrame يتزامن مع معدّل تحديث الشاشة (عادة 60 مرة/ثانية) ويوقف نفسه تلقائيًا إذا التبويب غير ظاهر (يوفّر الطاقة):

let x = 0;

function animate() {
  ctx.clearRect(0, 0, canvas.width, canvas.height); // امسح الإطار السابق
  ctx.fillStyle = "purple";
  ctx.fillRect(x, 100, 40, 40);

  x += 2;
  if (x > canvas.width) x = -40; // أعد الكرة من اليسار

  requestAnimationFrame(animate); // اطلب الإطار التالي
}

requestAnimationFrame(animate); // ابدأ الحلقة

التفاعل مع الفأرة

canvas.addEventListener("click", (event) => {
  const rect = canvas.getBoundingClientRect();
  const x = event.clientX - rect.left; // إحداثيات نسبية للوحة نفسها
  const y = event.clientY - rect.top;

  ctx.beginPath();
  ctx.arc(x, y, 10, 0, Math.PI * 2);
  ctx.fillStyle = "cyan";
  ctx.fill();
});

جدول سريع

الدالة/الخاصيةالغرض
getContext("2d")الحصول على سياق الرسم
fillRect / strokeRectمستطيل معبّأ / بحدود
beginPath + arc + fillرسم دائرة
fillTextكتابة نص
drawImageرسم صورة
requestAnimationFrameحلقة رسوم متحركة متزامنة مع الشاشة

أخطاء شائعة

  • نسيان clearRect قبل كل إطار بالرسوم المتحركة — يترك أثرًا لكل الإطارات السابقة مرسومة فوق بعضها.
  • الرسم داخل img.src = ... مباشرة بدون انتظار onload — الصورة لسا ما تحمّلت فيظهر شيء فارغ أو خطأ.
  • استخدام setInterval بدل requestAnimationFrame للرسوم المتحركة — حركة أقل سلاسة واستهلاك بطارية أعلى بلا داعٍ.

🎯 التالي: الخلاصة الشاملة لمسار JavaScript وخطواتك بعده.

شرح الرسم على Canvas — جافاسكريبت بالعربي
الرسم على Canvasجافاسكريبت بالعربي · The Code Fix

📚 لمزيد من التعمّق في جافاسكريبت، راجِع توثيق JavaScript على MDN.

هل كان هذا الدرس مفيدًا؟