Velciet un nometiet, izmantojot mērogošanu programmā JavaScript
Vienmērīgas un atsaucīgas vilkšanas un nomešanas pieredzes izveide var būt sarežģīta, jo īpaši, ja ir iesaistītas tādas transformācijas kā mērogošana. Ja jūs izmantojat pārveidot: tulkot() īpašība pārvietot elementus, skalas pievienošana elementam ietekmēs tā izmēru un pozīciju, izraisot aprēķinu pārtraukšanu.
Šajā scenārijā vienkārša pozīcijas pielāgošana, izmantojot peles kustības koordinātas, nedos gaidīto rezultātu, jo mērogotais elements vairs nepārvietojas tā, kā tas pārvietotos tā sākotnējā izmērā. Tas rada problēmas, aprēķinot elementa pareizā pozīcija vilkšanas laikā.
Neatkarīgi no tā, vai veidojat pielāgotu vilkšanas un nomešanas bibliotēku vai integrējat šo funkcionalitāti savā projektā, ir ļoti svarīgi saprast, kā pareizi aprēķināt pozīcijas, kad tiek lietota mērogošana. Lai nodrošinātu precīzu elementu izvietojumu, jums ir jāpielāgo kods, lai ņemtu vērā mēroga vērtību.
Šajā rakstā ir paskaidrots, kā aprēķināt elementa pareizo pozīciju velkot, izmantojot tulkot metode JavaScript, izmantojot mērogošanu. Mēs arī veiksim darbības un formulas, kas jums jāpielāgo elementa mērogam un jānodrošina vienmērīga vilkšana.
Pavēli | Lietošanas piemērs |
---|---|
getBoundingClientRect() | Šī metode atgriež elementa izmēru un pozīciju attiecībā pret skata logu. To izmanto, lai iegūtu precīzas vilktā elementa koordinātas, it īpaši, ja tiek lietotas mēroga transformācijas. |
addEventListener('pointerdown') | Elementam pievieno noteiktu notikumu apdarinātāju. Šajā gadījumā to izmanto, lai noteiktu, kad lietotājs sāk vilkšanu, noklikšķinot vai pieskaroties elementam. |
setProperty() | Šo metodi izmanto, lai dinamiski atjauninātu CSS mainīgos. Piemērā tas pielāgo pielāgotos rekvizītus --x un --y, lai atjauninātu vilkšanas pozīciju, pamatojoties uz mērogu. |
removeEventListener() | Šī metode noņem iepriekš pievienotos notikumu uztvērējus. Tas ir svarīgi, lai veiktu tīrīšanu pēc vilkšanas, noņemtu pointermove un pointerup klausītājus, lai novērstu atmiņas noplūdes. |
clientX / clientY | Šie rekvizīti atgriež peles rādītāja X un Y koordinātas attiecībā pret skata logu. Tie ir ļoti svarīgi, lai izsekotu kursora pozīciju vilkšanas darbības laikā. |
scale() | Šī ir daļa no CSS transformācijas funkcijas. Tas pielāgo vilktā elementa lielumu, vienlaikus saglabājot neskartas citas pārveidošanas īpašības, piemēram, tulkošanu, nodrošinot pareizu mērogošanu vilkšanas laikā. |
console.assert() | Šo metodi izmanto, lai skriptā veiktu vienību testēšanu. Tas pārbauda, vai ir izpildīti noteikti nosacījumi, piemēram, pārbauda, vai tulkotā pozīcija ir pareizi aprēķināta pēc vilkšanas notikuma ar mērogošanu. |
transform | Šis CSS rekvizīts elementam lieto vairākas transformācijas funkcijas (piemēram, tulkošanu un mērogošanu). To izmanto, lai atjauninātu elementa vizuālo pozīciju un izmēru vilkšanas un mērogošanas laikā. |
Izpratne par to, kā rīkoties ar elementu pozīciju, izmantojot tulkošanu un mērogošanu
Iesniegto skriptu mērķis ir atrisināt bieži sastopamu problēmu vilkšanas un nomešanas funkcionalitātē, izmantojot tulkot metodi JavaScript, it īpaši, ja elementam ir piemērota mērogošanas transformācija. Pirmais skripts klausās rādītāja notikumus, lai izsekotu lietotāja vilkšanas mijiedarbību. Izmantojot getBoundingClientRect() metodi, tā aprēķina elementa sākotnējo pozīciju ekrānā. Tas ir būtiski, lai noteiktu, kur elements atrodas attiecībā pret skata logu, jo īpaši, ja skala nav 1, kas izraisa elementa darbību, kas atšķiras no tā sākotnējā izmēra.
Galvenā funkcionalitāte tiek apstrādāta dragElement funkcija, kas aprēķina kustības delta. Vilkšanas kustība tiek pielāgota, dalot rādītāja kustību ar mēroga koeficientu, lai nodrošinātu, ka attālums tiek precīzi kartēts pat tad, ja elements tiek palielināts vai samazināts. Šī metode palīdz novērst elementa "lēkšanu" vai nepareizu novietošanu vilkšanas darbību laikā. Pēc tam skripts piemēro šīs korekcijas, izmantojot transformācijas rekvizītu, vienlaikus izmantojot gan tulkošanas, gan mērogošanas funkcijas. Tas nodrošina elementa plūstošu kustību, vienlaikus saglabājot pārveidoto izmēru.
Papildu izaicinājums, kas risināts skriptā, ir nodrošināt, lai vilkšanas notikums tiktu pareizi notīrīts. Kad vilkšanas darbība ir pabeigta, notikumu uztvērēji tiek noņemti, izmantojot RemoveEventListener lai izvairītos no atmiņas noplūdēm un neparedzētas uzvedības. Tas garantē, ka skripts reaģē tikai nepieciešamības gadījumā, nodrošinot labāku veiktspēju un lietojamību. Turklāt, izmantojot setProperty() metode ļauj dinamiski pielāgot CSS mainīgos, uzlabojot elastību, kā vilkšanas mijiedarbību var veidot vai pielāgot, neiekodējot vērtības JavaScript.
Alternatīvā risinājumā vienību testu izmantošana ar console.assert() pievieno ieviešanai papildu validācijas slāni. Tas palīdz nodrošināt, ka aprēķini darbojas, kā paredzēts, jo īpaši mērogotā vidē. Pārbaudot vilkšanas darbības iznākumu pret iepriekš definētiem nosacījumiem, skripts nodrošina, ka tas apstrādā malas gadījumus, piemēram, nevienmērīgu mērogošanu vai dažādas iepriekš iestatītas nobīdes. Šī pieeja ne tikai uzlabo vilkšanas un nomešanas funkcionalitātes noturību, bet arī padara kodu modulārāku un atkārtoti lietojamu dažādos kontekstos.
Elementu pozīcijas apstrāde vilkšanas un mērogošanas laikā, izmantojot JavaScript
Šis risinājums izmanto tīru JavaScript vilkšanas un nomešanas apstrādei, pozīciju aprēķināšanai, vienlaikus mērogojot elementu, izmantojot pārveidošanas un tulkošanas rekvizītus.
let startX, startY, initialX, initialY, scale = 1;
const draggable = document.getElementById('draggable');
draggable.addEventListener('pointerdown', startDrag);
function startDrag(e) {
startX = e.clientX;
startY = e.clientY;
const rect = draggable.getBoundingClientRect();
initialX = rect.left;
initialY = rect.top;
document.addEventListener('pointermove', dragElement);
document.addEventListener('pointerup', stopDrag);
}
function dragElement(e) {
const deltaX = (e.clientX - startX) / scale;
const deltaY = (e.clientY - startY) / scale;
draggable.style.transform = `translate(${initialX + deltaX}px, ${initialY + deltaY}px) scale(${scale})`;
}
function stopDrag() {
document.removeEventListener('pointermove', dragElement);
document.removeEventListener('pointerup', stopDrag);
}
Alternatīvs risinājums, izmantojot CSS un JavaScript elementu mērogošanai
Šī alternatīvā pieeja izmanto CSS mainīgos, kas apvienoti ar JavaScript, lai dinamiski pielāgotu elementa pozīciju, kad tas tiek mērogots.
let startX, startY, initialX, initialY, scale = 1;
const draggable = document.getElementById('draggable');
draggable.addEventListener('pointerdown', startDrag);
function startDrag(e) {
startX = e.clientX;
startY = e.clientY;
const rect = draggable.getBoundingClientRect();
initialX = rect.left / scale;
initialY = rect.top / scale;
document.addEventListener('pointermove', dragElement);
document.addEventListener('pointerup', stopDrag);
}
function dragElement(e) {
const deltaX = (e.clientX - startX) / scale;
const deltaY = (e.clientY - startY) / scale;
draggable.style.setProperty('--x', initialX + deltaX + 'px');
draggable.style.setProperty('--y', initialY + deltaY + 'px');
}
function stopDrag() {
document.removeEventListener('pointermove', dragElement);
document.removeEventListener('pointerup', stopDrag);
}
Vienību testi vilkšanas un mērogošanas funkcionalitātes apstiprināšanai
Šajā sadaļā ir sniegti vienību testi, izmantojot JavaScript, lai pārbaudītu, vai vilkšanas un nomešanas funkcionalitāte darbojas pareizi ar mērogotiem elementiem.
function testDragWithScale() {
const element = document.createElement('div');
element.style.width = '100px';
element.style.height = '100px';
element.style.transform = 'scale(2)';
document.body.appendChild(element);
startDrag({clientX: 100, clientY: 100});
dragElement({clientX: 200, clientY: 200});
const computedTransform = getComputedStyle(element).transform;
console.assert(computedTransform.includes('translate(50px, 50px)'), 'Position adjusted correctly with scale');
}
testDragWithScale();
Elementu mērogošanas apstrāde vilkšanas un nomešanas funkcionalitātē
Kad runa ir par spēcīgas vilkšanas un nomešanas saskarnes izstrādi, ļoti svarīgi ir saprast, kā rīkoties ar tādām transformācijām kā mērogošana. Parasti, kad elements tiek vilkts, izmantojot tulkot funkcija JavaScript, to var pārvietot, pamatojoties uz peles koordinātām. Tomēr, ja elements tiek mērogots, izmantojot pārveidot: skala () īpašība, tās lielums un kustība mainās attiecībā pret sākotnējiem izmēriem. Pareizās pozīcijas aprēķināšanas atslēga ir nodrošināt, ka pozīcija tiek pielāgota mērogošanas koeficientam. Mēroga ignorēšana novedīs pie nepareizas pozicionēšanas un nepareizas uzvedības.
Lai pareizi apstrādātu mērogošanu, attālums, ko elements pārvietojas, ir jāsadala ar skalas vērtību. Tas nodrošina, ka elements pārvietojas proporcionāli kursoram, pat ja tā izmērs tiek palielināts vai samazināts. Izmantojot getBoundingClientRect() palīdz izmērīt elementa pašreizējos izmērus un aprēķināt nobīdes, pamatojoties uz skata loga pozīciju. Šīs nobīdes ir ļoti svarīgas elementa precīzai pozicionēšanai vilkšanas laikā. Turklāt, pielāgojot kustības deltas, lai ņemtu vērā mērogu, jūs izvairīsities no tādām problēmām kā elements, kas pārvietojas pārāk ātri vai lēni attiecībā pret kursoru.
Turklāt vilkšanas un nomešanas funkcionalitātes modularizācija ļauj to atkārtoti izmantot dažādos kontekstos. Šo modulāro pieeju var paplašināt, lai apstrādātu vairākus elementus, dažādus mērogus un pat lietotāja noteiktas nobīdes. Notikumu klausītāju izmantošana patīk addEventListener() nodrošina, ka vilkšanas darbība ir konsekventa dažādos ievades veidos, piemēram, pele, pieskāriens vai pildspalva. Precīzi apstrādājot gan mērogošanu, gan pozicionēšanu, jūs nodrošināsiet, ka vilkšanas un nomešanas interfeiss paliek intuitīvs un vienmērīgs neatkarīgi no tā, kā elements tiek pārveidots.
Bieži uzdotie jautājumi par mērogošanu un vilkšanu un nomešanu
- Kā mērogošana ietekmē vilkšanas un nomešanas pozicionēšanu?
- Mērogošana maina elementa izmēru, tāpēc, lai saglabātu pareizu pozicionēšanu, jums ir jāpielāgo kustība, dalot tulkojumu ar mēroga koeficientu. Tas nodrošina elementa pareizu kustību ar kursoru.
- Kāda loma getBoundingClientRect() spēlēt šajā?
- getBoundingClientRect() nodrošina pašreizējos elementa izmērus un pozīciju attiecībā pret skata logu, palīdzot aprēķināt precīzu kustību un nobīdes.
- Kā, velkot elementu, var ņemt vērā dažādas mēroga vērtības?
- Dalot kustības attālumu ar skalu, jūs varat nodrošināt, ka elementa kustība paliek proporcionāla tā izmēram. Varat arī izmantot setProperty() lai dinamiski atjauninātu CSS mainīgos, pamatojoties uz skalas vērtību.
- Vai es varu atkārtoti izmantot šo funkcionalitāti citiem elementiem?
- Jā, rakstot modulāru kodu un iekapsulējot vilkšanas un nomešanas loģiku atkārtoti lietojamās funkcijās, varat lietot vienu un to pašu funkcionalitāti vairākiem elementiem neatkarīgi no to mēroga vai transformācijas īpašībām.
- Kāpēc man vajadzētu lietot removeEventListener() pēc vilkšanas galiem?
- Izmantojot removeEventListener() novērš atmiņas noplūdes un nodrošina vilkšanas darbības apturēšanu, kad lietotājs atlaiž elementu. Tas uzlabo veiktspēju un nodrošina, ka notikumu klausītāji nav nevajadzīgi aktīvi.
Pēdējās domas par vilkšanas pārvaldību ar mērogošanu
Projektos, kuros velkamie elementi ir mērogoti, pareizās pozīcijas aprēķināšana kļūst sarežģīta. Lai pielāgotos gan skalai, gan sākuma pozīcijai, kustības koordinātas ir jāsadala ar mēroga koeficientu, nodrošinot precīzu kustību.
Iekļaujot dinamiskas metodes, piemēram, koordinātu pielāgošanu un ierobežojošo taisnstūra aprēķinus, varat nodrošināt viengabalainu vilkšanu un nomešanu. Šīs pieejas izmantošana dažādām mēroga vērtībām palīdz uzturēt vienmērīgu mijiedarbību un uzlabo lietotāja interfeisa konsekvenci.
Avoti un atsauces vilkšanai un nomešanai ar mērogošanu
- Šī raksta saturs ir balstīts uz JavaScript vilkšanas un nomešanas bibliotēku, kas izmanto tulkot funkcija un mērogs īpašums. Lai iegūtu praktisku ieviešanu, skatiet koda piemēru, kas pieejams vietnē CodeSandbox .
- Papildu vilkšanas un nomešanas funkcionalitāte un notikumu apstrāde tika minēta Mozilla izstrādātāju tīkla (MDN) dokumentācijā. Sīkāka informācija par getBoundingClientRect() var atrast šeit.
- Lai labāk izprastu JavaScript uzlabotās mērogošanas un pārveidošanas metodes, skatiet šo pamācību CSS transformācijas nodrošina W3Schools.