ÐодÑÑ Ð²ÐºÐ°Ð·Ñвника â Ñе ÑÑÑаÑний ÑпоÑÑб обÑобки Ð´Ð°Ð½Ð¸Ñ , Ð²Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð·Ð° Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ ÑÑÐ·Ð½Ð¸Ñ Ð²ÐºÐ°Ð·ÑÐ²Ð½Ð¸Ñ Ð¿ÑиÑÑÑоÑв, ÑÐ°ÐºÐ¸Ñ Ñк миÑа, пеÑо/ÑÑилÑÑ, ÑенÑоÑний екÑан ÑоÑо.
ÐоÑоÑка ÑÑÑоÑÑÑ
ÐÑобÑмо невеликий оглÑд, Ñоб ви зÑозÑмÑли загалÑÐ½Ñ ÐºÐ°ÑÑÐ¸Ð½Ñ Ñа мÑÑÑе вказÑÐ²Ð½Ð¸Ñ Ð¿Ð¾Ð´Ñй ÑеÑед ÑнÑÐ¸Ñ ÑипÑв подÑй.
-
Ðавним-давно, в минÑломÑ, ÑÑнÑвали лиÑе подÑÑ Ð¼Ð¸ÑÑ.
ÐоÑÑм набÑли поÑиÑÐµÐ½Ð½Ñ ÑенÑоÑÐ½Ñ Ð¿ÑиÑÑÑоÑ, зокÑема ÑелеÑони Ñа планÑеÑи. Щоб ÑÑенаÑÑÑ, ÑÐºÑ ÑÑнÑÑÑÑ, пÑаÑÑвали, вони генеÑÑвали (Ñ Ð´Ð¾ÑÑ Ð³ÐµÐ½ÐµÑÑÑÑÑ) подÑÑ Ð¼Ð¸ÑÑ. ÐапÑиклад, наÑиÑÐºÐ°Ð½Ð½Ñ Ð½Ð° ÑенÑоÑний екÑан генеÑÑÑ
mousedown. Тож ÑенÑоÑÐ½Ñ Ð¿ÑиÑÑÑÐ¾Ñ Ð´Ð¾Ð±Ñе пÑаÑÑвали з вебÑÑоÑÑнками.Ðле ÑенÑоÑÐ½Ñ Ð¿ÑиÑÑÑÐ¾Ñ Ð¼Ð°ÑÑÑ Ð±ÑлÑÑе можливоÑÑей, нÑж миÑа. ÐапÑиклад, можна ÑоÑкнÑÑиÑÑ ÐºÑлÑÐºÐ¾Ñ ÑоÑок одноÑаÑно (âmulti-touchâ). ХоÑа подÑÑ Ð¼Ð¸ÑÑ Ð½Ðµ маÑÑÑ Ð½ÐµÐ¾Ð±Ñ ÑÐ´Ð½Ð¸Ñ Ð²Ð»Ð°ÑÑивоÑÑей Ð´Ð»Ñ Ð¾Ð±Ñобки ÑÐ°ÐºÐ¸Ñ Ð¼ÑлÑÑидоÑикÑв.
-
Ð¢Ð¾Ð¼Ñ Ð±Ñли Ð²Ð²ÐµÐ´ÐµÐ½Ñ ÑенÑоÑÐ½Ñ Ð¿Ð¾Ð´ÑÑ, ÑÐ°ÐºÑ Ñк
touchstart,touchend,touchmove, ÑÐºÑ Ð¼Ð°ÑÑÑ Ð²Ð»Ð°ÑÑивоÑÑÑ, ÑпеÑиÑÑÑÐ½Ñ Ð´Ð»Ñ Ð´Ð¾ÑÐ¸ÐºÑ (ÑÑÑ Ð¼Ð¸ не ÑозглÑдаÑмо ÑÑ Ð´ÐµÑалÑно, ÑÐ¾Ð¼Ñ Ñо подÑÑ Ð²ÐºÐ°Ð·Ñвника Ñе кÑаÑÑ).Ðле вÑе-Ñаки ÑÑого бÑло недоÑÑаÑнÑо, оÑкÑлÑки Ñ Ð±Ð°Ð³Ð°Ñо ÑнÑÐ¸Ñ Ð¿ÑиÑÑÑоÑв, напÑиклад ÑÑÑок, ÑÐºÑ Ð¼Ð°ÑÑÑ ÑÐ²Ð¾Ñ Ð¾ÑобливоÑÑÑ. ÐÑÑм Ñого, код, Ñкий пÑоÑлÑÑ Ð¾Ð²ÑÑ Ñк подÑÑ Ð´Ð¾ÑикÑ, Ñак Ñ Ð¼Ð¸ÑÑ, доÑиÑÑ Ð³ÑомÑздкий.
-
Щоб ÑозвâÑзаÑи ÑÑ Ð¿Ñоблеми, бÑло введено новий ÑÑандаÑÑ Pointer Events. ÐÑн забезпеÑÑÑ Ñдиний набÑÑ Ð¿Ð¾Ð´Ñй Ð´Ð»Ñ Ð²ÑÑÑ Ð²Ð¸Ð´Ñв вказÑÐ²Ð½Ð¸Ñ Ð¿ÑиÑÑÑоÑв.
Ðа Ñей ÑÐ°Ñ ÑпеÑиÑÑкаÑÑÑ Pointer Events Level 2 пÑдÑÑимÑÑÑÑÑÑ Ð² ÑÑÑÑ Ð¾ÑÐ½Ð¾Ð²Ð½Ð¸Ñ Ð±ÑаÑзеÑÐ°Ñ , ÑÐ¾Ð´Ñ Ñк новÑÑа веÑÑÑÑ Pointer Events Level 3 Ð·Ð½Ð°Ñ Ð¾Ð´Ð¸ÑÑÑÑ Ð² ÑозÑобÑÑ Ñ Ð² оÑÐ½Ð¾Ð²Ð½Ð¾Ð¼Ñ ÑÑмÑÑна з Pointer Events дÑÑгого ÑÑвнÑ.
ЯкÑо ви не ÑозÑоблÑÑÑе Ð´Ð»Ñ ÑÑаÑÐ¸Ñ Ð±ÑаÑзеÑÑв, ÑÐ°ÐºÐ¸Ñ Ñк Internet Explorer 10 або Safari 12 або ÑÑаÑÑÑÐ¾Ñ Ð²ÐµÑÑÑÑ, Ñо бÑлÑÑе Ð½ÐµÐ¼Ð°Ñ ÑенÑÑ Ð²Ð¸ÐºÐ¾ÑиÑÑовÑваÑи подÑÑ Ð¼Ð¸ÑÑ Ñи доÑÐ¸ÐºÑ â ми можемо пеÑейÑи на подÑÑ Ð²ÐºÐ°Ð·Ñвника.
Ð¢Ð¾Ð´Ñ Ð²Ð°Ñ ÐºÐ¾Ð´ бÑде добÑе пÑаÑÑваÑи Ñк Ñз ÑенÑоÑними пÑиладами, Ñак Ñ Ð· миÑами.
Ðднак, Ñ Ð´ÐµÑÐºÑ Ð²Ð°Ð¶Ð»Ð¸Ð²Ñ Ð¾ÑобливоÑÑÑ, ÑÐºÑ Ð¿Ð¾ÑÑÑбно знаÑи, Ñоб пÑавилÑно викоÑиÑÑовÑваÑи подÑÑ Ð²ÐºÐ°Ð·Ñвника Ñа ÑникаÑи неÑподÑванок. Ðи звеÑнемо ÑÐ²Ð°Ð³Ñ Ð½Ð° Ð½Ð¸Ñ Ñ ÑÑй ÑÑаÑÑÑ.
Типи подÑй вказÑвника
ÐодÑÑ Ð²ÐºÐ°Ð·Ñвника називаÑÑÑÑÑ Ð°Ð½Ð°Ð»Ð¾Ð³ÑÑно подÑÑм миÑÑ:
| ÐодÑÑ Ð²ÐºÐ°Ð·Ñвника | ÐналогÑÑÐ½Ñ Ð¿Ð¾Ð´ÑÑ Ð¼Ð¸ÑÑ |
|---|---|
pointerdown |
mousedown |
pointerup |
mouseup |
pointermove |
mousemove |
pointerover |
mouseover |
pointerout |
mouseout |
pointerenter |
mouseenter |
pointerleave |
mouseleave |
pointercancel |
- |
gotpointercapture |
- |
lostpointercapture |
- |
Як ми баÑимо, Ð´Ð»Ñ ÐºÐ¾Ð¶Ð½Ð¾Ð³Ð¾ mouse<event> Ñ pointer<event>, Ñкий вÑдÑгÑÐ°Ñ Ð¿Ð¾Ð´ÑÐ±Ð½Ñ ÑолÑ. Також Ñ 3 додаÑÐºÐ¾Ð²Ñ Ð¿Ð¾Ð´ÑÑ Ð²ÐºÐ°Ð·Ñвника, ÑÐºÑ Ð½Ðµ маÑÑÑ Ð²ÑдповÑдного аналога mouse..., ми поÑÑнимо ÑÑ
незабаÑом.
mouse<event> на pointer<event> Ñ Ð½Ð°ÑÐ¾Ð¼Ñ ÐºÐ¾Ð´ÑÐи можемо замÑниÑи подÑÑ mouse<event> на pointer<event> Ñ Ð½Ð°ÑÐ¾Ð¼Ñ ÐºÐ¾Ð´Ñ Ñ Ð¾ÑÑкÑваÑи, Ñо вони пÑаÑÑваÑимÑÑÑ Ð½Ð¾ÑмалÑно з миÑеÑ.
ÐÑдÑÑимка ÑенÑоÑниÑ
пÑиÑÑÑоÑв Ñакож âмагÑÑним Ñиномâ покÑаÑиÑÑÑÑ. ХоÑа нам може знадобиÑиÑÑ Ð´Ð¾Ð´Ð°Ñи touch-action: none Ñ Ð´ÐµÑкиÑ
мÑÑÑÑÑ
CSS. Ðи ÑозглÑнемо Ñе нижÑе в ÑоздÑÐ»Ñ Ð¿Ñо pointercancel.
ÐлаÑÑивоÑÑÑ Ð¿Ð¾Ð´ÑÑ Ð²ÐºÐ°Ð·Ñвника
ÐодÑÑ Ð²ÐºÐ°Ð·Ñвника маÑÑÑ ÑÑ ÑÐ°Ð¼Ñ Ð²Ð»Ð°ÑÑивоÑÑÑ, Ñо й подÑÑ Ð¼Ð¸ÑÑ, ÑÐ°ÐºÑ Ñк clientX/Y, target ÑоÑо, а Ñакож деÑÐºÑ ÑнÑÑ:
-
pointerIdâ ÑнÑкалÑний ÑденÑиÑÑкаÑÐ¾Ñ Ð²ÐºÐ°Ð·Ñвника, Ñо ÑпÑиÑинÑÑ Ð¿Ð¾Ð´ÑÑ.ÐгенеÑований бÑаÑзеÑом. ÐозволÑÑ Ð½Ð°Ð¼ пÑаÑÑваÑи з кÑлÑкома вказÑвниками, Ñакими Ñк ÑенÑоÑний екÑан Ð·Ñ ÑÑилÑÑом Ñ Ð¼ÑлÑÑиÑÐ°Ñ (пÑиклади бÑдÑÑÑ Ð´Ð°Ð»Ñ).
-
pointerTypeâ Ñип вказÑвного пÑиÑÑÑоÑ. ÐÐ°Ñ Ð±ÑÑи ÑÑдком, одним Ñз ÑÐ°ÐºÐ¸Ñ : âmouseâ, âpenâ або âtouchâ.Ðи можемо викоÑиÑÑовÑваÑи ÑÑ Ð²Ð»Ð°ÑÑивÑÑÑÑ, Ñоб по-ÑÑÐ·Ð½Ð¾Ð¼Ñ ÑеагÑваÑи на ÑÑÐ·Ð½Ñ Ñипи вказÑвникÑв.
-
isPrimaryâtrueÐ´Ð»Ñ Ð¾Ñновного вказÑвника (пеÑÑий палеÑÑ Ñ Ð¼ÑлÑÑиÑаÑ).
ÐеÑÐºÑ Ð²ÐºÐ°Ð·ÑÐ²Ð½Ñ Ð¿ÑиÑÑÑÐ¾Ñ Ð²Ð¸Ð¼ÑÑÑÑÑÑ Ð¿Ð»Ð¾ÑÑ ÐºÐ¾Ð½ÑакÑÑ Ñа ÑиÑк, напÑ. Ð´Ð»Ñ Ð¿Ð°Ð»ÑÑÑ Ð½Ð° ÑенÑоÑÐ½Ð¾Ð¼Ñ ÐµÐºÑÐ°Ð½Ñ Ñ Ð´Ð¾Ð´Ð°ÑÐºÐ¾Ð²Ñ Ð²Ð»Ð°ÑÑивоÑÑÑ Ð´Ð»Ñ ÑÑого:
widthâ ÑиÑина облаÑÑÑ, де вказÑвник (напÑиклад, палеÑÑ) ÑоÑкаÑÑÑÑÑ Ð¿ÑиÑÑÑоÑ. ЯкÑо не пÑдÑÑимÑÑÑÑÑÑ, напÑ. Ð´Ð»Ñ Ð¼Ð¸ÑÑ Ñе завжди1.heightâ виÑоÑа облаÑÑÑ, де вказÑвник ÑоÑкаÑÑÑÑÑ Ð¿ÑиÑÑÑоÑ. Там, де не пÑдÑÑимÑÑÑÑÑÑ, завжди1.pressureâ ÑиÑк вказÑвника в дÑÐ°Ð¿Ð°Ð·Ð¾Ð½Ñ Ð²Ñд 0 до 1. ÐÐ»Ñ Ð¿ÑиÑÑÑоÑв, ÑÐºÑ Ð½Ðµ пÑдÑÑимÑÑÑÑ ÑиÑк, Ð¼Ð°Ñ Ð±ÑÑи0,5(наÑиÑнÑÑий) або0.tangentialPressureâ ноÑмалÑзований ÑангенÑÑйний ÑиÑк.tiltX,tiltY,twistâ ÑпеÑиÑÑÑÐ½Ñ Ð²Ð»Ð°ÑÑивоÑÑÑ Ð¿ÐµÑа, ÑÐºÑ Ð¾Ð¿Ð¸ÑÑÑÑÑ, Ñк воно ÑозÑаÑовÑÑÑÑÑÑ Ð²ÑдноÑно повеÑÑ Ð½Ñ.
Ð¦Ñ Ð²Ð»Ð°ÑÑивоÑÑÑ Ð½Ðµ пÑдÑÑимÑÑÑÑÑÑ Ð±ÑлÑÑÑÑÑÑ Ð¿ÑиÑÑÑоÑв, ÑÐ¾Ð¼Ñ Ð²Ð¸ÐºÐ¾ÑиÑÑовÑÑÑÑÑÑ ÑÑдко. Ðи можеÑе знайÑи деÑÐ°Ð»Ñ Ð¿Ñо Ð½Ð¸Ñ Ñ ÑпеÑиÑÑкаÑÑÑ, ÑкÑо поÑÑÑбно.
ÐÑлÑÑиÑаÑ
ÐднÑÑÑ Ð· ÑеÑей, ÑÐºÑ Ð¿Ð¾Ð´ÑÑ Ð¼Ð¸ÑÑ Ð¿Ð¾Ð²Ð½ÑÑÑÑ Ð½Ðµ пÑдÑÑимÑÑÑÑ, Ñ Ð¼ÑлÑÑиÑаÑ: коÑиÑÑÑÐ²Ð°Ñ Ð¼Ð¾Ð¶Ðµ ÑоÑкаÑиÑÑ Ð² кÑлÑÐºÐ¾Ñ Ð¼ÑÑÑÑÑ Ð¾Ð´Ð½Ð¾ÑаÑно на ÑвоÑÐ¼Ñ ÑелеÑÐ¾Ð½Ñ Ñи планÑеÑÑ Ð°Ð±Ð¾ виконÑваÑи ÑпеÑÑалÑÐ½Ñ Ð¶ÐµÑÑи.
ÐодÑÑ Ð²ÐºÐ°Ð·Ñвника дозволÑÑÑÑ Ð¾Ð±ÑоблÑÑи мÑлÑÑиÑÐ°Ñ Ð·Ð° Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ Ð²Ð»Ð°ÑÑивоÑÑей pointerId Ñа isPrimary.
ÐÑÑ Ñо вÑдбÑваÑÑÑÑÑ, коли коÑиÑÑÑÐ²Ð°Ñ ÑоÑкаÑÑÑÑÑ ÑенÑоÑного екÑана в Ð¾Ð´Ð½Ð¾Ð¼Ñ Ð¼ÑÑÑÑ, а поÑÑм кладе ÑнÑий палеÑÑ Ð² ÑнÑе мÑÑÑе:
- ÐÑи пеÑÑÐ¾Ð¼Ñ Ð´Ð¾ÑÐ¸ÐºÑ Ð¿Ð°Ð»ÑÑем:
pointerdownзisPrimary=trueÑа певнимpointerId.
- ÐÐ»Ñ Ð´ÑÑгого палÑÑÑ Ñа ÑнÑиÑ
палÑÑÑв (ÑкÑо пеÑÑий доÑÑ ÑоÑкаÑÑÑÑÑ):
pointerdownзisPrimary=falseÑа ÑнÑимpointerIdÐ´Ð»Ñ ÐºÐ¾Ð¶Ð½Ð¾Ð³Ð¾ палÑÑÑ.
ÐвеÑнÑÑÑ ÑвагÑ: pointerId пÑизнаÑаÑÑÑÑÑ Ð½Ðµ вÑÑÐ¾Ð¼Ñ Ð¿ÑиÑÑÑоÑ, а ÐºÐ¾Ð¶Ð½Ð¾Ð¼Ñ Ð´Ð¾ÑÐ¸ÐºÑ Ð¿Ð°Ð»ÑÑÑ. ЯкÑо ми викоÑиÑÑовÑÑмо 5 палÑÑÑв, Ñоб одноÑаÑно ÑоÑкнÑÑиÑÑ ÐµÐºÑана, Ñ Ð½Ð°Ñ Ð±Ñде 5 подÑй pointerdown, кожна Ð·Ñ ÑвоÑми вÑдповÑдними кооÑдинаÑами Ñа ÑнÑим pointerId.
ÐодÑÑ, повâÑÐ·Ð°Ð½Ñ Ð· пеÑÑим палÑÑем, завжди маÑÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð½Ñ isPrimary=true.
Ðи можемо вÑдÑÑежÑваÑи кÑлÑка палÑÑÑв, викоÑиÑÑовÑÑÑи ÑÑ
pointerId. Ðоли коÑиÑÑÑÐ²Ð°Ñ ÑÑÑ
аÑ, а поÑÑм пÑибиÑÐ°Ñ Ð¿Ð°Ð»ÐµÑÑ, ми оÑÑимÑÑмо подÑÑ pointermove Ñа pointerup з Ñим же pointerId, Ñо й Ñ pointerdown.
ÐÑÑ Ð´ÐµÐ¼Ð¾Ð½ÑÑÑаÑÑÑ, Ñка ÑеÑÑÑÑÑÑ Ð¿Ð¾Ð´ÑÑ pointerdown Ñа pointerup:
ÐвеÑнÑÑÑ ÑвагÑ: Ñоб побаÑиÑи ÑÑзниÑÑ Ð² pointerId/isPrimary, ви Ð¿Ð¾Ð²Ð¸Ð½Ð½Ñ Ð²Ð¸ÐºÐ¾ÑиÑÑовÑваÑи пÑиÑÑÑÑй Ñз ÑенÑоÑним екÑаном, напÑиклад ÑелеÑон або планÑеÑ. ÐÐ»Ñ Ð¿ÑиÑÑÑоÑв з одним доÑиком, ÑакиÑ
Ñк миÑа, завжди бÑде однаковий pointerId з isPrimary=true Ð´Ð»Ñ Ð²ÑÑÑ
подÑй вказÑвника.
ÐодÑÑ: pointercancel
ÐодÑÑ pointercancel ÑпÑаÑÑовÑÑ, коли вÑдбÑваÑÑÑÑÑ Ð¿Ð¾ÑÑÑйна взаÑмодÑÑ Ð²ÐºÐ°Ð·Ñвника, а поÑÑм вÑдбÑваÑÑÑÑÑ ÑоÑÑ, Ñо ÑпÑиÑинÑÑ ÑÑ ÑкаÑÑваннÑ.
Такими пÑиÑинами Ñ:
- ФÑзиÑне Ð²Ð¸Ð¼ÐºÐ½ÐµÐ½Ð½Ñ Ð¾Ð±Ð»Ð°Ð´Ð½Ð°Ð½Ð½Ñ Ð²ÐºÐ°Ð·Ñвного пÑиÑÑÑоÑ.
- ÐмÑна оÑÑÑнÑаÑÑÑ Ð¿ÑиÑÑÑÐ¾Ñ (планÑÐµÑ Ð¿Ð¾Ð²ÐµÑнÑÑо).
- Ð ÑÑÐµÐ½Ð½Ñ Ð±ÑаÑзеÑа обÑоблÑÑи взаÑмодÑÑ ÑамоÑÑÑйно, вважаÑÑи Ñе жеÑÑом миÑÑ Ð°Ð±Ð¾ дÑÑÑ Ð¼Ð°ÑÑÑабÑÐ²Ð°Ð½Ð½Ñ Ñа паноÑамÑÐ²Ð°Ð½Ð½Ñ Ð°Ð±Ð¾ ÑимоÑÑ ÑнÑим.
Ðи пÑодемонÑÑÑÑÑмо pointercancel на пÑакÑиÑÐ½Ð¾Ð¼Ñ Ð¿ÑикладÑ, Ñоб побаÑиÑи, Ñк вÑн Ð²Ð¿Ð»Ð¸Ð²Ð°Ñ Ð½Ð° наÑ.
СкажÑмо, ми впÑоваджÑÑмо dragânâdrop Ð´Ð»Ñ Ð¼âÑÑа, Ñк на поÑаÑÐºÑ ÑÑаÑÑÑ Drag'n'Drop з подÑÑми миÑÑ.
ÐÑÑ Ñ Ñд дÑй коÑиÑÑÑваÑа Ñа вÑдповÑÐ´Ð½Ñ Ð¿Ð¾Ð´ÑÑ:
- ÐоÑиÑÑÑÐ²Ð°Ñ Ð½Ð°ÑиÑÐºÐ°Ñ Ð½Ð° зобÑаженнÑ, Ñоб поÑаÑи пеÑеÑÑгÑваннÑ
- ÑпÑаÑÑовÑÑ Ð¿Ð¾Ð´ÑÑ
pointerdown
- ÑпÑаÑÑовÑÑ Ð¿Ð¾Ð´ÑÑ
- ÐоÑÑм вÑн поÑÐ¸Ð½Ð°Ñ ÑÑÑ
аÑи вказÑвник (пеÑеÑÑгÑÑÑи Ñаким Ñином зобÑаженнÑ)
pointermoveÑпÑаÑÑовÑÑ, можливо, кÑлÑка ÑазÑв
- Ð ÑÐ¾Ð´Ñ Ð²ÑдбÑваÑÑÑÑÑ ÑÑÑпÑиз! ÐÑаÑÐ·ÐµÑ Ð¼Ð°Ñ Ð²Ð±ÑÐ´Ð¾Ð²Ð°Ð½Ñ Ð¿ÑдÑÑÐ¸Ð¼ÐºÑ dragânâdrop Ð´Ð»Ñ Ð·Ð¾Ð±ÑаженÑ, Ñка запÑÑкаÑÑÑÑÑ Ñа беÑе на Ñебе пÑоÑÐµÑ dragânâdrop, Ñаким Ñином генеÑÑÑÑи подÑÑ
pointercancel.- Ð¢ÐµÐ¿ÐµÑ Ð±ÑаÑÐ·ÐµÑ ÑамоÑÑÑйно обÑоблÑÑ Ð¿ÐµÑеÑÑгÑÐ²Ð°Ð½Ð½Ñ Ð·Ð¾Ð±ÑаженнÑ. ÐоÑиÑÑÑÐ²Ð°Ñ Ð¼Ð¾Ð¶Ðµ навÑÑÑ Ð¿ÐµÑеÑÑгнÑÑи зобÑÐ°Ð¶ÐµÐ½Ð½Ñ Ð¼âÑÑа з бÑаÑзеÑа, Ñ ÑÐ²Ð¾Ñ Ð¿Ð¾ÑÑÐ¾Ð²Ñ Ð¿ÑогÑÐ°Ð¼Ñ Ð°Ð±Ð¾ Ñайловий менеджеÑ.
- ÐÐ»Ñ Ð½Ð°Ñ Ð±ÑлÑÑе Ð½ÐµÐ¼Ð°Ñ Ð¿Ð¾Ð´Ñй
pointermove.
Таким Ñином, пÑоблема полÑÐ³Ð°Ñ Ð² ÑомÑ, Ñо бÑаÑÐ·ÐµÑ âвикÑадаÑâ взаÑмодÑÑ: pointercancel запÑÑкаÑÑÑÑÑ Ð½Ð° поÑаÑÐºÑ Ð¿ÑоÑеÑÑ âпеÑеÑÑгÑваннÑâ Ñ Ð¿Ð¾Ð´ÑÑ pointermove бÑлÑÑе не генеÑÑÑÑÑÑÑ.
ÐÑÑ dragânâdrop демо з ÑеÑÑÑÑаÑÑÑÑ Ð¿Ð¾Ð´Ñй вказÑвника (лиÑе up/down, move Ñа cancel) Ñ textarea:
Ðи Ñ Ð¾ÑÑли б ÑеалÑзÑваÑи dragânâdrop ÑамоÑÑÑйно, ÑÐ¾Ð¼Ñ ÑкажÑмо бÑаÑзеÑÑ Ð½Ðµ бÑаÑи Ñе на Ñебе.
ÐапобÑÐ³Ð°Ð½Ð½Ñ ÑиповÑй дÑÑ Ð±ÑаÑзеÑа, Ñоб ÑникнÑÑи pointercancel.
Ðам поÑÑÑбно зÑобиÑи Ð´Ð²Ñ ÑеÑÑ:
- ÐапобÑгÑи наÑÐ¸Ð²Ð½Ð¾Ð¼Ñ dragânâdrop:
- Ðи можемо зÑобиÑи Ñе, вÑÑановивÑи
ball.ondragstart = () => false, Ñк опиÑано в ÑÑаÑÑÑ Drag'n'Drop з подÑÑми миÑÑ. - Це добÑе пÑаÑÑÑ Ð´Ð»Ñ Ð¿Ð¾Ð´Ñй миÑÑ.
- Ðи можемо зÑобиÑи Ñе, вÑÑановивÑи
- ÐÐ»Ñ ÑенÑоÑниÑ
пÑиÑÑÑоÑв ÑÑнÑÑÑÑ ÑнÑÑ Ð´ÑÑ Ð±ÑаÑзеÑа, повâÑÐ·Ð°Ð½Ñ Ð· доÑиком (кÑÑм пеÑеÑÑгÑваннÑ). Щоб ÑникнÑÑи пÑоблем Ñ Ð· ними:
- ÐапобÑгÑи Ñм, вÑÑановивÑи
#ball { touch-action: none }Ñ CSS - Ð¢Ð¾Ð´Ñ Ð½Ð°Ñ ÐºÐ¾Ð´ поÑне пÑаÑÑваÑи на ÑенÑоÑÐ½Ð¸Ñ Ð¿ÑиÑÑÑоÑÑ .
- ÐапобÑгÑи Ñм, вÑÑановивÑи
ÐÑÑÐ»Ñ Ñого, Ñк ми Ñе зÑобимо, подÑÑ Ð¿ÑаÑÑваÑимÑÑÑ, Ñк задÑмано, бÑаÑÐ·ÐµÑ Ð½Ðµ бÑде пеÑеÑ
оплÑваÑи пÑоÑÐµÑ Ñ Ð½Ðµ видаваÑиме pointercancel.
У ÑÑÐ¾Ð¼Ñ Ð´ÐµÐ¼Ð¾ додаÑÑÑÑÑ ÑÐ°ÐºÑ ÑÑдки:
Як баÑиÑе, pointercancel бÑлÑÑе немаÑ.
Ð¢ÐµÐ¿ÐµÑ Ð¼Ð¸ можемо додаÑи код Ð´Ð»Ñ ÑакÑиÑного пеÑемÑÑÐµÐ½Ð½Ñ Ð¼âÑÑа, Ñ Ð½Ð°Ñ dragânâdrop пÑаÑÑваÑиме Ð´Ð»Ñ Ð¿ÑиÑÑÑоÑв миÑÑ Ñа ÑенÑоÑÐ½Ð¸Ñ Ð¿ÑиÑÑÑоÑв.
ÐÐ°Ñ Ð¾Ð¿Ð»ÐµÐ½Ð½Ñ Ð²ÐºÐ°Ð·Ñвника
ÐÐ°Ñ Ð¾Ð¿Ð»ÐµÐ½Ð½Ñ Ð²ÐºÐ°Ð·Ñвника Ñ Ð¾ÑÐ¾Ð±Ð»Ð¸Ð²Ð¾Ñ Ð¿Ð¾Ð´ÑÑÑ.
ÐÐ´ÐµÑ Ð´Ñже пÑоÑÑа, але ÑпоÑаÑÐºÑ Ð¼Ð¾Ð¶Ðµ здаÑиÑÑ Ð´Ð¾ÑиÑÑ Ð´Ð¸Ð²Ð½Ð¾Ñ, оÑкÑлÑки нÑÑого подÑбного Ð´Ð»Ñ Ð±ÑдÑ-Ñкого ÑнÑого ÑÐ¸Ð¿Ñ Ð¿Ð¾Ð´ÑÑ Ð½Ðµ ÑÑнÑÑ.
ÐÑновним меÑодом Ñ:
elem.setPointerCapture(pointerId)â звâÑзÑÑ Ð¿Ð¾Ð´ÑÑ Ñз заданимpointerIdзelem. ÐÑÑÐ»Ñ Ð²Ð¸ÐºÐ»Ð¸ÐºÑ Ð²ÑÑ Ð¿Ð¾Ð´ÑÑ Ð²ÐºÐ°Ð·Ñвника з однаковимpointerIdмаÑимÑÑÑelemÑк ÑÑÐ»Ñ (нÑби вони вÑдбÑлиÑÑ Ð½Ð°elem), незалежно вÑд Ñого, де в докÑменÑÑ Ð²Ð¾Ð½Ð¸ дÑйÑно вÑдбÑлиÑÑ.
ÐнÑими Ñловами, elem.setPointerCapture(pointerId) пеÑенаÑÑлÑÑ Ð²ÑÑ Ð½Ð°ÑÑÑÐ¿Ð½Ñ Ð¿Ð¾Ð´ÑÑ Ð· заданим pointerId на elem.
ÐÑивâÑзка ÑÑÑваÑÑÑÑÑ:
- авÑомаÑиÑно, коли вÑдбÑваÑÑÑÑÑ Ð¿Ð¾Ð´ÑÑ
pointerupабоpointercancel, - авÑомаÑиÑно, коли
elemвидалÑÑÑÑÑÑ Ð· докÑменÑа, - коли викликаÑÑÑÑÑ
elem.releasePointerCapture(pointerId).
ÐÐ»Ñ Ñого ж Ñе коÑиÑно? ÐаÑÑав ÑÐ°Ñ Ð¿Ð¾Ð±Ð°ÑиÑи пÑиклад Ñз ÑеалÑного жиÑÑÑ.
ÐÐ°Ñ Ð¾Ð¿Ð»ÐµÐ½Ð½Ñ Ð²ÐºÐ°Ð·Ñвника можна викоÑиÑÑовÑваÑи Ð´Ð»Ñ ÑпÑоÑÐµÐ½Ð½Ñ Ð²Ð·Ð°ÑмодÑÑ ÑÐ¸Ð¿Ñ dragânâdrop.
Ðгадаймо, Ñк можна ÑеалÑзÑваÑи коÑиÑÑÑваÑÑкий ÑлайдеÑ, опиÑаний в Drag'n'Drop з подÑÑми миÑÑ.
Ðи можемо зÑобиÑи ÐµÐ»ÐµÐ¼ÐµÐ½Ñ slider, ÑмÑÐ³Ñ Ð· âповзÑнкомâ (thumb) вÑеÑÐµÐ´Ð¸Ð½Ñ Ð½ÐµÑ:
<div class="slider">
<div class="thumb"></div>
</div>
ÐÑ ÑÑилÑми Ñе виглÑÐ´Ð°Ñ Ñак:
ÐÑÑ ÑобоÑа логÑка пÑÑÐ»Ñ Ð·Ð°Ð¼Ñни подÑй миÑÑ Ð¿Ð¾Ð´Ñбними подÑÑми вказÑвника:
- ÐоÑиÑÑÑÐ²Ð°Ñ Ð½Ð°ÑиÑÐºÐ°Ñ Ð½Ð°
thumbâ запÑÑкаÑpointerdown. - ÐоÑÑм пеÑемÑÑÑÑ Ð²ÐºÐ°Ð·Ñвник â запÑÑкаÑÑÑÑÑ
pointermove, а Ð½Ð°Ñ ÐºÐ¾Ð´ пеÑемÑÑÑÑ ÐµÐ»ÐµÐ¼ÐµÐ½Ñthumb.- â¦Ðоли вказÑвник ÑÑÑ
аÑÑÑÑÑ, вÑн може покинÑÑи
thumbÑлайдеÑа, пеÑемÑÑÑваÑиÑÑ Ð²Ð¸Ñе або нижÑе нÑого. Ðеликий палеÑÑ Ð¿Ð¾Ð²Ð¸Ð½ÐµÐ½ ÑÑÑ Ð°ÑиÑÑ ÑÑÑого гоÑизонÑалÑно, залиÑаÑÑиÑÑ Ð½Ð° Ð¾Ð´Ð½Ð¾Ð¼Ñ ÑÑÐ²Ð½Ñ Ð· вказÑвником.
- â¦Ðоли вказÑвник ÑÑÑ
аÑÑÑÑÑ, вÑн може покинÑÑи
У ÑÑÑÐµÐ½Ð½Ñ Ð½Ð° оÑÐ½Ð¾Ð²Ñ Ð¿Ð¾Ð´Ñй миÑÑ, Ñоб вÑдÑÑежÑваÑи вÑÑ ÑÑÑ
и вказÑвника, вклÑÑно з Ñим, коли вÑн пеÑемÑÑÑÑÑÑÑÑ Ð²Ð¸Ñе/нижÑе thumb, ми Ð¿Ð¾Ð²Ð¸Ð½Ð½Ñ Ð±Ñли пÑизнаÑиÑи обÑобник подÑÑ mousemove Ð´Ð»Ñ Ð²ÑÑого document.
Ðднак Ñе не âнайÑиÑÑÑÑеâ ÑÑÑеннÑ. Ðдна з пÑоблем полÑÐ³Ð°Ñ Ð² ÑомÑ, Ñо коли коÑиÑÑÑÐ²Ð°Ñ Ð¿ÐµÑемÑÑÑÑ Ð²ÐºÐ°Ð·Ñвник по докÑменÑÑ, вÑн може запÑÑкаÑи обÑобники подÑй (напÑиклад, mouseover) на деÑкиÑ
ÑнÑиÑ
елеменÑаÑ
, викликаÑи абÑолÑÑно не повâÑÐ·Ð°Ð½Ñ ÑÑнкÑÑÑ ÑнÑеÑÑейÑÑ ÐºÐ¾ÑиÑÑÑваÑа, а ми ÑÑого не Ñ
оÑемо.
Це мÑÑÑе, де setPointerCapture вÑÑÑÐ¿Ð°Ñ Ð² гÑÑ.
- Ðи можемо викликаÑи
thumb.setPointerCapture(event.pointerId)в обÑобникÑpointerdown, - Ð¢Ð¾Ð´Ñ Ð¼Ð°Ð¹Ð±ÑÑÐ½Ñ Ð¿Ð¾Ð´ÑÑ Ð²ÐºÐ°Ð·Ñвника до
pointerup/cancelбÑдÑÑÑ Ð¿ÐµÑенаÑÑÐ»ÐµÐ½Ñ Ð½Ð°thumb. - Ðоли вÑдбÑваÑÑÑÑÑ
pointerup(пеÑеÑÑгÑÐ²Ð°Ð½Ð½Ñ Ð·Ð°Ð²ÐµÑÑено), пÑивâÑзка видалÑÑÑÑÑÑ Ð°Ð²ÑомаÑиÑно, нам не поÑÑÑбно пеÑеймаÑиÑÑ Ð·Ð° Ñе.
ТомÑ, навÑÑÑ ÑкÑо коÑиÑÑÑÐ²Ð°Ñ Ð¿ÐµÑемÑÑÑÑ Ð²ÐºÐ°Ð·Ñвник по вÑÑÐ¾Ð¼Ñ Ð´Ð¾ÐºÑменÑÑ, обÑобники подÑй бÑдÑÑÑ Ð²Ð¸ÐºÐ»Ð¸ÐºÐ°ÑиÑÑ Ð½Ð° thumb. ÐÑоÑе, влаÑÑивоÑÑÑ ÐºÐ¾Ð¾ÑÐ´Ð¸Ð½Ð°Ñ Ð¾Ð±âÑкÑÑв подÑÑ, ÑÐ°ÐºÑ Ñк clientX/clientY, залиÑаÑÑÑÑ Ð¿ÑавилÑними â заÑ
Ð¾Ð¿Ð»ÐµÐ½Ð½Ñ Ð²Ð¿Ð»Ð¸Ð²Ð°Ñ Ð»Ð¸Ñе на target/currentTarget.
ÐÑÑ Ð¾Ñновний код:
thumb.onpointerdown = function(event) {
// пеÑенаÑÑлиÑи вÑÑ Ð¿Ð¾Ð´ÑÑ Ð²ÐºÐ°Ð·Ñвника на повзÑнок (до подÑÑ pointerup)
thumb.setPointerCapture(event.pointerId);
// поÑаÑи вÑдÑÑÐµÐ¶ÐµÐ½Ð½Ñ Ð¿ÐµÑемÑÑÐµÐ½Ñ Ð²ÐºÐ°Ð·Ñвника
thumb.onpointermove = function(event) {
// пеÑемÑÑÐµÐ½Ð½Ñ Ð¿Ð¾Ð²Ð·Ñнка: вÑÑ Ð¿Ð¾Ð´ÑÑ Ð¿ÐµÑенапÑÐ°Ð²Ð»ÐµÐ½Ñ Ð½Ð° Ñей обÑобник
let newLeft = event.clientX - slider.getBoundingClientRect().left;
thumb.style.left = newLeft + 'px';
};
// завеÑÑиÑи вÑдÑÑÐµÐ¶ÐµÐ½Ð½Ñ ÑÑÑ
Ñв вказÑвника пÑи pointerup
thumb.onpointerup = function(event) {
thumb.onpointermove = null;
thumb.onpointerup = null;
// ...Ñакож обÑобиÑи "drag end", ÑкÑо поÑÑÑбно
};
};
// пÑимÑÑка: не поÑÑÑбно викликаÑи thumb.releasePointerCapture,
// Ñе вÑдбÑваÑÑÑÑÑ Ð¿Ñи pointerup авÑомаÑиÑно
Ðовне демо:
У демо Ñакож Ñ Ð´Ð¾Ð´Ð°Ñковий ÐµÐ»ÐµÐ¼ÐµÐ½Ñ Ð· обÑобником onmouseover, Ñкий показÑÑ Ð¿Ð¾ÑоÑÐ½Ñ Ð´Ð°ÑÑ.
ÐвеÑнÑÑÑ ÑвагÑ: пеÑеÑÑгÑÑÑи повзÑнок, ви можеÑе навеÑÑи кÑÑÑÐ¾Ñ Ð½Ð° Ñей елеменÑ, Ñ Ð¹Ð¾Ð³Ð¾ обÑобник не ÑпÑаÑÑÑ.
Таким Ñином, пеÑеÑÑгÑÐ²Ð°Ð½Ð½Ñ ÑÐµÐ¿ÐµÑ Ð±ÐµÐ· побÑÑниÑ
еÑекÑÑв, завдÑки setPointerCapture.
ÐÑеÑÑоÑ, Ð·Ð°Ñ Ð¾Ð¿Ð»ÐµÐ½Ð½Ñ Ð²ÐºÐ°Ð·Ñвника Ð´Ð°Ñ Ð½Ð°Ð¼ Ð´Ð²Ñ Ð¿ÐµÑеваги:
- Ðод ÑÑÐ°Ñ ÑиÑÑÑÑим, оÑкÑлÑки нам бÑлÑÑе не поÑÑÑбно додаваÑи/видалÑÑи обÑобники вÑÑого
document. ÐÑивâÑзка пÑибиÑаÑÑÑÑÑ Ð°Ð²ÑомаÑиÑно⦠- ЯкÑо в докÑменÑÑ Ñ ÑнÑÑ Ð¾Ð±Ñобники подÑй вказÑвника, вони не бÑдÑÑÑ Ð²Ð¸Ð¿Ð°Ð´ÐºÐ¾Ð²Ð¾ ÑнÑÑÑÐ¹Ð¾Ð²Ð°Ð½Ñ Ð²ÐºÐ°Ð·Ñвником, коли коÑиÑÑÑÐ²Ð°Ñ Ð¿ÐµÑеÑÑгÑÑ Ð¿Ð¾Ð²Ð·Ñнок.
ÐодÑÑ Ð·Ð°Ñ Ð¾Ð¿Ð»ÐµÐ½Ð½Ñ Ð²ÐºÐ°Ð·Ñвника
ТÑÑ Ð´Ð»Ñ Ð¿Ð¾Ð²Ð½Ð¾Ñи ÑлÑд згадаÑи Ñе Ð¾Ð´Ð½Ñ ÑÑÑ.
ÐÑнÑÑÑÑ Ð´Ð²Ñ Ð¿Ð¾Ð´ÑÑ, повâÑÐ·Ð°Ð½Ñ Ñз Ð·Ð°Ñ Ð¾Ð¿Ð»ÐµÐ½Ð½Ñм вказÑвника:
gotpointercaptureÑпÑаÑÑовÑÑ, коли ÐµÐ»ÐµÐ¼ÐµÐ½Ñ Ð²Ð¸ÐºÐ¾ÑиÑÑовÑÑsetPointerCaptureÐ´Ð»Ñ Ð²ÐºÐ»ÑÑÐµÐ½Ð½Ñ Ð·Ð°Ñ Ð¾Ð¿Ð»ÐµÐ½Ð½Ñ.lostpointercaptureзапÑÑкаÑÑÑÑÑ, коли вÑдбÑваÑÑÑÑÑ Ð·Ð²ÑлÑÐ½ÐµÐ½Ð½Ñ Ð²Ñд Ð·Ð°Ñ Ð¾Ð¿Ð»ÐµÐ½Ð½Ñ: або Ñвно за Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ Ð²Ð¸ÐºÐ»Ð¸ÐºÑreleasePointerCapture, або авÑомаÑиÑно пÑд ÑаÑpointerup/pointercancel.
ÐÑдÑÑмки
ÐодÑÑ Ð²ÐºÐ°Ð·Ñвника дозволÑÑÑÑ Ð¾Ð±ÑоблÑÑи подÑÑ Ð¼Ð¸ÑÑ, доÑÐ¸ÐºÑ Ñа пеÑа одноÑаÑно, за Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ ÑÑагменÑа кодÑ.
ÐодÑÑ Ð²ÐºÐ°Ð·Ñвника ÑозÑиÑÑÑÑÑ Ð¿Ð¾Ð´ÑÑ Ð¼Ð¸ÑÑ. Ðи можемо замÑниÑи mouse на pointer в назваÑ
подÑй Ñ Ð¾ÑÑкÑваÑи, Ñо Ð½Ð°Ñ ÐºÐ¾Ð´ пÑодовжиÑÑ Ð¿ÑаÑÑваÑи Ð´Ð»Ñ Ð¼Ð¸ÑÑ Ð· кÑаÑÐ¾Ñ Ð¿ÑдÑÑÐ¸Ð¼ÐºÐ¾Ñ ÑнÑиÑ
ÑипÑв пÑиÑÑÑоÑв.
ÐÐ»Ñ Ð¿ÐµÑеÑÑгÑÐ²Ð°Ð½Ð½Ñ Ñа ÑкладниÑ
взаÑмодÑй доÑиком, ÑÐºÑ Ð±ÑаÑÐ·ÐµÑ Ð¼Ð¾Ð¶Ðµ виÑÑÑиÑи пеÑеÑ
опиÑи Ñа обÑобиÑи ÑамоÑÑÑйно â не забÑдÑÑе ÑкаÑÑваÑи ÑÐ¸Ð¿Ð¾Ð²Ñ Ð´ÑÑ Ñ Ð²ÑÑановиÑи touch-action: none Ñ CSS Ð´Ð»Ñ ÐµÐ»ÐµÐ¼ÐµÐ½ÑÑв, ÑÐºÑ Ð¼Ð¸ викоÑиÑÑовÑÑмо.
ÐодаÑковими можливоÑÑÑми подÑй вказÑвника Ñ:
- ÐÑдÑÑимка мÑлÑÑиÑÐ°Ñ Ð·Ð° допомогоÑ
pointerIdÑаisPrimary. - СпеÑиÑÑÑÐ½Ñ Ð²Ð»Ð°ÑÑивоÑÑÑ Ð¿ÑиÑÑÑоÑ, ÑÐ°ÐºÑ Ñк
pressure,width/heightÑа ÑнÑÑ. - ÐаÑ
Ð¾Ð¿Ð»ÐµÐ½Ð½Ñ Ð²ÐºÐ°Ð·Ñвника: ми можемо пеÑенаÑÑлÑваÑи вÑÑ Ð¿Ð¾Ð´ÑÑ Ð²ÐºÐ°Ð·Ñвника на певний ÐµÐ»ÐµÐ¼ÐµÐ½Ñ Ð´Ð¾
pointerup/pointercancel.
Ðа Ñей ÑÐ°Ñ Ð¿Ð¾Ð´ÑÑ Ð²ÐºÐ°Ð·Ñвника пÑдÑÑимÑÑÑÑÑÑ Ð² ÑÑÑÑ Ð¾ÑÐ½Ð¾Ð²Ð½Ð¸Ñ Ð±ÑаÑзеÑÐ°Ñ , ÑÐ¾Ð¼Ñ Ð¼Ð¸ можемо безпеÑно пеÑÐµÑ Ð¾Ð´Ð¸Ñи на Ð½Ð¸Ñ , оÑобливо ÑкÑо IE10- Ñа Safari 12- не поÑÑÑбнÑ. РнавÑÑÑ Ð´Ð»Ñ ÑÐ¸Ñ Ð±ÑаÑзеÑÑв ÑÑнÑÑÑÑ Ð¿Ð¾Ð»ÑÑÑли, ÑÐºÑ Ð´Ð¾Ð·Ð²Ð¾Ð»ÑÑÑÑ Ð¿ÑдÑÑимÑваÑи подÑÑ Ð²ÐºÐ°Ð·Ñвника.
ÐоменÑаÑÑ
<code>, Ð´Ð»Ñ ÐºÑлÑÐºÐ¾Ñ ÑÑдкÑв â обгоÑнÑÑÑ ÑÑ Ñегом<pre>, Ð´Ð»Ñ Ð¿Ð¾Ð½Ð°Ð´ 10 ÑÑдкÑв â викоÑиÑÑовÑйÑе пÑÑоÑниÑÑ (plnkr, jsbin, codepenâ¦)