СобÑÑÐ¸Ñ ÑказаÑÐµÐ»Ñ (Pointer events) â ÑÑо ÑовÑеменнÑй ÑпоÑоб обÑабоÑки ввода Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÑазлиÑнÑÑ ÑказÑваÑÑÐ¸Ñ ÑÑÑÑойÑÑв, ÑÐ°ÐºÐ¸Ñ ÐºÐ°Ðº мÑÑÑ, пеÑо/ÑÑилÑÑ, ÑенÑоÑнÑй ÑкÑан и Ñак далее.
ÐÑаÑÐºÐ°Ñ Ð¸ÑÑоÑиÑ
Сделаем неболÑÑой обзоÑ, ÑÑÐ¾Ð±Ñ Ð²Ñ Ð¿Ð¾Ð½Ñли обÑÑÑ ÐºÐ°ÑÑÐ¸Ð½Ñ Ð¸ меÑÑо ÑобÑÑий ÑказаÑÐµÐ»Ñ ÑÑеди дÑÑÐ³Ð¸Ñ Ñипов ÑобÑÑий.
-
ÐавнÑм-давно, в пÑоÑлом, ÑÑÑеÑÑвовали ÑолÑко ÑобÑÑÐ¸Ñ Ð¼ÑÑи
ÐаÑем полÑÑили ÑиÑокое ÑаÑпÑоÑÑÑанение ÑенÑоÑнÑе ÑÑÑÑойÑÑва, в ÑаÑÑноÑÑи ÑелеÑÐ¾Ð½Ñ Ð¸ планÑеÑÑ. ЧÑÐ¾Ð±Ñ ÑкÑипÑÑ ÐºÐ¾ÑÑекÑно ÑабоÑали, они генеÑиÑовали (и до ÑÐ¸Ñ Ð¿Ð¾Ñ Ð³ÐµÐ½ÐµÑиÑÑÑÑ) ÑобÑÑÐ¸Ñ Ð¼ÑÑи. ÐапÑимеÑ, каÑание ÑенÑоÑного ÑкÑана генеÑиÑÑÐµÑ ÑобÑÑие
mousedown. Таким обÑазом, ÑенÑоÑнÑе ÑÑÑÑойÑÑва позволÑли ÑабоÑаÑÑ Ñ ÑÑÑеÑÑвÑÑÑими веб-ÑÑÑаниÑами.Ðо ÑенÑоÑнÑе ÑÑÑÑойÑÑва во Ð¼Ð½Ð¾Ð³Ð¸Ñ Ð°ÑпекÑÐ°Ñ Ð¼Ð¾Ñнее, Ñем мÑÑÑ. ÐапÑимеÑ, они позволÑÑÑ ÐºÐ°ÑаÑÑÑÑ ÑкÑана ÑÑÐ°Ð·Ñ Ð² неÑколÑÐºÐ¸Ñ Ð¼ÐµÑÑÐ°Ñ («мÑлÑÑи-ÑаÑ»). Ðднако, ÑобÑÑÐ¸Ñ Ð¼ÑÑи не имеÑÑ Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼ÑÑ ÑвойÑÑв Ð´Ð»Ñ Ð¾Ð±ÑабоÑки ÑÐ°ÐºÐ¸Ñ Ð¿ÑикоÑновений.
-
ÐоÑÑÐ¾Ð¼Ñ Ð¿Ð¾ÑвилиÑÑ ÑобÑÑÐ¸Ñ ÐºÐ°ÑÐ°Ð½Ð¸Ñ (Touch events), Ñакие как
touchstart,touchend,touchmove, коÑоÑÑе имеÑÑ ÑпеÑиÑиÑнÑе Ð´Ð»Ñ ÐºÐ°Ñаний ÑвойÑÑва (Ð¼Ñ Ð½Ðµ бÑдем здеÑÑ ÑаÑÑмаÑÑиваÑÑ Ð¸Ñ Ð¿Ð¾Ð´Ñобно, поÑÐ¾Ð¼Ñ ÑÑо ÑобÑÑÐ¸Ñ ÑказаÑÐµÐ»Ñ ÐµÑÑ Ð»ÑÑÑе).Ðо и ÑÑÐ¸Ñ ÑобÑÑий оказалоÑÑ Ð½ÐµÐ´Ð¾ÑÑаÑоÑно, Ñак как ÑÑÑеÑÑвÑÐµÑ Ð¼Ð½Ð¾Ð³Ð¾ дÑÑÐ³Ð¸Ñ ÑÑÑÑойÑÑв, ÑÐ°ÐºÐ¸Ñ ÐºÐ°Ðº пеÑо, Ñ ÐºÐ¾ÑоÑÑÑ ÐµÑÑÑ Ñвои оÑобенноÑÑи. ÐÑоме Ñого, ÑнивеÑÑалÑнÑй код, коÑоÑÑй оÑÑлеживал Ð±Ñ Ð¸ ÑобÑÑÐ¸Ñ ÐºÐ°Ñаний и ÑобÑÑÐ¸Ñ Ð¼ÑÑи, неÑдобно пиÑаÑÑ.
-
ÐÐ»Ñ ÑеÑÐµÐ½Ð¸Ñ ÑÑÐ¸Ñ Ð·Ð°Ð´Ð°Ñ Ð±Ñл внедÑÑн ÑÑандаÑÑ Pointer Events («СобÑÑÐ¸Ñ Ð£ÐºÐ°Ð·Ð°ÑелÑ»). Ðн пÑедоÑÑавлÑÐµÑ ÐµÐ´Ð¸Ð½Ñй Ð½Ð°Ð±Ð¾Ñ ÑобÑÑий Ð´Ð»Ñ Ð²ÑÐµÑ Ñипов ÑказÑваÑÑÐ¸Ñ ÑÑÑÑойÑÑв.
РнаÑÑоÑÑÐµÐ¼Ñ Ð²Ñемени ÑпеÑиÑикаÑÐ¸Ñ Pointer Events Level 2 поддеÑживаеÑÑÑ Ð²Ñеми оÑновнÑми бÑаÑзеÑами, а Pointer Events Level 3 Ð½Ð°Ñ Ð¾Ð´Ð¸ÑÑÑ Ð² ÑазÑабоÑке и поÑÑи полноÑÑÑÑ ÑовмеÑÑима Ñ Pointer Events Level 2.
ÐÑли Ð²Ñ Ð½Ðµ ÑазÑабаÑÑваеÑе под ÑÑаÑÑе бÑаÑзеÑÑ, Ñакие как Internet Explorer 10, Safari 12, или более Ñанние веÑÑии, болÑÑе Ð½ÐµÑ Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ÑÑи иÑполÑзоваÑÑ ÑобÑÑÐ¸Ñ Ð¼ÑÑи или каÑаний â можно пеÑÐµÑ Ð¾Ð´Ð¸ÑÑ ÑÑÐ°Ð·Ñ Ð½Ð° ÑобÑÑÐ¸Ñ ÑказаÑелÑ.
ÐÑи ÑÑом Ð²Ð°Ñ ÐºÐ¾Ð´ бÑÐ´ÐµÑ ÐºÐ¾ÑÑекÑно ÑабоÑаÑÑ Ð¸ Ñ ÑенÑоÑнÑми ÑÑÑÑойÑÑвами и Ñ Ð¼ÑÑÑÑ. ÐпÑоÑем, Ñ ÑобÑÑий ÑказаÑÐµÐ»Ñ ÐµÑÑÑ Ð²Ð°Ð¶Ð½Ñе оÑобенноÑÑи, коÑоÑÑе нÑжно знаÑÑ, ÑÑÐ¾Ð±Ñ Ð¸Ñ Ð¿ÑавилÑно иÑполÑзоваÑÑ, без лиÑÐ½Ð¸Ñ ÑÑÑпÑизов. ÐÑ Ð¾ÑмеÑим Ð¸Ñ Ð² ÑÑой ÑÑаÑÑе.
Ð¢Ð¸Ð¿Ñ ÑобÑÑий ÑказаÑелÑ
Ð¡Ñ ÐµÐ¼Ð° именований ÑобÑÑий ÑказаÑÐµÐ»Ñ Ð¿Ð¾Ñ Ð¾Ð¶Ð° на ÑобÑÑÐ¸Ñ Ð¼ÑÑи:
| СобÑÑие ÑказаÑÐµÐ»Ñ | ÐналогиÑное ÑобÑÑие мÑÑи |
|---|---|
pointerdown |
mousedown |
pointerup |
mouseup |
pointermove |
mousemove |
pointerover |
mouseover |
pointerout |
mouseout |
pointerenter |
mouseenter |
pointerleave |
mouseleave |
pointercancel |
- |
gotpointercapture |
- |
lostpointercapture |
- |
Ðак Ð¼Ñ Ð²Ð¸Ð´Ð¸Ð¼, Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ mouse<ÑобÑÑиÑ> еÑÑÑ ÑооÑвеÑÑÑвÑÑÑее pointer<ÑобÑÑие>, коÑоÑое игÑÐ°ÐµÑ Ð°Ð½Ð°Ð»Ð¾Ð³Ð¸ÑнÑÑ ÑолÑ. Также еÑÑÑ 3 дополниÑелÑнÑÑ
ÑобÑÑÐ¸Ñ ÑказаÑелÑ, Ñ ÐºÐ¾ÑоÑÑÑ
Ð½ÐµÑ ÑооÑвеÑÑÑвÑÑÑего аналога mouse..., ÑкоÑо Ð¼Ñ Ð¸Ñ
ÑазбеÑÑм.
mouse<ÑобÑÑий> на pointer<ÑобÑÑиÑ> в кодеÐÑ Ð¼Ð¾Ð¶ÐµÐ¼ замениÑÑ ÑобÑÑÐ¸Ñ mouse... на аналогиÑнÑе pointer... в коде и бÑÑÑ ÑвеÑеннÑми, ÑÑо Ñ Ð¼ÑÑÑÑ Ð¿Ð¾-пÑÐµÐ¶Ð½ÐµÐ¼Ñ Ð²ÑÑ Ð±ÑÐ´ÐµÑ ÑабоÑаÑÑ Ð½Ð¾ÑмалÑно.
ÐÑи ÑÑом поддеÑжка ÑенÑоÑнÑÑ
ÑÑÑÑойÑÑв «волÑебнÑм» обÑазом ÑлÑÑÑиÑÑÑ. ХоÑÑ, возможно, кое-где понадобиÑÑÑ Ð´Ð¾Ð±Ð°Ð²Ð¸ÑÑ 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-and-drop») Ð´Ð»Ñ Ð½Ð°Ñего мÑÑа, как в наÑале ÑÑаÑÑи Drag'n'Drop Ñ ÑобÑÑиÑми мÑÑи.
ÐÐ¾Ñ Ð¿Ð¾ÑледоваÑелÑноÑÑÑ Ð´ÐµÐ¹ÑÑвий полÑзоваÑÐµÐ»Ñ Ð¸ ÑооÑвеÑÑÑвÑÑÑие ÑобÑÑиÑ:
- ÐолÑзоваÑÐµÐ»Ñ Ð½Ð°Ð¶Ð¸Ð¼Ð°ÐµÑ Ð½Ð° изобÑажении, ÑÑÐ¾Ð±Ñ Ð½Ð°ÑаÑÑ Ð¿ÐµÑеÑаÑкивание
- пÑоиÑÑ
Ð¾Ð´Ð¸Ñ ÑобÑÑие
pointerdown
- пÑоиÑÑ
Ð¾Ð´Ð¸Ñ ÑобÑÑие
- ÐаÑем он пеÑемеÑÐ°ÐµÑ ÑказаÑелÑ, Ð´Ð²Ð¸Ð³Ð°Ñ Ð¸Ð·Ð¾Ð±Ñажение
- пÑоиÑÑ
Ð¾Ð´Ð¸Ñ ÑобÑÑие
pointermove(возможно, неÑколÑко Ñаз)
- пÑоиÑÑ
Ð¾Ð´Ð¸Ñ ÑобÑÑие
- Ð ÑÑÑ Ð¿ÑоиÑÑ
Ð¾Ð´Ð¸Ñ ÑÑÑпÑиз! ÐÑаÑÐ·ÐµÑ Ð¸Ð¼ÐµÐµÑ Ð²ÑÑÑоеннÑÑ Ð¿Ð¾Ð´Ð´ÐµÑÐ¶ÐºÑ Â«DragânâDrop» Ð´Ð»Ñ Ð¸Ð·Ð¾Ð±Ñажений, коÑоÑÐ°Ñ Ð·Ð°Ð¿ÑÑÐºÐ°ÐµÑ Ð¸ пеÑеÑ
ваÑÑÐ²Ð°ÐµÑ Ð¿ÑоÑеÑÑ Ð¿ÐµÑеÑаÑкиваниÑ, генеÑиÑÑÑ Ð¿Ñи ÑÑом ÑобÑÑие
pointercancel.- ТепеÑÑ Ð±ÑаÑÐ·ÐµÑ Ñам обÑабаÑÑÐ²Ð°ÐµÑ Ð¿ÐµÑеÑаÑкивание изобÑажениÑ. У полÑзоваÑÐµÐ»Ñ ÐµÑÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ Ð¿ÐµÑеÑаÑиÑÑ Ð¸Ð·Ð¾Ð±Ñажение мÑÑа даже за пÑÐµÐ´ÐµÐ»Ñ Ð±ÑаÑзеÑа, в ÑÐ²Ð¾Ñ Ð¿Ð¾ÑÑовÑÑ Ð¿ÑогÑÐ°Ð¼Ð¼Ñ Ð¸Ð»Ð¸ ÑайловÑй менеджеÑ.
- СобÑÑий
pointermoveÐ´Ð»Ñ Ð½Ð°Ñ Ð±Ð¾Ð»ÑÑе не генеÑиÑÑеÑÑÑ.
Таким обÑазом, бÑаÑÐ·ÐµÑ Â«Ð¿ÐµÑеÑ
ваÑÑваеÑ» дейÑÑвие: в наÑале пеÑеноÑа drag-and-drop запÑÑкаеÑÑÑ ÑобÑÑие pointercancel, и поÑле ÑÑого ÑобÑÑÐ¸Ñ pointermove болÑÑе не генеÑиÑÑÑÑÑÑ.
ÐÐ¾Ñ Ð´ÐµÐ¼Ð¾ dragânâdrop Ñ Ð·Ð°Ð¿Ð¸ÑÑÑ ÑобÑÑий ÑказаÑÐµÐ»Ñ (ÑолÑко up/down, move и cancel) в textarea:
ÐÑ Ð±Ñ Ñ Ð¾Ñели ÑеализоваÑÑ Ð¿ÐµÑеÑаÑкивание ÑамоÑÑоÑÑелÑно, поÑÑÐ¾Ð¼Ñ Ð´Ð°Ð²Ð°Ð¹Ñе Ñкажем бÑаÑзеÑÑ Ð½Ðµ пеÑÐµÑ Ð²Ð°ÑÑваÑÑ ÐµÐ³Ð¾.
ÐÑедоÑвÑаÑайÑе дейÑÑвие бÑаÑзеÑа по ÑмолÑаниÑ, ÑÑÐ¾Ð±Ñ Ð¸Ð·Ð±ÐµÐ¶Ð°ÑÑ pointercancel.
ÐÑжно ÑделаÑÑ Ð´Ð²Ðµ веÑи:
- ÐÑедоÑвÑаÑиÑÑ Ð·Ð°Ð¿ÑÑк вÑÑÑоенного dragânâdrop
- ÐÑ Ð¼Ð¾Ð¶ÐµÐ¼ ÑделаÑÑ ÑÑо, задав
ball.ondragstart = () => false, как опиÑано в ÑÑаÑÑе Drag'n'Drop Ñ ÑобÑÑиÑми мÑÑи. - ÐÑо ÑабоÑÐ°ÐµÑ Ð´Ð»Ñ ÑобÑÑий мÑÑи.
- ÐÑ Ð¼Ð¾Ð¶ÐµÐ¼ ÑделаÑÑ ÑÑо, задав
- ÐÐ»Ñ ÑÑÑÑойÑÑв Ñ ÑенÑоÑнÑм ÑкÑаном ÑÑÑеÑÑвÑÑÑ Ð´ÑÑгие дейÑÑÐ²Ð¸Ñ Ð±ÑаÑзеÑа, ÑвÑзаннÑе Ñ ÐºÐ°ÑаниÑми, кÑоме dragânâdrop. ЧÑÐ¾Ð±Ñ Ñ Ð½Ð¸Ð¼Ð¸ не возникало пÑоблем:
- ÐÑ Ð¼Ð¾Ð¶ÐµÐ¼ пÑедоÑвÑаÑиÑÑ Ð¸Ñ
, добавив в CSS ÑвойÑÑво
#ball { touch-action: none }. - ÐаÑем Ð½Ð°Ñ ÐºÐ¾Ð´ наÑнÑÑ ÐºÐ¾ÑÑекÑно ÑабоÑаÑÑ Ð½Ð° ÑÑÑÑойÑÑÐ²Ð°Ñ Ñ ÑенÑоÑнÑм ÑкÑаном
- ÐÑ Ð¼Ð¾Ð¶ÐµÐ¼ пÑедоÑвÑаÑиÑÑ Ð¸Ñ
, добавив в CSS ÑвойÑÑво
ÐоÑле Ñого, как Ð¼Ñ ÑÑо Ñделаем, ÑобÑÑÐ¸Ñ Ð±ÑдÑÑ ÑабоÑаÑÑ ÐºÐ°Ðº и ожидаеÑÑÑ, бÑаÑÐ·ÐµÑ Ð½Ðµ бÑÐ´ÐµÑ Ð¿ÐµÑеÑ
ваÑÑваÑÑ Ð¿ÑоÑеÑÑ Ð¸ не бÑÐ´ÐµÑ Ð²ÑзÑваÑÑ ÑобÑÑие pointercancel.
Рданном демо пÑÐ¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ñ Ð½ÑжнÑе дейÑÑвиÑ:
Ðак Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе видеÑÑ, ÑобÑÑие pointercancel болÑÑе не ÑÑабаÑÑваеÑ.
ТепеÑÑ Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ добавиÑÑ ÐºÐ¾Ð´ Ð´Ð»Ñ Ð¿ÐµÑемеÑÐµÐ½Ð¸Ñ Ð¼ÑÑа и Ð½Ð°Ñ dragânâdrop бÑÐ´ÐµÑ ÑабоÑаÑÑ Ð¸ Ð´Ð»Ñ Ð¼ÑÑи и Ð´Ð»Ñ ÑÑÑÑойÑÑв Ñ ÑенÑоÑнÑм ÑкÑаном.
ÐÐ°Ñ Ð²Ð°Ñ ÑказаÑелÑ
ÐÐ°Ñ Ð²Ð°Ñ ÑказаÑÐµÐ»Ñ â оÑÐ¾Ð±Ð°Ñ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ ÑобÑÑий ÑказаÑелÑ.
ÐбÑÐ°Ñ Ð¸Ð´ÐµÑ Ð¾ÑÐµÐ½Ñ Ð¿ÑоÑÑа, но понаÑÐ°Ð»Ñ Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾ÐºÐ°Ð·Ð°ÑÑÑÑ ÑÑÑанной, Ñак как Ð´Ð»Ñ Ð´ÑÑÐ³Ð¸Ñ ÑобÑÑий ниÑего подобного пÑоÑÑо неÑ.
ÐÑновной меÑод:
elem.setPointerCapture(pointerId)â пÑивÑзÑÐ²Ð°ÐµÑ ÑобÑÑÐ¸Ñ Ñ Ð´Ð°Ð½Ð½ÑмpointerIdкelem. ÐоÑле Ñакого вÑзова вÑе ÑобÑÑÐ¸Ñ ÑказаÑÐµÐ»Ñ Ñ ÑакимpointerIdбÑдÑÑ Ð¸Ð¼ÐµÑÑelemв каÑеÑÑве Ñелевого ÑлеменÑа (как бÑдÑо пÑоизоÑли надelem), вне завиÑимоÑÑи Ð¾Ñ Ñого, где в докÑменÑе они пÑоизоÑли.
ÐÑÑгими Ñловами, elem.setPointerCapture(pointerId) менÑÐµÑ target вÑеÑ
далÑнейÑиÑ
ÑобÑÑий Ñ Ð´Ð°Ð½Ð½Ñм pointerId на elem.
ÐÑа пÑивÑзка оÑменÑеÑÑÑ:
- авÑомаÑиÑеÑки, пÑи возникновении ÑобÑÑиÑ
pointerupилиpointercancel, - авÑомаÑиÑеÑки, еÑли
elemÑдалÑеÑÑÑ Ð¸Ð· докÑменÑа, - пÑи вÑзове
elem.releasePointerCapture(pointerId).
ÐÐ°Ñ Ð²Ð°Ñ ÑказаÑÐµÐ»Ñ Ð¸ÑполÑзÑеÑÑÑ Ð´Ð»Ñ ÑпÑоÑÐµÐ½Ð¸Ñ Ð¾Ð¿ÐµÑаÑий Ñ Ð¿ÐµÑеноÑом (dragânâdrop) ÑлеменÑов.
РкаÑеÑÑве пÑимеÑа давайÑе вÑпомним ÑеализаÑÐ¸Ñ ÑлайдеÑа из ÑÑаÑÑи Drag'n'Drop Ñ ÑобÑÑиÑми мÑÑи.
ÐÑ Ð´ÐµÐ»Ð°ÐµÐ¼ ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð´Ð»Ñ ÑлайдеÑа â полоÑÐºÑ Ñ Â«Ð¿Ð¾Ð»Ð·Ñнком» (thumb) внÑÑÑи:
<div class="slider">
<div class="thumb"></div>
</div>
Со ÑÑилÑми, ÑÑо вÑглÑÐ´Ð¸Ñ ÑледÑÑÑим обÑазом:
ÐаÑем он ÑабоÑÐ°ÐµÑ Ñак:
- ÐолÑзоваÑÐµÐ»Ñ ÑнаÑала Ð½Ð°Ð¶Ð¸Ð¼Ð°ÐµÑ Ð½Ð° ползÑнок
thumbâ ÑÑабаÑÑваеÑpointerdown. - ÐаÑем Ð´Ð²Ð¸Ð³Ð°ÐµÑ ÐµÐ³Ð¾ ÑказаÑелем â ÑÑабаÑÑваеÑ
pointermove, и Ð½Ð°Ñ ÐºÐ¾Ð´ пеÑемеÑÐ°ÐµÑ ÑлеменÑ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
thumb.setPointerCapture(event.pointerId);
// наÑаÑÑ Ð¾ÑÑлеживание пеÑемеÑÐµÐ½Ð¸Ñ ÑказаÑелÑ
thumb.onpointermove = function(event) {
// пеÑемеÑение ÑлайдеÑа: оÑÑлеживание thumb, Ñ.к вÑе ÑобÑÑÐ¸Ñ ÑказаÑÐµÐ»Ñ Ð¿ÐµÑенаÑÐµÐ»ÐµÐ½Ñ Ð½Ð° него
let newLeft = event.clientX - slider.getBoundingClientRect().left;
thumb.style.left = newLeft + 'px';
};
// еÑли ÑÑабоÑало ÑобÑÑие pointerup, завеÑÑиÑÑ Ð¾ÑÑлеживание пеÑемеÑÐµÐ½Ð¸Ñ ÑказаÑелÑ
thumb.onpointerup = function(event) {
thumb.onpointermove = null;
thumb.onpointerup = null;
// ...пÑи необÑ
одимоÑÑи Ñакже обÑабоÑайÑе "ÐºÐ¾Ð½ÐµÑ Ð¿ÐµÑемеÑениÑ"
};
};
// пÑимеÑание: Ð½ÐµÑ Ð½ÐµÐ¾Ð±Ñ
одимоÑÑи вÑзÑваÑÑ thumb.releasePointerCapture,
// ÑÑо пÑоиÑÑ
Ð¾Ð´Ð¸Ñ Ð°Ð²ÑомаÑиÑеÑки пÑи pointerup
Ðолное демо:
РдемонÑÑÑаÑионном пÑимеÑе Ñакже имееÑÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑй ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ñ Ð¾Ð±ÑабоÑÑиком onmouseover, показÑваÑÑий ÑекÑÑÑÑ Ð´Ð°ÑÑ.
ÐбÑаÑиÑе внимание: пока Ð²Ñ Ð¿ÐµÑеÑаÑкиваеÑе ползÑнок, Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе навеÑÑи кÑÑÑÐ¾Ñ Ð½Ð° ÑÑÐ¾Ñ ÑлеменÑ, и его обÑабоÑÑик не ÑÑабоÑаеÑ.
Таким обÑазом, благодаÑÑ setPointerCapture пеÑеÑаÑкивание ÑепеÑÑ Ð½Ðµ Ð¸Ð¼ÐµÐµÑ Ð¿Ð¾Ð±Ð¾ÑнÑÑ
ÑÑÑекÑов.
Таким обÑазом, Ð¼Ñ Ð¸Ð¼ÐµÐµÐ¼ два бонÑÑа:
- Ðод ÑÑановиÑÑÑ ÑиÑе, поÑколÑÐºÑ Ð½Ð°Ð¼ болÑÑе не нÑжно добавлÑÑÑ/ÑдалÑÑÑ Ð¾Ð±ÑабоÑÑики Ð´Ð»Ñ Ð²Ñего докÑменÑа. Удаление пÑивÑзки пÑоиÑÑ Ð¾Ð´Ð¸Ñ Ð°Ð²ÑомаÑиÑеÑки.
- ÐÑли в докÑменÑе еÑÑÑ ÐºÐ°ÐºÐ¸Ðµ-Ñо дÑÑгие обÑабоÑÑики
pointermove, Ñо они не бÑдÑÑ Ð½ÐµÑаÑнно вÑзванÑ, пока полÑзоваÑÐµÐ»Ñ Ð½Ð°Ñ Ð¾Ð´Ð¸ÑÑÑ Ð² пÑоÑеÑÑе пеÑеÑаÑÐºÐ¸Ð²Ð°Ð½Ð¸Ñ ÑлайдеÑа.
СобÑÑÐ¸Ñ Ð¿Ñи Ð·Ð°Ñ Ð²Ð°Ñе ÑказаÑелÑ
СÑÑеÑÑвÑÐµÑ Ð´Ð²Ð° ÑвÑзаннÑÑ Ñ Ð·Ð°Ñ Ð²Ð°Ñом ÑобÑÑиÑ:
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â¦)