Професионални интернет зависник • Љубитељ игара • Технолошки креатор
Професионални интернет зависник • Љубитељ игара • Технолошки креатор

Šest stvari koje sam naučio o elastičnom skrolovanju u iOS Safariju

Da bih rešio problem sa skrolovanjem u Safariju na iOS-u, bio sam primoran da napravim svoju jednostavnu testnu stranicu!
Ову страницу су са енглеског језика превели моји високо мотивисани приправници за вештачку интелигенцију ради ваше удобности. Они још увек уче, тако да је могуће да је дошло до неких грешака. За најтачније информације, погледајте енглеску верзију.
Дом Blog Šest stvari koje sam naučio o elastičnom skrolovanju u iOS Safariju

Имајте у виду да је овај блог пост објављен у јуну 2015. године, тако да у зависности од тога када га читате, одређени делови могу бити застарели. Нажалост, не могу увек да ажурирам ове постове како бих осигурао да информације остану тачне.

Kako bih rešio nedavni problem sa skrolovanjem u Safariju na iOS-u, morao sam da napravim sopstvenu jednostavnu test-stranicu i zatim da primenim sve informacije i kombinacije koje sam mogao da nađem na internetu kako bih pokušao da rešim problem.

Evo kratkog pregleda onoga što sam otkrio tokom ovog procesa.

Moja testna stranica

Moja testna stranica bila je prilično jednostavna. Sastojala se od lažnih podataka u statičkom div-u koji predstavlja 'stranicu', uz fiksni div koji predstavlja preklopljeni 'meni' iznad stranice, kao što je ovo.

Snimak ekrana otvorenog HTML bočnog menija u iOS Safari-u

Kompletan izvorni kod stranice možete pronaći na dnu ovog blog posta.

Razumevanje podrazumevanog ponašanja

Prva stvar bila je da pokušam da razumem podrazumevano ponašanje Safarija na iOS-u. Najvažnije zapažanje bilo je da kada se skroluje do kraja menija, telo stranice pokazalo je 'efekat gumene trake' – ugrađena karakteristika Safarija.

animirani snimak problematičnog efekta elastičnog povlačenja u Safariju na iOS-u, na dnu stranice

Isto se desilo i kada sam skrolovao do samog vrha menija.

animirani snimak ekrana koji prikazuje problematičan rubber band efekat u iOS Safariju na vrhu stranice

Međutim, prvi problem koji sam primetio jeste da, ako se neprekidno pomerate do samog vrha ili dna stranice, Safari počinje da prikazuje vizuelne greške u pozadini stranice i u meniju.

Nisam siguran zašto, ali pretpostavljam da ima veze sa funkcijom gumene trake.

animirani snimak ekrana koji prikazuje problem sa iOS Safari-om na dnu stranice

Razumevanje šta radi CSS pravilo "-webkit-overflow-scrolling"

Sledeća stvar koju sam uradio bila je primena CSS pravila -webkit-overflow-scrolling na meniju, koje omogućava klizanje uz momentum.

Kao što je prikazano na slici ispod, skrolovanje se nastavlja čak i nakon što prevučem prstom po ekranu.

prikaz problema sa skrolovanjem zasnovanim na momentumu na iOS Safariju

Ali takođe dodaje efekat gumene trake kada se skroluje do samog vrha ili dna stranice, kao što je prikazano ispod.

prikaz problema sa skrolovanjem zasnovanim na momentumu na iOS Safariju uz efekat gumene trake

Korisnik treba da sačeka dok se efekat elastičnog vraćanja završi

Tokom testiranja primetio sam da, dok traje rubber-band efekat, korisnik ne može prebaciti fokus na drugi element sve dok animacija u potpunosti ne završi.

U donjem primeru, prvo skrolujem pozadinsku stranicu, a zatim brzo pokušavam da skrolujem meni, ali na kraju nastavim da skrolujem pozadinsku stranicu.

pokazuje da se pozadinska stranica skroluje na iOS Safariju

Međutim, ako sačekam trenutak da efekat završi, onda mogu početi da skrolujem kroz meni.

prikazivanje čekanja dok se završava efekat elastičnog odziva na iOS Safari

Kako sprečiti da pozadinska stranica skroluje

Tokom testiranja primetio sam i da, dok traje rubber-band efekat, korisnik ne može da premesti fokus na drugi element sve dok se animacija potpuno ne završi.

Na osnovu ovog odgovora sa Stack Overflow, možete osigurati da elementi sa disable-scrolling ne izvrše podrazumevanu akciju skrolovanja kada se pokrene događaj touchmove.

