Lekcja 11: Efekty w jQuery - Rozwijanie/Zwijanie (slideDown(), slideUp(), slideToggle())

Kolejną grupą popularnych efektów w jQuery są animacje rozwijania i zwijania elementów, realizowane poprzez zmianę ich wysokości. Metody slideDown(), slideUp() i slideToggle() pozwalają na płynne pokazywanie i ukrywanie treści, co jest często wykorzystywane w elementach takich jak rozwijane menu, sekcje FAQ czy panele akordeonowe.

Metody Rozwijania/Zwijania

Parametry czasTrwania i Funkcja Zwrotna

Podobnie jak w przypadku innych metod efektów, czasTrwania może być liczbą milisekund, stringiem "fast" lub "slow". Opcjonalna funkcja zwrotna jest wykonywana po zakończeniu animacji dla każdego elementu.

Łączenie Efektów

Efekty rozwijania/zwijania również mogą być łączone w kolejce z innymi efektami jQuery.

$("#nowy-element")
  .hide()          // Upewnij się, że jest ukryty na starcie
  .slideDown(1000) // Rozwiń go przez 1s
  .delay(2000)     // Poczekaj 2s (metoda .delay() wstrzymuje kolejkę efektów)
  .fadeOut(500);   // Na koniec zastosuj efekt przenikania

Zadanie praktyczne

Stwórz prostą strukturę FAQ w HTML:

<div class="faq-item">
    <h3 class="pytanie">Pytanie 1?</h3>
    <div class="odpowiedz" style="display: none;">Odpowiedź na pytanie 1.</div>
</div>
<div class="faq-item">
    <h3 class="pytanie">Pytanie 2?</h3>
    <div class="odpowiedz" style="display: none;">Odpowiedź na pytanie 2.</div>
</div>
<!-- Dodaj więcej pytań i odpowiedzi -->

Używając jQuery:

  1. Dodaj handler zdarzenia "click" do elementów z klasą .pytanie.
  2. Wewnątrz handlera, użyj slideToggle(), aby przełączać widoczność następnego elementu (odpowiedzi) po klikniętym pytaniu. Ustaw czas animacji na 400ms.
  3. (Opcjonalnie) Zmodyfikuj kod tak, aby po kliknięciu pytania, inne otwarte odpowiedzi były automatycznie zwijane (slideUp), tworząc efekt akordeonu, gdzie tylko jedna odpowiedź jest widoczna naraz.
Pokaż rozwiązanie

HTML (przykład z 3 pytaniami):

<!DOCTYPE html>
<html>
<head>
    <title>Test Efektów Slide</title>
    <style>
        .pytanie {
            cursor: pointer;
            background-color: #eee;
            padding: 10px;
            margin-top: 5px;
            border: 1px solid #ccc;
        }
        .odpowiedz {
            padding: 10px;
            border: 1px solid #ccc;
            border-top: none;
            background-color: #f9f9f9;
        }
    </style>
</head>
<body>
    <h2>FAQ</h2>
    <div class="faq-item">
        <h3 class="pytanie">Pytanie 1: Co to jest jQuery?</h3>
        <div class="odpowiedz" style="display: none;">jQuery to popularna biblioteka JavaScript, która upraszcza manipulację DOM, obsługę zdarzeń, animacje i zapytania AJAX.</div>
    </div>
    <div class="faq-item">
        <h3 class="pytanie">Pytanie 2: Jak działa slideToggle()?</h3>
        <div class="odpowiedz" style="display: none;">Animuje wysokość elementu od 0 do pełnej lub odwrotnie, aby go pokazać lub ukryć.</div>
    </div>
    <div class="faq-item">
        <h3 class="pytanie">Pytanie 3: Czy potrzebuję jQuery?</h3>
        <div class="odpowiedz" style="display: none;">Współczesny JavaScript (ES6+) oferuje wiele funkcji, które kiedyś wymagały jQuery, ale biblioteka ta nadal jest użyteczna i popularna, zwłaszcza w starszych projektach lub dla szybkiego prototypowania.</div>
    </div>

    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
    <script>
        $(function() {
            // Wersja podstawowa (przełączanie klikniętej odpowiedzi)
            /*
            $(".pytanie").on("click", function() {
                $(this).next(".odpowiedz").slideToggle(400);
            });
            */

            // Wersja z akordeonem (zamykanie innych odpowiedzi)
            $(".pytanie").on("click", function() {
                let kliknietaOdpowiedz = $(this).next(".odpowiedz");

                // Zamknij wszystkie odpowiedzi OPRÓCZ tej, która ma być przełączona
                $(".odpowiedz").not(kliknietaOdpowiedz).slideUp(400);

                // Przełącz widoczność klikniętej odpowiedzi
                kliknietaOdpowiedz.slideToggle(400);
            });
        });
    </script>
</body>
</html>

Zadanie do samodzielnego wykonania

Stwórz przycisk "Pokaż Panel" i div z ID "panel-boczny", który jest początkowo ukryty i ma ustawioną szerokość (np. width: 200px;) oraz jakieś tło. Dodaj wewnątrz panelu przycisk "Ukryj Panel".

Używając jQuery:

  1. Po kliknięciu "Pokaż Panel", rozwiń "panel-boczny" za pomocą slideDown() z czasem "slow".
  2. Po kliknięciu przycisku "Ukryj Panel" (wewnątrz panelu), zwiń "panel-boczny" za pomocą slideUp() z czasem "fast".

FAQ - Efekty Rozwijania/Zwijania jQuery

Jak działa animacja w slideUp()/slideDown()?

Te metody animują głównie właściwość CSS height elementu od zera do jego naturalnej wysokości (lub odwrotnie). jQuery może również animować padding-top, padding-bottom, margin-top i margin-bottom, aby uzyskać płynniejszy efekt. Po zakończeniu slideUp(), ustawiane jest display: none;.

Czy mogę użyć slideDown() na elemencie, który jest już widoczny?

Nie, podobnie jak show() i fadeIn(), jeśli element jest już widoczny, slideDown() nie wykona żadnej akcji.

Co jeśli wysokość elementu jest zdefiniowana w CSS?

slideDown() będzie animować wysokość do wartości obliczonej przez przeglądarkę (naturalnej wysokości zawartości lub tej zdefiniowanej w CSS, jeśli jest większa od zera). slideUp() zawsze animuje do wysokości 0.

Czy te efekty działają na elementach inline?

Efekty slideUp()/slideDown()/slideToggle() działają najlepiej na elementach blokowych (np. div, p, ul), ponieważ operują na ich wysokości. Zastosowanie ich do elementów inline (np. span, a) może nie dać oczekiwanego rezultatu, ponieważ elementy te domyślnie nie mają wysokości w taki sam sposób jak elementy blokowe.

Czy mogę zmienić kierunek animacji (np. rozwijanie w bok)?

Metody slide* animują tylko wysokość. Do animacji szerokości lub innych właściwości należy użyć bardziej ogólnej metody .animate(), która pozwala na animowanie dowolnych właściwości CSS liczbowych.