zpět k lekci

Přesuňte míč na hřišti

důležitost: 5

Přesuňte míč na hřišti na místo, kam bylo kliknuto. Příklad:

Požadavky:

  • Střed míče by se měl po kliknutí umístit přesně pod ukazatel (pokud je to možné, aniž by míč překročil okraj hřiště).
  • CSS animace je vítána.
  • Míč nesmí překročit hranice hřiště.
  • Při rolování stránky by se nemělo nic rozbít.

Poznámky:

  • Kód by měl fungovat i pro jiné velikosti míče a hřiště, neměl by být vázán na pevné hodnoty.
  • Souřadnice kliknutí zjistěte z vlastností událost.clientX/událost.clientY.

Otevřít pískoviště pro úlohu.

Nejprve si musíme vybrat, jakým způsobem umístíme míč.

Nemůžeme pro něj použít position:fixed, protože při rolování stránky by se míč přemístil ven z hřiště.

Měli bychom tedy použít position:absolute, a aby bylo umístění skutečně pevné, umístit i samotné hřiště.

Pak bude míč umístěn relativně vzhledem k hřišti:

#hřiště {
  width: 200px;
  height: 150px;
  position: relative;
}

#míč {
  position: absolute;
  left: 0; /* relativně k nejbližšímu umístěnému předkovi (hřiště) */
  top: 0;
  transition: 1s all; /* CSS animace pro levý/horní roh způsobí, že míč bude létat */
}

Nyní musíme přiřadit správné hodnoty vlastnostem míč.style.left/top, které nyní obsahují souřadnice relativní vzhledem k hřišti.

Zde je obrázek:

Máme událost.clientX/clientY – souřadnice kliknutí vzhledem k oknu.

Abychom získali souřadnici kliknutí levá vzhledem k hřišti, můžeme odečíst šířku levého okraje hřiště a ohraničení:

let levá = událost.clientX - souřadniceHřiště.left - hřiště.clientLeft;

Normálně míč.style.left znamená „levý okraj elementu“ (míče). Kdybychom tedy přiřadili tuto hodnotu levá, pak by pod ukazatelem myši byl okraj míče, ne jeho střed.

Abychom míč vycentrovali, musíme jej přesunout o polovinu šířky doleva a polovinu výšky nahoru.

Výsledná levá tedy bude:

let levá = událost.clientX - souřadniceHřiště.left - hřiště.clientLeft - míč.offsetWidth/2;

Vertikální souřadnici vypočítáme stejnou logikou.

Prosíme všimněte si, že šířka a výška míče musí být známa ve chvíli, kdy přistoupíme k míč.offsetWidth. Měla by být uvedena v HTML nebo CSS.

Otevřít řešení na pískovišti.