document.ontouchmove = function(event) { var isTouchMoveAllowed = true, target = event.target; while (target !== null) { if (target.classList && target.classList.contains('disable-scrolling')) { isTouchMoveAllowed = false; break; } target = target.parentNode; } if (!isTouchMoveAllowed) { event.preventDefault(); } };

Zatim primenite klasu disable-scrolling na div stranice:

<div class="page disable-scrolling">

Ovo nekako funkcioniše, ali detaljnija testiranja pokazuju da pozadinska stranica i dalje ponekad može da se pomeri kada dođete do samog vrha ili dna menija.

pokazuje da se pozadina još uvek skroluje

Kako sprečiti prekomerno skrolovanje na pozadinskoj stranici

Primjenom ovog rešenje, postaje moguće sprečiti "overscrolling". To znači da kada je element skrolovan do samog vrha ili dna, skrolovanje ne prelazi u telo stranice.

Kao rezultat toga, telo stranice se sprečava da se pomera tokom skrolovanja, čime se onemogućava i efekat elastičnog vraćanja (rubber-band efekat).

function removeIOSRubberEffect(element) { element.addEventListener("touchstart", function() { var top = element.scrollTop, totalScroll = element.scrollHeight, currentScroll = top + element.offsetHeight; if (top === 0) { element.scrollTop = 1; } else if (currentScroll === totalScroll) { element.scrollTop = top - 1; } }); } removeIOSRubberEffect(document.querySelector(".scrollable"));

Ovaj JavaScript primer sprečava da element stigne do samog vrha ili dna tako što ga održava 1 piksel udaljenim.

Ako pozicija skrolovanja nikada ne dosegne apsolutni vrh ili dno, overskrolovanje nije moguće.

primer sprečavanja prekomernog skrolovanja tako što se nikada ne prelazi do samog vrha ili do samog kraja

Kako sprečiti prelazak na pozadinsku stranicu prilikom skrolovanja preko kraja stranice

Ako želite da uklonite efekat gumene trake iz menija — bilo iz estetskih razloga ili zato što je, kao i u mom slučaju, prouzrokovao dodatne greške pri renderovanju — jednostavno uklonite CSS pravilo -webkit-overflow-scrolling.

Međutim, kao što vidite ispod, takođe gubite inerciju glatkog skrolovanja.

potpuni prikaz kako sprečiti rubberbanding efekat na iOS Safariju

Ceo izvorni kod stranice

Evo celog izvornog koda stranice.

<!-- License MIT, Author Special Agent Squeaky (specialagentsqueaky.com) --> <!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="minimum-scale=1.0, width=device-width, maximum-scale=1.0, user-scalable=no, initial-scale=1"> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <style> .page{ font-size: 24px; overflow: scroll; } .menu{ position: fixed; top: 0; bottom: 0; left: 0; width: 80%; background: gray; z-index: 1; font-size: 10px; overflow: scroll; /* uncomment to get smooth momentum scroll, but also a rubber band effect */ /*-webkit-overflow-scrolling: touch;*/ } .menu-item{ padding: 10px; background: darkgray; font-size: 24px; } </style> </head> <body> <div class="menu scrollable"> <div class="menu-item">hello world</div> <div class="menu-item">hello world</div> <div class="menu-item">hello world</div> <div class="menu-item">hello world</div> <div class="menu-item">hello world</div> <div class="menu-item">hello world</div> <div class="menu-item">hello world</div> <div class="menu-item">hello world</div> <div class="menu-item">hello world</div> <div class="menu-item">hello world</div> <div class="menu-item">hello world</div> <div class="menu-item">hello world</div> <div class="menu-item">hello world</div> <div class="menu-item">hello world</div> <div class="menu-item">hello world</div> <div class="menu-item">hello world</div> <div class="menu-item">hello world</div> <div class="menu-item">hello world</div> </div> <div class="page disable-scrolling"> Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum. </div> <script> document.ontouchmove = function(event) { var isTouchMoveAllowed = true, target = event.target; while (target !== null) { if (target.classList && target.classList.contains('disable-scrolling')) { isTouchMoveAllowed = false; break; } target = target.parentNode; } if (!isTouchMoveAllowed) { event.preventDefault(); } }; function removeIOSRubberEffect(element) { element.addEventListener("touchstart", function() { var top = element.scrollTop, totalScroll = element.scrollHeight, currentScroll = top + element.offsetHeight; if (top === 0) { element.scrollTop = 1; } else if (currentScroll === totalScroll) { element.scrollTop = top - 1; } }); } removeIOSRubberEffect(document.querySelector(".scrollable")); </script> </body> </html>

Написао/ла Special Agent Squeaky. Прво објављено 10.06.2015. Последње ажурирање 10.06.2015.

📺 Pogledajte najnoviji video Squeakyja!

Kako dodati jednostavne titlove u realnom vremenu vašem prenosu uživo