• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Animacja przewijania w czystym JS z systemem start/stop

Object Storage Arubacloud
+1 głos
423 wizyt
pytanie zadane 8 września 2020 w JavaScript przez Grzegorz Mikina Dyskutant (8,060 p.)

Mam takie pytanie, mam strone której scrollMaxY wynosi 5680 i chcę żeby po dodaniu klasy pauza i odjęciu klasy play gdzie zmienia mi się backgroundImage zgodnie z nazwami, zostało uruchomione przewijanie, ale tak by po ponownym kliknięciu w przycisk zostało zatrzymane w miejscu w którym zostało to kliknięte później po ponownym uruchomieniu rusza od miejsca scrollY i jedzie dalej do tej pozycji to jest 5680 to koniec strony, sekcja kontakt.

Próbowałem już zastosować setInterval , setTimeout ale nie przynosi to zamierzonego efektu, działa to na zasadzie stepsów, chcę żeby było to płynne przejście. A nie przewinięcie na zasadzie skoku do punktu.
Jak się do tego zabrać? Proszę o jakąś podpowiedź.Myślałem jeszcze o keyframes aniomation-play-state? Czy sądzicie że ta opcja jest najlepszą z możliwych.

jQuery niedługo ma zniknąć z tego co słyszałem, nie wiem ile w tym prawdy, ale tak mówił znajomy i żeby z tego zrezygnować.

//Przełączanie tła w panelu kontrolnym animacji i pojawienie się strzałki do góry //przy osiągnięciu określonej pozycji scrollY od góry strony.

const player = document.getElementById("btn2");
const stopped = document.getElementById("btn3");
const play = document.querySelector(".play");
const pauza = document.querySelector(".pauza");
const stop = document.querySelector(".stop");
const ostop = document.querySelector(".ostop");
const bTT = document.querySelector("btn5")


btn2.addEventListener("click", function () {
  btn2.classList.toggle("pauza");
  btn2.classList.toggle("play");
  btn3.classList.toggle("email");
  // btn3.classList.toggle("ostop");
})

btn3.addEventListener("click", function () {
  if (btn3.classList == "email") {
    btn3.classList.remove("email");
    btn3.classList.add("oemail");
    window.scrollTo(0, document.body.scrollHeight);
  }
})

document.addEventListener("scroll", function () {
  // console.log(scrollY);
  // console.log(scrollMaxY);
  if (scrollY < 4000) {
    // console.log("jestem poniżej 4000")
    btn5.classList.add("cover");

  }
  if (scrollY > 4000) {
    // console.log("jestem ponad 4000")
    btn5.classList.remove("cover");
  }
})

window.addEventListener("scroll", function () {})
//Powrót do góry po kliknięciu w strzałeczkę z klasą która pojawia się przy określonej pozycji

function scrollToTop(duration) {
  // cancel if already on top
  
  if (document.scrollingElement.scrollTop === 0) return;

  const cosParameter = document.scrollingElement.scrollTop / 2;
  let scrollCount = 0,
    oldTimestamp = null;

  function step(newTimestamp) {
    if (oldTimestamp !== null) {
      // if duration is 0 scrollCount will be Infinity
      scrollCount += Math.PI * (newTimestamp - oldTimestamp) / duration;
      if (scrollCount >= Math.PI) return document.scrollingElement.scrollTop = 0;
      document.scrollingElement.scrollTop = cosParameter + cosParameter * Math.cos(scrollCount);
    }
    oldTimestamp = newTimestamp;
    window.requestAnimationFrame(step);
  }
  window.requestAnimationFrame(step);
}
 // Sekcja controll odpowiedzialna za sterowanie
<div id="controll clearfix">
        <div id="btn2" class="play" >
        </div>
        <div id="btn3" class="stop">
          <!-- <div id="btn3" class="email"> -->
        </div>
        <div id="btn5" onclick="scrollToTop(2000);" class="btn5 topArrow cover">
        </div>



 

komentarz 8 września 2020 przez senpai desu Mądrala (5,720 p.)
przeniesione 8 września 2020 przez ScriptyChris
jQuery  nie zniknie i zawsze będzie można go użyć, dużo mechanizmów zostało wbudowanych w przeglądarki i we frameworki frontendowe, dlatego pojawiło się przekonanie, że zaraz zniknie, jeśli robisz prostą stronę i nie masz zamiaru korzystać z frameworków śmiało korzystaj z jQuery

1 odpowiedź

0 głosów
odpowiedź 8 września 2020 przez VBService Ekspert (254,480 p.)
wybrane 9 września 2020 przez Grzegorz Mikina
 
Najlepsza

Smooth Scrolling - może da się do tego przykładu dodać przycisk start - stop.

 

