назад до уроку

Помістіть м'яч у центр поля

важливість: 5

Ось як має виглядати документ:

Які координати центру поля?

Обчисліть їх і використайте, щоб помістити м’яч у центр зеленого поля:

  • Елемент має бути переміщено за допомогою JavaScript, а не CSS.
  • Код повинен працювати з будь-яким розміром кулі (10, 20, 30 пікселів) і будь-якого розміру поля, ваше рішення не має залежити від якихось конкретних значень.

P.S. Звичайно, центрування можна виконати за допомогою CSS, але тут нам потрібен саме JavaScript. Далі ми познайомимося з іншими темами та більш складними ситуаціями, коли необхідно використовувати JavaScript. Тут ми робимо “розминку”.

Відкрити пісочницю для завдання.

М’яч має position:absolute. Це означає, що його left/top координати вимірюються від найближчого розташованого елемента(батька), тобто #field (тому що він має position:relative).

Координати починаються з внутрішнього лівого верхнього кута поля:

Ширина/висота внутрішнього поля clientWidth/clientHeight. Отже, центр поля має координати (clientWidth/2, clientHeight/2).

…Але якщо ми встановимо ball.style.left/top до таких значень, то в центрі буде не м’яч в цілому, а його лівий верхній кут:

ball.style.left = Math.round(field.clientWidth / 2) + 'px';
ball.style.top = Math.round(field.clientHeight / 2) + 'px';

Ось як це виглядає:

Щоб вирівняти центр м’яча з центром поля, ми повинні перемістити м’яч на половину його ширини вліво і на половину його висоти вгору:

ball.style.left = Math.round(field.clientWidth / 2 - ball.offsetWidth / 2) + 'px';
ball.style.top = Math.round(field.clientHeight / 2 - ball.offsetHeight / 2) + 'px';

Тепер м’яч нарешті відцентрований.

Attention: the pitfall!

Код не працюватиме надійно, поки <img> не має ширини/висоти:

<img src="ball.png" id="ball">

Коли браузер не знає ширини/висоти зображення (з атрибутів тегів або CSS), він вважає, що вони дорівнюють 0 поки не закінчиться завантаження зображення.

Отже, значення ball.offsetWidth буде 0 поки не завантажиться зображення. Це призводить до неправильних координат у коді вище.

Після першого завантаження браузер зазвичай кешує зображення, і при перезавантаженні воно відразу матиме розмір. Але при першому завантаженні значення ball.offsetWidth дорівнює 0.

Ми повинні це виправити, додавши width/height до <img>:

<img src="ball.png" width="40" height="40" id="ball">

…Або вказати розмір у CSS:

#ball {
  width: 40px;
  height: 40px;
}

Відкрити рішення в пісочниці.