Išsamus vadovas apie lietimo gestų įgyvendinimą JavaScript. Mokykitės nuo pagrindinių lietimo įvykių iki pažangių gestų atpažinimo technikų.
Lietimo Gestai: Išsamus JavaScript Įgyvendinimo Vadovas
Šiuolaikiniame, visų pirma mobiliesiems pritaikytame pasaulyje, lietimo gestai tapo neatsiejama vartotojo patirties dalimi. Nuo paprastų bakstelėjimų iki sudėtingų kelių pirštų sąveikų, lietimo gestai suteikia vartotojams natūralų ir intuityvų būdą sąveikauti su interneto programomis. Šis išsamus vadovas tyrinėja lietimo gestų pasaulį ir pateikia žingsnis po žingsnio metodą, kaip juos įgyvendinti savo JavaScript projektuose.
Lietimo Įvykių Supratimas
Prieš pradedant gilintis į gestų atpažinimą, labai svarbu suprasti pagrindinius lietimo įvykius, kurie valdo šias sąveikas. JavaScript suteikia įvykių rinkinį, kurie suaktyvinami, kai vartotojas paliečia ekraną. Šie įvykiai pateikia informaciją apie lietimą, pavyzdžiui, jo vietą ir būseną.
Pagrindiniai Lietimo Įvykiai:
- touchstart: Suaktyvinamas, kai lietimo taškas padedamas ant lietimui jautraus paviršiaus.
- touchmove: Suaktyvinamas, kai lietimo taškas perkeliamas lietimui jautriu paviršiumi.
- touchend: Suaktyvinamas, kai lietimo taškas pašalinamas nuo lietimui jautraus paviršiaus.
- touchcancel: Suaktyvinamas, kai lietimo sąveika nutraukiama (pvz., dėl sistemos pranešimo).
Kiekvienas iš šių įvykių turi `touches` savybę, kuri yra `Touch` objektų sąrašas. Kiekvienas `Touch` objektas atspindi vieną kontaktinį tašką ekrane ir apima tokią informaciją kaip:
- clientX: Horizontali lietimo taško koordinatė, atsižvelgiant į peržiūros sritį (viewport).
- clientY: Vertikali lietimo taško koordinatė, atsižvelgiant į peržiūros sritį (viewport).
- screenX: Horizontali lietimo taško koordinatė, atsižvelgiant į ekraną.
- screenY: Vertikali lietimo taško koordinatė, atsižvelgiant į ekraną.
- target: DOM elementas, kuris buvo paliestas.
- identifier: Unikalus lietimo taško identifikatorius (naudingas kelių lietimų sąveikoms).
Pavyzdys: Lietimo Koordinačių Registravimas
Šis paprastas pavyzdys parodo, kaip registruoti lietimo taško koordinates, kai vartotojas paliečia ekraną:
document.addEventListener('touchstart', function(event) {
event.preventDefault(); // Apsaugo nuo numatytosios naršyklės elgsenos (pvz., slinkimo)
let touch = event.touches[0];
console.log('Lietimas prasidėjo X: ' + touch.clientX + ', Y: ' + touch.clientY);
});
Pastaba: `preventDefault()` metodas dažnai naudojamas norint užkirsti kelią naršyklei atlikti numatytąjį lietimo veiksmą, pavyzdžiui, slinkimą ar mastelio keitimą.
Pagrindinių Gestų Įgyvendinimas
Gerai suprasdami lietimo įvykius, dabar galime įgyvendinti pagrindinius gestus. Pažvelkime į pavyzdžius, tokius kaip bakstelėjimas, perbraukimas ir vilkimas. Jie bus paaiškinti pirmiausia apibrėžiant, kas jie yra, o po to pateikiant Javascript pavyzdžius.
Bakstelėjimo Gestas
Bakstelėjimo gestas yra greitas lietimas ir atleidimas ekrane. Norėdami įgyvendinti bakstelėjimo gestą, galime sekti `touchstart` ir `touchend` įvykius ir išmatuoti laiko skirtumą tarp jų. Jei laiko skirtumas yra mažesnis už tam tikrą ribą (pvz., 200 milisekundžių), laikome tai bakstelėjimu.
let tapStartTime = null;
document.addEventListener('touchstart', function(event) {
tapStartTime = new Date().getTime();
});
document.addEventListener('touchend', function(event) {
let tapEndTime = new Date().getTime();
let tapDuration = tapEndTime - tapStartTime;
if (tapDuration < 200) {
console.log('Aptiktas bakstelėjimas!');
}
});
Perbraukimo Gestas
Perbraukimo gestas yra greitas, kryptingas judesys per ekraną. Norėdami aptikti perbraukimą, turime sekti lietimo pradžios ir pabaigos pozicijas ir apskaičiuoti judesio atstumą bei kryptį. Taip pat turime atsižvelgti į perbraukimo trukmę.
let swipeStartX = null;
let swipeStartY = null;
document.addEventListener('touchstart', function(event) {
swipeStartX = event.touches[0].clientX;
swipeStartY = event.touches[0].clientY;
});
document.addEventListener('touchend', function(event) {
let swipeEndX = event.changedTouches[0].clientX;
let swipeEndY = event.changedTouches[0].clientY;
let deltaX = swipeEndX - swipeStartX;
let deltaY = swipeEndY - swipeStartY;
let swipeDistance = Math.sqrt(deltaX * deltaX + deltaY * deltaY);
if (swipeDistance > 50) { // Prireikus pakoreguokite slenkstį
let angle = Math.atan2(deltaY, deltaX) * 180 / Math.PI;
if (angle > -45 && angle <= 45) {
console.log('Perbraukimas į dešinę!');
} else if (angle > 45 && angle <= 135) {
console.log('Perbraukimas žemyn!');
} else if (angle > 135 || angle <= -135) {
console.log('Perbraukimas į kairę!');
} else {
console.log('Perbraukimas aukštyn!');
}
}
});
Vilkimo Gestas
Vilkimo gestas apima elemento palietimą ir jo judinimą per ekraną. Norėdami įgyvendinti vilkimo gestą, turime sekti `touchmove` įvykį ir atitinkamai atnaujinti elemento poziciją.
let dragging = false;
let offsetX, offsetY;
let element = document.getElementById('draggableElement');
element.addEventListener('touchstart', function(event) {
dragging = true;
offsetX = event.touches[0].clientX - element.offsetLeft;
offsetY = event.touches[0].clientY - element.offsetTop;
});
document.addEventListener('touchmove', function(event) {
if (dragging) {
element.style.left = (event.touches[0].clientX - offsetX) + 'px';
element.style.top = (event.touches[0].clientY - offsetY) + 'px';
}
});
document.addEventListener('touchend', function(event) {
dragging = false;
});
Įsitikinkite, kad jūsų HTML faile yra elementas su ID „draggableElement“:
Vilk Mane!
Kelių Lietimų Gestai
Kelių lietimų gestai apima kelių pirštų naudojimą sąveikaujant su ekranu. Tai leidžia atlikti sudėtingesnes ir išraiškingesnes sąveikas, tokias kaip suėmimas masteliui keisti (pinch-to-zoom) ir sukimas.
Suėmimas Masteliui Keisti (Pinch-to-Zoom)
Suėmimas masteliui keisti yra įprastas gestas, naudojamas norint priartinti ar nutolinti vaizdą ar žemėlapį. Norėdami įgyvendinti suėmimo gestą, turime sekti atstumą tarp dviejų lietimo taškų ir atitinkamai koreguoti elemento mastelį.
let initialDistance = null;
let currentScale = 1;
let element = document.getElementById('zoomableImage');
function getDistance(event) {
let touch1 = event.touches[0];
let touch2 = event.touches[1];
let x = touch2.clientX - touch1.clientX;
let y = touch2.clientY - touch1.clientY;
return Math.sqrt(x * x + y * y);
}
element.addEventListener('touchstart', function(event) {
if (event.touches.length === 2) {
initialDistance = getDistance(event);
}
});
element.addEventListener('touchmove', function(event) {
if (event.touches.length === 2) {
event.preventDefault();
let currentDistance = getDistance(event);
let scaleFactor = currentDistance / initialDistance;
currentScale *= scaleFactor; // Kaupkite mastelio keitimą
element.style.transform = 'scale(' + currentScale + ')';
initialDistance = currentDistance; // Nustatykite iš naujo kitam judesiui
}
});
element.addEventListener('touchend', function(event) {
initialDistance = null;
});
Įsitikinkite, kad jūsų HTML faile yra paveikslėlis su ID „zoomableImage“:
Sukimas
Sukimas apima elemento sukimą dviem pirštais. Norėdami įgyvendinti sukimą, turime sekti kampą tarp dviejų lietimo taškų ir atitinkamai sukti elementą.
let initialAngle = null;
let currentRotation = 0;
let element = document.getElementById('rotatableImage');
function getAngle(event) {
let touch1 = event.touches[0];
let touch2 = event.touches[1];
return Math.atan2(touch2.clientY - touch1.clientY, touch2.clientX - touch1.clientX) * 180 / Math.PI;
}
element.addEventListener('touchstart', function(event) {
if (event.touches.length === 2) {
initialAngle = getAngle(event);
}
});
element.addEventListener('touchmove', function(event) {
if (event.touches.length === 2) {
event.preventDefault();
let currentAngle = getAngle(event);
let rotation = currentAngle - initialAngle;
currentRotation += rotation; // Kaupkite sukimą
element.style.transform = 'rotate(' + currentRotation + 'deg)';
initialAngle = currentAngle; // Nustatykite iš naujo kitam judesiui
}
});
element.addEventListener('touchend', function(event) {
initialAngle = null;
});
Įsitikinkite, kad jūsų HTML faile yra paveikslėlis su ID „rotatableImage“:
Gestų Atpažinimo Bibliotekos
Sudėtingų gestų įgyvendinimas nuo nulio gali būti sudėtingas ir reikalaujantis daug laiko. Laimei, kelios JavaScript bibliotekos gali supaprastinti gestų atpažinimo procesą. Šios bibliotekos suteikia iš anksto sukurtus gestų atpažinimo įrankius ir priemones lietimo įvykiams tvarkyti.
Hammer.js
Hammer.js yra populiari JavaScript biblioteka gestams atpažinti. Ji palaiko platų gestų spektrą, įskaitant bakstelėjimą, dvigubą bakstelėjimą, perbraukimą, suėmimą, sukimą ir vilkimą. Ji yra lengva, paprasta naudoti ir labai pritaikoma. Hammer.js veikia klausydamasi lietimo įvykių ir tada nustatydama, kokį veiksmą vartotojas atlieka, remdamasi lietimo taškų vieta ir trukme.
// Įtraukite Hammer.js į savo HTML
// <script src="https://hammerjs.github.io/dist/hammer.min.js"></script>
let element = document.getElementById('myElement');
let hammer = new Hammer(element);
hammer.on('tap', function(event) {
console.log('Aptiktas bakstelėjimo įvykis');
});
hammer.on('swipe', function(event) {
console.log('Aptiktas perbraukimo įvykis');
console.log('Perbraukimo kryptis: ' + event.direction);
});
hammer.get('pinch').set({ enable: true });
hammer.get('rotate').set({ enable: true });
hammer.on('pinch', function(event) {
console.log('Aptiktas suėmimo įvykis');
element.style.transform = 'scale(' + event.scale + ')';
});
hammer.on('rotate', function(event) {
console.log('Aptiktas sukimo įvykis');
element.style.transform = 'rotate(' + event.rotation + 'deg)';
});
AlloyFinger
AlloyFinger yra dar viena populiari JavaScript biblioteka, specializuota gestų atpažinimui, ypač mobiliuosiuose įrenginiuose. Ji žinoma dėl savo mažo dydžio ir gero našumo. Ji sutelkia dėmesį į įprastus lietimo gestus, tokius kaip bakstelėjimas, perbraukimas, suėmimas, sukimas ir paspaudimas. Ji suteikia lengvai naudojamą API, skirtą gestams priskirti elementams.
// Įtraukite AlloyFinger į savo HTML
// <script src="alloy_finger.js"></script> // Pakeiskite savo AlloyFinger keliu
let element = document.getElementById('myElement');
let af = new AlloyFinger(element, {
tap: function() {
console.log('Aptiktas bakstelėjimo įvykis');
},
swipe: function(evt) {
console.log('Aptiktas perbraukimo įvykis');
console.log('Perbraukimo kryptis: ' + evt.direction); // aukštyn, žemyn, kairėn, dešinėn
},
pinch: function(evt) {
console.log('Aptiktas suėmimo įvykis');
element.style.transform = 'scale(' + evt.scale + ')';
},
rotate: function(evt) {
console.log('Aptiktas sukimo įvykis');
element.style.transform = 'rotate(' + evt.angle + 'deg)';
}
});
Prieinamumo Aspektai
Įgyvendinant lietimo gestus, būtina atsižvelgti į prieinamumą vartotojams su negalia. Kai kurie vartotojai gali negalėti naudoti lietimo gestų dėl motorikos sutrikimų. Alternatyvių įvesties metodų, tokių kaip klaviatūros valdymas ar balso komandos, suteikimas užtikrina, kad jūsų programa bus prieinama platesnei auditorijai.
- Navigacija klaviatūra: Užtikrinkite, kad visi interaktyvūs elementai būtų pasiekiami ir valdomi naudojant klaviatūrą.
- Suderinamumas su ekrano skaitytuvais: Naudokite ARIA atributus, kad suteiktumėte semantinę informaciją apie lietimo gestus ekrano skaitytuvams.
- Pakankamas kontrastas: Užtikrinkite, kad tarp teksto ir fono spalvų būtų pakankamas kontrastas, kad sąsaja būtų įskaitoma vartotojams su silpnu regėjimu.
- Lietimo taikinio dydis: Įsitikinkite, kad lietimo taikiniai yra pakankamai dideli (bent 44x44 pikselių), kad vartotojai su motorikos sutrikimais galėtų juos lengvai paliesti.
Našumo Optimizavimas
Lietimo įvykiai gali būti skaičiavimo požiūriu brangūs, ypač tvarkant sudėtingus gestus. Kodo optimizavimas našumui yra labai svarbus, siekiant užtikrinti sklandžią ir jautrią vartotojo patirtį.
- Naudokite įvykių delegavimą: Priskirkite įvykių klausytojus pagrindiniam elementui, o ne atskiriems elementams, kad sumažintumėte įvykių klausytojų skaičių.
- Ribokite įvykių tvarkyklių vykdymo dažnį: Apribokite, kaip dažnai vykdomi įvykių tvarkytojai, kad išvengtumėte našumo problemų.
- Naudokite requestAnimationFrame: Naudokite `requestAnimationFrame` animacijoms ir atnaujinimams planuoti, užtikrindami, kad jie būtų sinchronizuoti su naršyklės atvaizdavimo ciklu.
- Venkite perteklinės DOM manipuliacijos: Sumažinkite DOM manipuliavimą, nes tai gali tapti našumo kliūtimi.
- Testuokite tikruose įrenginiuose: Visada testuokite savo kodą tikruose įrenginiuose, kad nustatytumėte našumo problemas. Emuliatoriai gali netiksliai atspindėti tikrų įrenginių našumą.
Suderinamumas su Skirtingomis Naršyklėmis
Lietimo įvykių palaikymas skiriasi įvairiose naršyklėse ir įrenginiuose. Labai svarbu išbandyti savo kodą įvairiose naršyklėse ir įrenginiuose, siekiant užtikrinti suderinamumą. Apsvarstykite galimybę naudoti polifilus (polyfills) ar bibliotekas, kurios abstrahuoja naršyklių skirtumus.
- Naudokite Modernizr: Naudokite Modernizr, kad aptiktumėte lietimo įvykių palaikymą ir pateiktumėte atsarginius mechanizmus naršyklėms, kurios nepalaiko lietimo įvykių.
- Testuokite skirtinguose įrenginiuose: Išbandykite savo kodą įvairiuose įrenginiuose, įskaitant išmaniuosius telefonus, planšetinius kompiuterius ir nešiojamuosius kompiuterius su lietimui jautriais ekranais.
- Apsvarstykite polifilus (polyfills): Naudokite polifilus, kad suteiktumėte lietimo įvykių palaikymą senesnėse naršyklėse.
Internacionalizacijos (i18n) Aspektai
Įgyvendindami lietimo gestus, nepamirškite atsižvelgti į internacionalizaciją (i18n). Nors pačios lietimo sąveikos paprastai yra nepriklausomos nuo kalbos, aplinkiniai vartotojo sąsajos elementai ir grįžtamojo ryšio mechanizmai turėtų būti lokalizuoti skirtingoms kalboms ir regionams.
- Teksto kryptis: Teisingai tvarkykite kalbas, rašomas iš dešinės į kairę (RTL). Pavyzdžiui, perbraukimo gestai RTL išdėstymuose gali būti apversti.
- Skaičių ir datų formatai: Užtikrinkite, kad grįžtamojo ryšio pranešimuose naudojami skaičiai ir datos būtų suformatuoti pagal vartotojo lokalę.
- Kultūrinis jautrumas: Būkite atidūs kultūriniams gestų interpretacijos skirtumams. Gestas, įprastas vienoje kultūroje, gali būti įžeidžiantis kitoje. Ištirkite ir atitinkamai pritaikykite savo dizainą.
- Prisitaikanti vartotojo sąsaja: Užtikrinkite, kad jūsų vartotojo sąsaja galėtų prisitaikyti prie skirtingų teksto ilgių, kai jis verčiamas į įvairias kalbas. Tai gali paveikti lietimo taikinių vietą ir dydį.
Pasauliniai Pavyzdžiai ir Aspektai
Apsvarstykime, kaip lietimo gestai gali būti skirtingai taikomi įvairiuose pasauliniuose kontekstuose:
- El. prekyba Azijoje: Daugelyje Azijos el. prekybos programų naudojama sudėtinga, gestais pagrįsta navigacija produktų naršymui ir pirkimui. Apsvarstykite galimybę pasiūlyti supaprastintas lietimo sąveikas vartotojams regionuose su ribotu duomenų ryšiu.
- Žaidimai Lotynų Amerikoje: Mobilieji žaidimai yra labai populiarūs Lotynų Amerikoje. Lietimo valdiklių optimizavimas greito tempo žaidimams yra svarbus puikiai vartotojo patirčiai.
- Švietimas Afrikoje: Lietimu pagrįstos švietimo programos naudojamos vaikams mokyti mokyklose. Paprasti ir intuityvūs lietimo gestai gali pagerinti mokymosi patirtį.
- Navigacija Europoje: Žemėlapių programos Europoje gauna naudos iš sklandžių mastelio keitimo ir sukimo gestų, ypač tyrinėjant istorines vietas.
Išvada
Lietimo gestai yra galingas įrankis kuriant patrauklias ir intuityvias vartotojo patirtis. Suprasdami pagrindinius lietimo įvykius ir naudodami tinkamas gestų atpažinimo technikas, galite įgyvendinti platų gestų spektrą savo JavaScript projektuose. Nepamirškite atsižvelgti į prieinamumą, našumą ir suderinamumą su skirtingomis naršyklėmis, kad užtikrintumėte, jog jūsų programa gerai veiks visiems vartotojams. Technologijoms tobulėjant, tikėkitės pamatyti naujų gestų ir sąveikų tipų, todėl toliau mokykitės, kad išliktumėte skaitmeninių patirčių priešakyje.