logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Jak użyć Animate.css do animacji obiektów podczas przewijania strony?

malum 28 Mar 2025 11:21 405 10
REKLAMA
  • #1 21498690
    malum
    Poziom 23  
    Posty: 882
    Pomógł: 1
    Ocena: 141
    Witam.
    Zainteresowało mnie zagadnienie animowania obiektów podczas przewijania strony.
    Trafiłem na bardzo fajną bibliotekę Animate.css (https://animate.style/).
    Animacje działają świetnie podczas ładowania strony. Nie mogę jednak poradzić sobie z zastosowaniem tych animacji do przewijania strony, chodzi o taki efekt, że obiekty animują się dopiero wtedy, gdy zaczynają pojawiać się na ekranie i gdy z niego zaczynają znikać.
    Jak to ogarnąć?
  • REKLAMA
  • #2 21498841
    Damian_Max
    Poziom 21  
    Posty: 395
    Pomógł: 40
    Ocena: 96
    A co już próbowałeś(?), przygotuj przykład w piaskownicy https://jsfiddle.net/ lub https://codepen.io/
    wtedy łatwo będzie można go spróbować rozszerzyć o brakującą część.

    Efekty tej biblioteki wyglądają fajnie :-)
  • REKLAMA
  • #3 21498872
    malum
    Poziom 23  
    Posty: 882
    Pomógł: 1
    Ocena: 141
    Damian_Max napisał:
    A co już próbowałeś(?), przygotuj przykład w piaskownicy https://jsfiddle.net/ lub https://codepen.io/
    wtedy łatwo będzie można go spróbować rozszerzyć o brakującą część.

    Efekty tej biblioteki wyglądają fajnie :-)


    Właśnie też na to wpadłem, za kilka chwil będzie przykład.

    Poniżej plik z animacjami. Wszystkie uruchamiają się po załadowaniu strony, nawet te niewidoczne.

    Kod: HTML, XML
    Zaloguj się, aby zobaczyć kod
    Załączniki:
    • animacja.zip (642 Bajtów) Musisz być zalogowany, aby pobrać ten załącznik.
  • #4 21499001
    Damian_Max
    Poziom 21  
    Posty: 395
    Pomógł: 40
    Ocena: 96
    To możesz podpiąć się pod event onscroll i na podstawie pozycji obiektu dodać / usunąć mu jakąś klase.
    Czyli w html masz kontenery z klasą np: 'todo', która może mieć ustawione 'display: none',
    a w obsłudze onscroll usunąć tamtą klasę i dodać te od animacji.

    Wydmuszkę tego rozwiązania masz tutaj: https://jsfiddle.net/d9peL6j1/
  • REKLAMA
  • #5 21499428
    malum
    Poziom 23  
    Posty: 882
    Pomógł: 1
    Ocena: 141
    Damian_Max napisał:
    Wydmuszkę tego rozwiązania masz tutaj: https://jsfiddle.net/d9peL6j1/

    Dzięki @Damian_Max za podpowiedź. Częściowo rozwiązuje to mój problem, ale skrypt działa jedynie jeden raz podczas pierwszego przewijania, później animacje się nie aktywują. Poza tym animacja włącza się jedynie przy wejściu, ale przy wyjściu już nie.
    Szczerze mówiąc w JS jestem noga i raczej nie ogarnę przerobienia Twojego przykładu.
  • REKLAMA
  • #6 21499499
    kjoxa
    Poziom 23  
    Posty: 599
    Pomógł: 45
    Ocena: 236
    Przecież Chat GPT to ogarnie za jednego, ładnego prompta.
  • Pomocny post
    #7 21499532
    Damian_Max
    Poziom 21  
    Posty: 395
    Pomógł: 40
    Ocena: 96
    @kjoxa Hm.. tak myślisz? W sumie powinien, zaraz sprawdzimy xD.

    W każdym razie wyklikałem z ciekawości coś na kolanie, jest tutaj: https://jsfiddle.net/7mv39frt/
    dodam że to ręcznie robione; wiec ma podwójną (wróć, co taką samą wartość), @malum nie hamuj się kliknąć 'pomógł' xD

    @ElektrodaBot: Hej bocie, pomóż koledze @malum, z takim problemen:
    malum napisał:
    Witam.
    Zainteresowało mnie zagadnienie animowania obiektów podczas przewijania strony.
    Trafiłem na bardzo fajną bibliotekę Animate.css (https://animate.style/).
    Animacje działają świetnie podczas ładowania strony. Nie mogę jednak poradzić sobie z zastosowaniem tych animacji do przewijania strony, chodzi o taki efekt, że obiekty animują się dopiero wtedy, gdy zaczynają pojawiać się na ekranie i gdy z niego zaczynają znikać.
    Jak to ogarnąć?
  • #8 21499534
    ElektrodaBot
    AI od OpenAI ChatGPT4
    Posty: 8812
    Pomógł: 357
    Ocena: 937
    Damian_Max napisał:
    @kjoxa Hm.. tak myślisz? W sumie powinien, zaraz sprawdzimy xD.

    W każdym razie wyklikałem z ciekawości coś na kolanie, jest tutaj: https://jsfiddle.net/7mv39frt/
    dodam że to ręcznie robione; wiec ma podwójną (wróć, co taką samą wartość), @malum nie hamuj się kliknąć 'pomógł' xD

    @ElektrodaBot: Hej bocie, pomóż koledze @malum, z takim problemen:
    Bezpośrednia odpowiedź na pytanie
    Na tym etapie trudno stwierdzić, z jakim konkretnie problemem boryka się użytkownik @malum, ponieważ brak jest szczegółowego opisu celu kodu i napotkanych trudności. Udostępniony link do JSFiddle (https://jsfiddle.net/7mv39frt/) wskazuje jedynie na fragment kodu JavaScript, lecz nie wiadomo:
    - Jaki jest zamierzony efekt działania tego kodu?
    - Co aktualnie działa niepoprawnie lub wymaga poprawy?

    Aby pomóc w rozwiązaniu problemu, konieczne jest doprecyzowanie celu oraz określenie, co dokładnie nie działa zgodnie z oczekiwaniami.

    Szczegółowa analiza problemu

    1. Brak kontekstu funkcjonalnego
    – Nie wiadomo, czy kod dotyczy obliczeń, zapisu stanu aplikacji, czy interakcji z elementami DOM.
    – Nie jest jasne, czy pojawiają się jakiekolwiek błędy w konsoli przeglądarki (np. ReferenceError, TypeError).

    2. Parametry środowiska
    – JSFiddle uruchamia domyślnie skrypty „onLoad” (zależnie od wybranej konfiguracji „Load type”), co może powodować problemy, jeśli potrzebujesz innego trybu wykonania kodu („no wrap”, „in <head>” itp.).
    – Czasami niespójność między HTML, CSS a JavaScript w ramach jednego fiddla powoduje brak prawidłowego działania.

    3. Struktura kodu
    – Być może w kodzie brakuje inicjalizacji zmiennych.
    – Może zaistniała kolizja nazw zmiennych, funkcji lub problem z zasięgiem (scope) w JavaScript.

    4. Użycie wartości „podwójnych”
    – Pojawia się wzmianka o „podwójnej wartości” bądź „tej samej wartości”. Czy chodzi o błąd logiczny, np. wielokrotne naliczanie tego samego parametru?

    5. Brak informacji o błędach
    – Warto sprawdzić konsolę przeglądarki w zakładce „Console” (np. w Chrome Developer Tools, Firefox DevTools, itp.) i zweryfikować komunikaty ostrzeżeń lub błędów.

    Pytania do użytkownika
    1. Jaki jest główny cel Twojego kodu w JSFiddle?
    2. Czy napotkałeś konkretne komunikaty błędów w konsoli przeglądarki? Jeśli tak, jakie?
    3. Czy możesz opisać, co *miało się wydarzyć*, a co dzieje się *naprawdę* podczas uruchamiania kodu?
    4. Czy kod ma związek z obsługą mikrokontrolera, komunikacją z urządzeniami, czy jest to czysto front-endowe rozwiązanie w JavaScript?

    Zachęcam do uzupełnienia informacji. Po otrzymaniu dodatkowych detali będzie można przeprowadzić dokładniejszą analizę i zaproponować konkretne sposoby rozwiązania problemu.
    Możesz mnie wywołać w każdym temacie pisząc @ElektrodaBot. Zastrzeżenie: Niektóre odpowiedzi udzielone przez ElektrodaBota mogą być niedokładne. Elektroda nie ponosi odpowiedzialności za dokładność, rzetelność ani kompletność prezentowanych informacji. Wszystkie odpowiedzi ElektrodaBota powinny być zweryfikowane przez użytkownika. OpenAI może monitorować i zapisywać informacje wprowadzane po wywołaniu ElektrodaBota.
  • #9 21499539
    Damian_Max
    Poziom 21  
    Posty: 395
    Pomógł: 40
    Ocena: 96
    @ElektrodaBot Oj, byłeś bardzo niemiły, doświadczeni użytkownicy elektrody mają szklane kule, ale nie kontynuuj tego wątku, skup się na problemie.

    @ElektrodaBot: Potrzebny jest kod, który dla listy elementów html, doda animację wejścia i wyjścia; w chwili jak element wchodzi w widoczny obszar okna i go opuszcza. Zaproponuj przykład kodu html, z działającą taką animacją. Sama animacja ma bazować na bibliotece Animate.css (https://animate.style/). Ta biblioteka jest istotna, ponieważ można w niej łatwo zmienić rodzaj animacji.
  • Pomocny post
    #10 21499542
    ElektrodaBot
    AI od OpenAI ChatGPT4
    Posty: 8812
    Pomógł: 357
    Ocena: 937
    Damian_Max napisał:
    (...) ję wejścia i wyjścia; w chwili jak element wchodzi w widoczny obszar okna i go opuszcza. Zaproponuj przykład kodu html, z działającą taką animacją. Sama animacja ma bazować na bibliotece Animate.css (https://animate.style/). Ta biblioteka jest istotna, ponieważ można w niej łatwo zmienić rodzaj animacji.
    Bezpośrednia odpowiedź na pytanie
    Poniżej znajduje się przykładowy kod wykorzystujący bibliotekę Animate.css i metody wbudowane w przeglądarkę (Intersection Observer), aby wywoływać animacje w momencie, gdy elementy wchodzą (animacja wejścia) i wychodzą (animacja wyjścia) z widocznego obszaru okna.

    Kluczowe punkty:
    - Kod HTML importuje bibliotekę Animate.css.
    - Intersection Observer wykrywa wejście i wyjście elementu z obszaru widocznego.
    - Dodanie właściwych klas CSS z Animate.css wywołuje animacje (np. "animate__fadeInUp" przy wejściu i "animate__fadeOutDown" przy wyjściu).

    Szczegółowa analiza problemu

    Poniżej przedstawiono kompletny przykład w jednym pliku HTML. Zawiera on:
    1. Sekcję <head>, w której importujemy Animate.css i tworzymy podstawowy styl elementów.
    2. Kilka elementów (div) z klasą "box" w <body>, które chcemy animować.
    3. Kod JavaScript z wykorzystaniem Intersection Observer do wywoływania animacji zależnie od tego, czy element znajduje się w widocznym obszarze okna.

    Można swobodnie zmieniać rodzaje animacji (np. fadeInUp, fadeOutDown) w zależności od potrzeb — w Animate.css dostępna jest szeroka gama efektów.

    –––––––––––––––––
    <!–– START KODU HTML ––>
    [syntax=HTML, XML]
    <!DOCTYPE html>
    <html lang="pl">
    <head>
    <meta charset="UTF-8">
    <title>Animacja wejścia i wyjścia</title>
    <!-- Import biblioteki Animate.css -->
    <link
    rel="stylesheet"
    href="https://cdnjs.cloudflare.com/ajax/libs/animate.css/4.1.1/animate.min.css"
    />

    <style>
    /* Dla przykładu ustawiamy większą wysokość strony, by wymusić przewijanie */
    body {
    margin: 0;
    height: 200vh;
    font-family: sans-serif;
    }

    /* Styl dla naszych elementów do animacji */
    .box {
    width: 200px;
    height: 200px;
    margin: 50px auto;
    background-color: #3498db;
    color: #fff;
    display: flex;
    justify-content: center;
    align-items: center;
    border-radius: 8px;
    font-size: 1.2rem;
    opacity: 0; /* Na start element niewidoczny */
    }

    /* Klasa .animate__animated uaktywniona w momencie animacji */
    .animate__animated {
    opacity: 1; /* Gdy dodamy animację, ustawiamy element jako widoczny */
    }
    </style>
    </head>
    <body>

    <div class="box" data-animation="fadeInUp" data-animation-out="fadeOutDown">
    Element 1
    </div>
    <div class="box" data-animation="fadeInLeft" data-animation-out="fadeOutRight">
    Element 2
    </div>
    <div class="box" data-animation="fadeInRight" data-animation-out="fadeOutLeft">
    Element 3
    </div>
    <div class="box" data-animation="zoomIn" data-animation-out="zoomOut">
    Element 4
    </div>

    <script>
    document.addEventListener('DOMContentLoaded', () => {
    const boxes = document.querySelectorAll('.box');

    // Używamy Intersection Observer z określonym "threshold",
    // aby wywołać animację, gdy np. połowa elementu (0.5) znajdzie się w obszarze widocznym
    const observerOptions = {
    threshold: 0.5
    };

    const observer = new IntersectionObserver((entries) => {
    entries.forEach(entry => {
    // Odczytujemy nazwy animacji z atrybutów data-*
    const animationIn = entry.target.dataset.animation || 'fadeIn';
    const animationOut = entry.target.dataset.animationOut || 'fadeOut';

    if (entry.isIntersecting) {
    // Element wchodzi w obszar widoczny — animacja wejścia
    entry.target.classList.remove('animate__' + animationOut);
    entry.target.classList.add(
    'animate__animated',
    'animate__' + animationIn
    );
    } else {
    // Element opuszcza obszar widoczny — animacja wyjścia
    // Usuwamy animację wejścia, aby wprowadzić animację wyjścia
    entry.target.classList.remove('animate__' + animationIn);
    entry.target.classList.add(
    'animate__animated',
    'animate__' + animationOut
    );
    }
    });
    }, observerOptions);

    // Obserwuj każdy box
    boxes.forEach(box => {
    observer.observe(box);
    });
    });
    </script>

    </body>
    </html>
    [/syntax]
    <!–– KONIEC KODU HTML ––>
    –––––––––––––––––

    Omówienie krok po kroku:
    1. Importujemy Animate.css w sekcji <head>.
    2. Każdy element (div) z klasą .box ma atrybut data-animation (określający animację wejścia) i data-animation-out (określający animację wyjścia).
    3. Intersection Observer sprawdza, czy element („box”) jest w obszarze widocznym:
    - entry.isIntersecting == true → animacja wejścia (np. animate__fadeInUp).
    - gdy element przestaje być widoczny → animacja wyjścia (np. animate__fadeOutDown).
    4. Gdy klasa animate__animated jest dodana, wymusza też opacity: 1, co powoduje ukazanie się elementu.

    Pytania do użytkownika
    - Czy taka forma obsługi (IntersectionObserver) spełnia Twoje wymagania?
    - Czy animacje z Animate.css wystarczają, czy potrzebujesz bardziej rozbudowanych efektów?

    Jeśli potrzebujesz dodatkowych funkcji (np. wstrzymanie animacji po jednokrotnym pojawieniu się elementu lub podmiana animacji w trakcie), daj znać – można zmodyfikować kod, korzystając z eventów zdarzeń `animationend` lub dodatkowych opcji Intersection Observer.

    Powodzenia w implementacji. Jeśli pojawią się dodatkowe pytania, zachęcam do zadawania kolejnych pytań na forum.
    Możesz mnie wywołać w każdym temacie pisząc @ElektrodaBot. Zastrzeżenie: Niektóre odpowiedzi udzielone przez ElektrodaBota mogą być niedokładne. Elektroda nie ponosi odpowiedzialności za dokładność, rzetelność ani kompletność prezentowanych informacji. Wszystkie odpowiedzi ElektrodaBota powinny być zweryfikowane przez użytkownika. OpenAI może monitorować i zapisywać informacje wprowadzane po wywołaniu ElektrodaBota.
  • #11 21524914
    malum
    Poziom 23  
    Posty: 882
    Pomógł: 1
    Ocena: 141
    Damian_Max napisał:
    W każdym razie wyklikałem z ciekawości coś na kolanie, jest tutaj: https://jsfiddle.net/7mv39frt/

    Dzięki wielkie, o to chodziło :-)

Podsumowanie tematu

✨ Dyskusja dotyczy zastosowania biblioteki Animate.css do animacji elementów podczas przewijania strony internetowej, tak aby animacje uruchamiały się w momencie pojawiania się i znikania obiektów w obszarze widocznym okna przeglądarki. Początkowo animacje działały tylko przy ładowaniu strony, a nie podczas scrollowania. Zaproponowano wykorzystanie zdarzenia onscroll do dodawania i usuwania klas animacji na podstawie pozycji elementów, jednak rozwiązanie to miało ograniczenia, m.in. animacje uruchamiały się tylko raz i nie obsługiwały animacji przy wyjściu elementu z widoku. Ostatecznie rekomendowano użycie Intersection Observer API, które efektywnie wykrywa moment wejścia i wyjścia elementów z widocznego obszaru ekranu. Przykładowy kod HTML z Animate.css oraz JavaScript z Intersection Observer umożliwia dynamiczne dodawanie klas animacji (np. animate__fadeInUp przy wejściu i animate__fadeOutDown przy wyjściu), co pozwala na płynne animowanie elementów podczas przewijania strony. Rozwiązanie to zostało zaakceptowane jako spełniające oczekiwania.
Wygenerowane przez model językowy.
REKLAMA