1
komentarz 8 września 2020 przez Grzegorz Mikina Dyskutant (8,060 p.)
Widziałem gdzie ten Smooth Scrolling, ale jakoś specjalnie nie zwróciłem na niego uwagi. Myslę że bez problemu uda mi się go wykorzystać. Traktuję przycisk jak diva, więc dlaczego nie? Jeżeli mi się uda, wkleję tu kod i dam naj. To do roboty! :)
komentarz 8 września 2020 przez ScriptyChris Mędrzec (190,190 p.)

Dlaczego traktujesz przycisk jak div? Czemu nie użyjesz elementu <button>?

1
komentarz 8 września 2020 przez Grzegorz Mikina Dyskutant (8,060 p.)
Ponieważ używam bgc image a w buttonie ciężko to ostylować przynajmniej jak dla mnie.
komentarz 8 września 2020 przez ScriptyChris Mędrzec (190,190 p.)
Co konkretnie jest Ci trudno ostylować?
komentarz 8 września 2020 przez Grzegorz Mikina Dyskutant (8,060 p.)
<button></button>
Dlaczego nie mogę traktować wg. Ciebie jako diva? Przecież to tak samo działa, gorzej button ostylować.
komentarz 8 września 2020 przez ScriptyChris Mędrzec (190,190 p.)

Bo rolą <div>a nie jest bycie przyciskiem - to kontener na inne elementy. W jaki sposób chciałbyś np. obsłużyć focus, blokadę lub stan przyciśnięcia dla "przycisko-diva"?

Nie opisałeś, jakie masz problemy z ostylowaniem przycisku.

komentarz 9 września 2020 przez Grzegorz Mikina Dyskutant (8,060 p.)

Panowie mam animacje która działa, nawet działa tak jak należy.
Jednak nie mogę jej zwolnić i nie wiem jak tego dokonać...
 

const btn2 = document.getElementById("btn2");
// Scroll to specific values
// scrollTo is the same
// window.scroll({
//   top: 2500,
//   left: 0,
//   behavior: 'smooth',
//   duration: 5000,
// });

// Scroll certain amounts from current position 
// window.scrollBy({
//   top: 3680, // could be negative value
//   left: 0,
//   behavior: 'smooth',

// });
btn2.addEventListener("click", function () {
  if (btn2.classList == "pauza") window.scrollBy({
    top: scrollMaxY, // could be negative value
    left: 0,
    behavior: 'smooth',
    duration: 5000,
  });
  else {
    window.scroll({
      top: scrollY,
      left: 0,
      behavior: 'smooth',
      duration: 5000, // BRAK JAKIEGOKOLWIEK EFEKTU
    });
  }
})
// Scroll to a certain element
document.querySelector('btn2').scrollIntoView({
  behavior: 'smooth'

});

* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;

}

html {
  scroll-behavior: smooth;
  transition-duration: 5s;
}

 

komentarz 9 września 2020 przez Grzegorz Mikina Dyskutant (8,060 p.)
Chcę żeby to wszystko działo się 5 razy wolniej.
komentarz 10 września 2020 przez VBService Ekspert (254,480 p.)

Na chwilę obecną, oficjalnie nie ma jeszcze takiej funkcjonalności: scroll-behavior, chyba że ktoś napisał "obejście", ale Ja takowego póki co nie znalazłem.

komentarz 10 września 2020 przez Grzegorz Mikina Dyskutant (8,060 p.)
scroll behavior to jakieś moje przeoczenie, ja to widzę tak, trzeba stworzyć funkcję czasu w trakcie trwania której będzie możliwe przewinięcie strony w jakimś czasie gdy to zatrzymuję, czas staje, strona staje. Ruszam, czas rusza, funkcja rusza i odmierza czas do końca. I zmierza do jakiegoś scrollMaxY, tak żeby nie było to ustawione na sztywno.
komentarz 10 września 2020 przez Grzegorz Mikina Dyskutant (8,060 p.)
Myśle że setTimeout będzie rozwiązaniem.
1
komentarz 10 września 2020 przez Grzegorz Mikina Dyskutant (8,060 p.)
Wrzucę kod Js gdy go już napiszę.
komentarz 10 września 2020 przez Grzegorz Mikina Dyskutant (8,060 p.)

Podobne pytania

+1 głos
2 odpowiedzi 139 wizyt
+1 głos
3 odpowiedzi 488 wizyt
pytanie zadane 23 września 2017 w HTML i CSS przez mola85 Początkujący (320 p.)
0 głosów
0 odpowiedzi 266 wizyt
pytanie zadane 9 kwietnia 2020 w JavaScript przez Whynotslave Początkujący (250 p.)

92,631 zapytań

141,498 odpowiedzi

319,869 komentarzy

62,011 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...