بازگشت به درس

توپ را طول زمین حرکت دهید

اهمیت: 5

باید یک کلیک توپ را در طول زمین حرکت کنید. مانند:

نیازها:

  • در زمان کلیک، وسط توپ باید دقیقا زیر وس قرار بگیرید (در صورت امکان بدون خروج از حاشیه‌های زمین).
  • استفاده از انیمیشن‌های CSS توصیه می‌شود.
  • توپ نباید از حدود زمین عبور کند.
  • در صورت پیمایش صفحه، نباید چیزی خراب شود.

نکات:

  • کد شما باید با توپ‌ها و اندازه‌های مختلف زمین کارکند، و مقید به مقادیر ثابتی نباشد.
  • از خصوصیات event.clientX/event.clientY برای گرفتن مختصات اشاره‌گر موس استفاده کنید.

باز کردن یک sandbox برای تمرین.

اول نیاز داریم که روش قرارگیری توپ را انتخاب کنیم.

نمی‌توانیم از position:fixed به این منظور استفاده کنیم. چون اسکرول کردن صفحه باید توپ را در زمین جابجا کند.

پس باید از position:absolute استفاده کنیم و برای اینکه از موقعیت توپ مطمئن شویم، روش قرارگیری field را نیز تنظیم می‌کنیم.

در این صورت، توپ نسبت به زمین قرار گرفته می‌شود:

#field {
  width: 200px;
  height: 150px;
  position: relative;
}

#ball {
  position: absolute;
  left: 0; /* نسبت به نزدیکترین والدی که موقعیت آن تنظیم شده (field) */
  top: 0;
  transition: 1s all; /* انیمیشن‌های CSS برای چپ/بالا، انگار توپ پرتاب شده */
}

حال باید مقدارهای درستی به ball.style.left/top بدهیم. این مقدار نسبت به زمین خواهد بود.

مانند این تصویر:

ما event.clientX/clientY را داریم، مختصات اشاره‌گر موس نسبت به پنجره.

برای اینکه مقدار left مختصات اشاره‌گر موس در زمان کلیک را نسبت به زمین بگیریم، باید چپ زمین و عرض حاشیه را از هم کم کنیم.

let left = event.clientX - fieldCoords.left - field.clientLeft;

معمولا، ball.style.left به معنی “حاشیه چپ عنصر” (توپ) است. پس اگر که به left مقدار دهیم، پس گوشیه توپ، و نه وسط آن زیر موس قرار می‌گیرد.

باید که توپ را به اندازه نصف طولش به چپ، و به اندازه نصف ارتفاع آن به بالا ببریم تا وسط قرار گیرد.

پس مقدار نهایی left به صورت زیر است:

let left = event.clientX - fieldCoords.left - field.clientLeft - ball.offsetWidth/2;

مختصات عمودی نیز با همین منطق محاسبه می‌شود.

لطفا توجه کنید که طول/ارتفاع توب باید در زمانی که به ball.offsetWidth معلوم باشد. پس باید در HTML یا CSS آنها را مقدار دهی کنیم.

باز کردن راه‌حل درون sandbox.