Nuvilkite ir numeskite naudodami mastelio keitimą „JavaScript“.
Sukurti sklandų ir greitą nuvilkimo patirtį gali būti sudėtinga, ypač kai reikia keisti, pvz., mastelio keitimą. Jei naudojate transformuoti: translate () elementų judėjimo savybė, pridėjus mastelį prie elemento, bus paveiktas jo dydis ir padėtis, todėl skaičiavimai nutrūks.
Pagal šį scenarijų paprasčiausiai pakoregavus padėtį naudojant pelės judėjimo koordinates, laukiamas rezultatas neduos, nes pakeistas elementas nebejuda taip, kaip būtų pradinio dydžio. Dėl to kyla problemų apskaičiuojant teisinga elemento padėtis tempimo metu.
Nesvarbu, ar kuriate pasirinktinę nuvilkimo biblioteką, ar integruojate šią funkciją į savo projektą, labai svarbu suprasti, kaip teisingai apskaičiuoti pozicijas, kai taikomas mastelio keitimas. Turite pakoreguoti kodą, kad atsižvelgtumėte į skalės vertę, kad užtikrintumėte tikslią elementų vietą.
Šiame straipsnyje bus paaiškinta, kaip apskaičiuoti teisingą elemento padėtį vilkimo metu naudojant išversti metodas „JavaScript“, naudojant mastelio keitimą. Taip pat atliksime veiksmus ir formules, kurias reikia pritaikyti prie elemento mastelio ir užtikrinti sklandų tempimą.
komandą | Naudojimo pavyzdys |
---|---|
getBoundingClientRect() | Šis metodas grąžina elemento dydį ir padėtį peržiūros srities atžvilgiu. Jis naudojamas tikslioms nuvilkto elemento koordinatėms gauti, ypač kai taikomos mastelio transformacijos. |
addEventListener('pointerdown') | Prie elemento prideda konkretų įvykių tvarkyklę. Šiuo atveju jis naudojamas aptikti, kada vartotojas pradeda vilkimą spustelėdamas arba paliesdamas elementą. |
setProperty() | Šis metodas naudojamas dinamiškai atnaujinti CSS kintamuosius. Pavyzdyje jis koreguoja pasirinktines ypatybes --x ir --y, kad atnaujintų vilkimo padėtį pagal mastelį. |
removeEventListener() | Šis metodas pašalina anksčiau pridėtus įvykių klausytojus. Tai būtina norint išvalyti po vilkimo, pašalinti žymeklio ir žymeklio klausytojus, kad būtų išvengta atminties nutekėjimo. |
clientX / clientY | Šios savybės grąžina pelės žymeklio X ir Y koordinates peržiūros srities atžvilgiu. Jie yra labai svarbūs norint sekti žymeklio padėtį vilkimo operacijos metu. |
scale() | Tai yra CSS transformacijos funkcijos dalis. Jis koreguoja velkamo elemento dydį, išsaugant kitas transformavimo savybes, pvz., vertimą, užtikrinant teisingą mastelį vilkimo metu. |
console.assert() | Šis metodas naudojamas scenarijaus vienetų testavimui. Jis patvirtina, ar tenkinamos tam tikros sąlygos, pvz., patikrinama, ar išversta padėtis teisingai apskaičiuota po vilkimo įvykio su mastelio keitimu. |
transform | Ši CSS ypatybė elementui taiko kelias transformavimo funkcijas (pvz., vertimą ir mastelį). Jis naudojamas norint atnaujinti vaizdinę elemento padėtį ir dydį vilkimo ir mastelio keitimo metu. |
Supratimas, kaip tvarkyti elemento padėtį naudojant vertimą ir mastelį
Pateiktais scenarijais siekiama išspręsti dažnai pasitaikančias problemas, susijusias su vilkimo funkcija naudojant išversti metodas „JavaScript“, ypač kai elementui taikoma mastelio transformacija. Pirmasis scenarijus klausosi žymeklio įvykių, kad galėtų sekti vartotojo vilkimo sąveiką. Naudodami getBoundingClientRect() metodu, jis apskaičiuoja pradinę elemento padėtį ekrane. Tai būtina norint nustatyti, kur elementas yra peržiūros srities atžvilgiu, ypač kai skalė nėra 1, todėl elementas elgiasi kitaip nei pradinis dydis.
Pagrindinės funkcijos tvarkomos viduje dragElement funkcija, kuri apskaičiuoja judėjimo delta. Vilkimo judesys reguliuojamas padalijus žymeklio judėjimą iš mastelio koeficiento, kad atstumas būtų tiksliai pažymėtas net tada, kai elementas yra padidintas arba sumažintas. Šis metodas padeda išvengti elemento „šokinėjimo“ arba netinkamos vietos vilkimo metu. Tada scenarijus taiko šiuos koregavimus naudodamas transformavimo ypatybę, kartu naudodamas ir vertimo, ir mastelio funkcijas. Tai užtikrina, kad elementas judėtų sklandžiai, išlaikant transformuotą dydį.
Papildomas iššūkis, sprendžiamas scenarijuje, yra užtikrinti, kad vilkimo įvykis būtų tinkamai išvalytas. Atlikus vilkimo veiksmą, įvykių klausytojai pašalinami naudojant PašalintiEventListener kad išvengtumėte atminties nutekėjimo ir netyčinio elgesio. Tai garantuoja, kad scenarijus reaguos tik tada, kai reikia, užtikrindamas geresnį našumą ir patogumą. Be to, naudojant setProperty() Metodas leidžia dinamiškai koreguoti CSS kintamuosius, didinant lankstumą, kaip vilkimo sąveikos gali būti stilizuojamos arba tinkinamos neįkoduojant verčių į JavaScript.
Alternatyvaus sprendimo atveju naudojami vienetiniai bandymai su console.assert() prideda papildomą diegimo patvirtinimo sluoksnį. Tai padeda užtikrinti, kad skaičiavimai veiktų taip, kaip tikėtasi, ypač mastelio aplinkoje. Išbandydamas vilkimo operacijos rezultatą pagal iš anksto nustatytas sąlygas, scenarijus užtikrina, kad jis tvarko kraštutinius atvejus, pvz., nevienodą mastelio keitimą arba skirtingus iš anksto nustatytus poslinkius. Šis metodas ne tik pagerina vilkimo ir numetimo funkcijos patikimumą, bet ir daro kodą labiau moduliuotą ir galimą pakartotinai naudoti įvairiuose kontekstuose.
Elemento padėties tvarkymas vilkimo ir mastelio keitimo metu naudojant „JavaScript“.
Šiame sprendime naudojamas grynas „JavaScript“ tvarkymui vilkti ir nuleisti, skaičiuojant pozicijas ir keičiant elemento mastelį naudojant transformavimo ir vertimo savybes.
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);
}
Alternatyvus sprendimas naudojant CSS ir JavaScript elementų mastelio keitimui
Šis alternatyvus metodas naudoja CSS kintamuosius kartu su „JavaScript“, kad dinamiškai koreguotų elemento padėtį, kai jis keičiamas.
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);
}
Vienetų testai vilkimo ir mastelio funkcionalumui patvirtinti
Šiame skyriuje pateikiami vienetų testai naudojant „JavaScript“, siekiant patvirtinti, kad vilkimo funkcija tinkamai veikia su pakeistais elementais.
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();
Elementų mastelio keitimas naudojant vilkimo ir numetimo funkciją
Kuriant tvirtą nuvilkimo sąsają, labai svarbu suprasti, kaip elgtis su transformacijomis, pvz., mastelio keitimu. Paprastai, kai elementas tempiamas naudojant išversti funkcija JavaScript, ją galima perkelti pagal pelės koordinates. Tačiau kai elemento mastelis keičiamas naudojant transformuoti: skalė () savybės, jos dydis ir judėjimas keičiasi, palyginti su pradiniais matmenimis. Norint apskaičiuoti teisingą padėtį, svarbiausia yra užtikrinti, kad padėtis būtų pritaikyta mastelio koeficientui. Jei nepaisysite mastelio, bus neteisinga padėtis ir elgsis nepastovus.
Norėdami tinkamai valdyti mastelio keitimą, atstumą, kurį elementas juda, turite padalyti iš skalės vertės. Tai užtikrina, kad elementas judėtų proporcingai su žymekliu, net kai jo dydis padidinamas arba sumažinamas. Naudojant getBoundingClientRect() padeda išmatuoti esamus elemento matmenis ir apskaičiuoti poslinkius pagal peržiūros srities padėtį. Šie poslinkiai yra labai svarbūs norint tiksliai nustatyti elemento padėtį vilkimo metu. Be to, koreguodami judėjimo deltas, kad būtų atsižvelgta į mastelį, išvengsite problemų, pvz., elemento judėjimo per greitai arba lėtai, palyginti su žymekliu.
Be to, nuvilkimo funkcijos moduliavimas leidžia pakartotinai naudoti įvairiuose kontekstuose. Šis modulinis metodas gali būti išplėstas, kad būtų galima apdoroti kelis elementus, skirtingus mastelius ir net vartotojo nustatytus poslinkius. Įvykių klausytojų naudojimas patinka addEventListener() užtikrina, kad vilkimas būtų nuoseklus naudojant skirtingus įvesties tipus, pvz., pelę, lietimą ar rašiklį. Tiksliai tvarkydami mastelį ir padėties nustatymą, užtikrinate, kad vilkimo sąsaja išliks intuityvi ir sklandi, nepaisant to, kaip elementas transformuojamas.
Dažni klausimai apie mastelio keitimą ir nuvilkimą
- Kaip mastelio keitimas veikia vilkimo ir numetimo padėties nustatymą?
- Mastelio keitimas keičia elemento dydį, todėl norint išlaikyti tinkamą padėtį, reikia pakoreguoti judesį padalydami vertimą iš mastelio koeficiento. Tai užtikrina, kad elementas judėtų teisingai su žymekliu.
- Koks vaidmuo getBoundingClientRect() žaisti tai?
- getBoundingClientRect() pateikia dabartinius elemento matmenis ir padėtį peržiūros srities atžvilgiu, padeda apskaičiuoti tikslų judėjimą ir poslinkius.
- Kaip galiu atsižvelgti į skirtingas mastelio reikšmes vilkdamas elementą?
- Padalinę judėjimo atstumą iš skalės, galite užtikrinti, kad elemento judėjimas išliktų proporcingas jo dydžiui. Taip pat galite naudoti setProperty() dinamiškai atnaujinti CSS kintamuosius pagal skalės reikšmę.
- Ar galiu pakartotinai panaudoti šią funkciją kitiems elementams?
- Taip, rašydami modulinį kodą ir įtraukę vilkimo logiką į daugkartinio naudojimo funkcijas, galite taikyti tą pačią funkciją keliems elementams, neatsižvelgiant į jų mastelį ar transformavimo savybes.
- Kodėl turėčiau naudoti removeEventListener() po vilkimo baigiasi?
- Naudojant removeEventListener() apsaugo nuo atminties nutekėjimo ir užtikrina, kad vilkimas sustos, kai vartotojas atleidžia elementą. Tai pagerina našumą ir užtikrina, kad įvykių klausytojai nebūtų be reikalo aktyvūs.
Paskutinės mintys apie vilkimo valdymą naudojant mastelio keitimą
Projektuose, kuriuose tempiami elementai yra keičiami, teisingos padėties apskaičiavimas tampa sudėtingas. Norint reguliuoti tiek mastelį, tiek pradinę padėtį, judėjimo koordinates reikia padalinti iš mastelio koeficiento, užtikrinant tikslų judėjimą.
Naudodami dinaminius metodus, pvz., koordinačių koregavimą ir ribojančio stačiakampio skaičiavimus, galite pasiekti sklandų vilkimą ir numetimą. Šio metodo taikymas įvairiose masto reikšmėse padeda palaikyti sklandžią sąveiką ir pagerina vartotojo sąsajos nuoseklumą.
Vilkimo ir mastelio keitimo šaltiniai ir nuorodos
- Šio straipsnio turinys pagrįstas „JavaScript“ nuvilkimo biblioteka, kuri naudoja išversti funkcija ir mastelis nuosavybė. Praktinio įgyvendinimo ieškokite kodo pavyzdyje, kurį rasite adresu CodeSandbox .
- „Mozilla“ kūrėjų tinklo (MDN) dokumentacijoje buvo nurodytos papildomos nuvilkimo funkcijos ir įvykių tvarkymas. Daugiau informacijos apie getBoundingClientRect() galima rasti čia.
- Norėdami geriau suprasti išplėstinius mastelio keitimo ir transformavimo metodus „JavaScript“, žr. šią mokymo programą CSS transformacijos teikia W3Schools.