Aktualizacja: czerwiec 2026, uwagi wdrożeniowe dotyczą PrestaShop 1.7, 8 i 9. Domyślny motyw Classic nadal nie zawiera przycisku powrotu na górę; poniższy kod to vanilla JS z obszarem dotknięcia 44px na urządzeniach mobilnych.

Przycisk powrotu na górę należy do tych detali, których nikt nie zauważa, dopóki ich nie brakuje, mała strzałka w rogu, która przenosi klienta z powrotem do nagłówka po przewinięciu długiej strony do końca. Wydaje się zbyt drobny, żeby się nad nim zastanawiać. Ale w sklepie PrestaShop, gdzie strony kategorii i produktów rutynowo mają po kilka tysięcy pikseli wysokości, różnica między jego obecnością a brakiem to różnica między klientem oddalonym o jedno dotknięcie od wyszukiwarki a klientem przewijającym ekran telefonu kciukiem tak długo, aż zrezygnuje. Ten wpis pokazuje, jak dodać taki przycisk do sklepu we właściwy sposób, konkretnie w PrestaShop: gdzie powinien znaleźć się w motywie, jak dodać go bez tworzenia zmian w plikach, których pożałujesz przy następnej aktualizacji, i jakie błędy zamieniają pomocny przycisk w element zasłaniający „Dodaj do koszyka”.

Jeśli interesuje Cię uzasadnienie, dlaczego ten przycisk realnie działa, dane o zaangażowaniu, wpływ na porzucanie strony, opisaliśmy to w artykule przycisk przewijania na górę: małe usprawnienie UX, zaskakujący efekt. Tutaj zostajemy przy stronie praktycznej: wdrożeniu, mechanice PrestaShop i decyzjach, które przesądzają o efekcie.

Czy Twój motyw już go ma? Sprawdź, zanim zaczniesz budować

Pierwsza rzecz specyficzna dla PrestaShop: wiele nowoczesnych motywów ma już wbudowany przycisk powrotu na górę, więc możesz być o krok od dodania drugiego. Domyślny motyw Classic w PrestaShop 1.7, 8 i 9 nie zawiera go od razu. Dlatego standardowa instalacja Classic wymaga dodania tej funkcji. Natomiast większość płatnych motywów (oraz motywów wywodzących się z Warehouse) taki przycisk ma, zwykle włączany na stronie konfiguracji motywu w sekcji Design → Theme & Logo albo w module ustawień motywu. Zanim napiszesz choć jedną linię kodu, przewiń długą stronę kategorii w działającym sklepie do końca i obserwuj róg ekranu. Jeśli przycisk już się pojawia, Twoim zadaniem jest konfiguracja, nie budowanie.

Aby potwierdzić, skąd pochodzi istniejący przycisk, podejrzyj źródło strony i wyszukaj typowe znaczniki: element #back-to-top albo .scroll-to-top, ewentualnie fragment szablonu w motywie pod themes/<yourtheme>/templates/ (często w _partials/footer.tpl albo w osobnym scroll-top.tpl). Jeśli jest tam, ale się nie wyświetla, opcja motywu jest po prostu wyłączona. To checkbox w panelu administracyjnym, nie zgłoszenie dla programisty.

Trzy sposoby dodania go do PrestaShop, i który wybrać

Jeśli Twój motyw naprawdę nie ma przycisku powrotu na górę, masz trzy realistyczne ścieżki. Różnią się głównie jedną rzeczą, która w PrestaShop ma większe znaczenie niż wygoda: czy zmiana przetrwa aktualizację motywu albo rdzenia.

ŚcieżkaGdzie to działaCzy przetrwa aktualizacje?Najlepsze, gdy…
Opcja motywuUstawienia motywu, bez koduTak (to własna funkcja motywu)Twój motyw już ją zawiera, wystarczy ją włączyć.
Moduł bloku HTML/JSNiestandardowy blok HTML/modułu na obsługiwanym hooku (np. displayFooter)Tak. Nic w motywie nie jest edytowaneChcesz dodać go do standardowego motywu bez dotykania plików motywu.
custom.js / custom.cssWłasny plik motywu assets/js/custom.jsPrzeważnie, ale jest powiązany z tym motywemSwobodnie pracujesz w plikach zasobów motywu i chcesz mieć pełną kontrolę.
Bezpośrednia edycja footer.tplSzablon motywu nadrzędnegoNie, zostanie nadpisany przy aktualizacji motywuNigdy. Użyj zamiast tego motywu potomnego (patrz niżej).

Ścieżka, której trzeba unikać, jest jednocześnie najbardziej kusząca: otworzyć footer.tpl w aktywnym motywie i wkleić znacznik. Działa dokładnie do momentu, w którym autor motywu wypuści aktualizację, wtedy Twoja zmiana znika, a Ty nie wiesz dlaczego. Jeśli musisz dotykać szablonów, rób to w motywie potomnym. Wyjaśniamy, dlaczego ta zasada jest nienegocjowalna, w artykule motywy potomne: dlaczego nigdy nie należy edytować motywu nadrzędnego. Czytaj dalej, jeśli interesują Cię czystsze podejścia bez edycji szablonów.

Czysta ścieżka: niestandardowy blok HTML i kilka linii JS

Podejście, które pozwala nie dotykać plików motywu, polega na wstrzyknięciu znacznika przycisku przez blok treści HTML i wczytaniu jego zachowania przez motywowy custom.js. Motyw Classic zawiera themes/<yourtheme>/assets/js/custom.js (oraz obok niego custom.css) dla JavaScriptu działającego w całym sklepie. Pamiętaj jednak, że to, czy takie pliki istnieją i jak zachowują się przy aktualizacji, zależy od motywu. Edycja ich w aktywnym motywie nadrzędnym nadal jest edycją plików motywu, a aktualizacja może je nadpisać, o ile motyw albo dostawca ich nie zachowuje. Jeśli zależy Ci na realnym bezpieczeństwie aktualizacji, wybierz motyw potomny albo zasoby rejestrowane przez moduł. Pełną dyscyplinę bezpiecznego używania tych plików, i powód, dla którego są lepsze niż edycja skompilowanych paczek motywu, opisujemy w niestandardowy CSS i JavaScript w PrestaShop bez psucia aktualizacji.

Samego znacznika nie warto wpisywać na sztywno jako <div> w szablonie. Dedykowany niestandardowy blok HTML/modułu umieszczony w obszarze stopki załatwia sprawę, użyj takiego, który obsługuje docelowy hook (dla przycisku zakotwiczonego przy stopce będzie to moduł podpięty do displayFooter albo displayBeforeBodyClosingTag), albo zbuduj mały własny moduł. Pamiętaj, że znacznik da się wstrzyknąć tylko w hooki obsługiwane przez moduł i faktycznie renderowane przez motyw, a nie dosłownie w dowolnym miejscu sklepu, mechanikę rozmieszczania własnych bloków opisujemy w bloki HTML: dodawanie niestandardowej treści w dowolnym miejscu sklepu PrestaShop. Sam przycisk to po prostu dostępny element kotwicy albo przycisku; JavaScript decyduje, kiedy się pojawia, i obsługuje płynne przewinięcie.

Minimalne, dostępne wdrożenie naprawdę mieści się w około piętnastu liniach. Nie jest problemem wydajnościowym i powinno być napisane w vanilla JS (motyw Classic nadal dołącza jQuery, ale opieranie się na nim jest kruche, wiele lżejszych motywów zewnętrznych je usuwa albo odracza, więc nie zakładaj, że $() jest dostępne):

  • Znacznik: prawdziwy <button type="button" id="back-to-top" aria-label="Back to top"> ze strzałką albo SVG w środku. Nigdy goły <div>, bo div nie jest fokusowalny ani ogłaszany czytnikom ekranu.
  • Pokazanie po przewinięciu: listener przewijania, który dodaje klasę visible, gdy window.scrollY przekroczy mniej więcej 300–500px (około jeden viewport). Ogranicz częstotliwość działania listenera, żeby nie uruchamiał się dla każdego piksela.
  • Płynny powrót: window.scrollTo({ top: 0, behavior: 'smooth' }) po kliknięciu, jedna linia, natywnie, bez biblioteki animacji.

Oto całość, znacznik, ograniczone częstotliwościowo pokazywanie/ukrywanie i natywne płynne przewijanie. To vanilla, bez zależności, z poszanowaniem preferencji użytkownika dotyczących ruchu:

<!-- markup: a real button, focusable and announced -->
<button type="button" id="back-to-top" aria-label="Back to top"></button>
#back-to-top {
  position: fixed;
  right: 1rem;
  bottom: 1rem;           /* raise this if a cookie bar / chat sits here */
  width: 48px;
  height: 48px;          /* 44px+ tap target on mobile */
  opacity: 0;
  visibility: hidden;
  transition: opacity .2s ease;
  z-index: 1030;       /* deliberate, below banner/chat – test it */
}
#back-to-top.is-visible { opacity: 1; visibility: visible; }
const btn = document.getElementById('back-to-top');
let ticking = false;

window.addEventListener('scroll', () => {
  if (ticking) return;            // throttle to one check per frame
  ticking = true;
  window.requestAnimationFrame(() => {
    btn.classList.toggle('is-visible', window.scrollY > 400);
    ticking = false;
  });
}, { passive: true });

btn.addEventListener('click', () => {
  const reduce = window.matchMedia('(prefers-reduced-motion: reduce)').matches;
  window.scrollTo({ top: 0, behavior: reduce ? 'auto' : 'smooth' });
});

passive: true na listenerze przewijania i ograniczenie przez requestAnimationFrame to dwa szczegóły, dzięki którym nie obciążasz głównego wątku sklepu; sprawdzenie ograniczenia ruchu przy kliknięciu to gest dostępności, który kosztuje jedną linię. Zarejestruj ten JS jako zewnętrzny plik przez hook modułu, zamiast wklejać go inline.

Opakowanie tego w mały, dedykowany moduł zamiast luźnych plików ma jedną przewagę wartą nazwania: przenosi się między sklepami i nie jest powiązane z cyklem życia jednego motywu. To ten sam powód, dla którego animacje przewijania warto robić jako zarządzaną warstwę, a nie rozproszone skrypty inline, przycisk i subtelny ruch przy przewijaniu należą do tej samej rodziny „dopracowania frontendu, które nie powinno rozwidlać motywu”.

Pułapki specyficzne dla PrestaShop, które naprawdę potrafią ugryźć

Okrągły przycisk powrotu do góry ze strzałką skierowaną w górę w prawym dolnym rogu strony produktu w sklepie

Okrągły przycisk powrotu na górę znajduje się w prawym dolnym rogu strony produktu w sklepie.

Sam przycisk jest trywialny. W prawdziwych sklepach PrestaShop psuje się wszystko, z czym dzieli prawy dolny róg. Instalacje PrestaShop z czasem obrastają pływającymi widżetami, a każdy z nich chce tej samej przestrzeni.

  • Zgody cookies i banery RODO. Moduły zgód i prawa cookies powszechne w sklepach PrestaShop, czy to dodatek zgodności prawnej, czy zewnętrzna platforma CMP, zwykle dokują do dołu viewportu. Przycisk powrotu na górę, który je ignoruje, kończy albo ukryty za banerem, albo nałożony na przycisk „Akceptuję”. Umieść przycisk w prawym dolnym rogu, a banerowi zostaw pełną dolną listwę, albo podnieś przycisk ponad wysokość banera, gdy jest widoczny.
  • Widżety czatu na żywo (Crisp, Messenger, tawk.to). Niemal zawsze przypinają się do prawego dolnego rogu, dokładnie tam, gdzie konwencja umieszcza przycisk powrotu na górę. Nie walcz z tym: ustaw przycisk nad dymkiem czatu, z dodatkowym offsetem bottom, żeby klient nigdy nie musiał wybierać między „porozmawiaj z nami” a „wróć na górę”.
  • Wojna warstw z-index. To najczęstsza usterka. Widżety czatu i moduły zgód często ustawiają bardzo wysokie wartości z-index, przez co przycisk może zostać wyrenderowany pod nimi. Widoczny, ale nieklikalny, co jest gorsze niż jego brak. Ustaw świadomy z-index i przetestuj przycisk przez rzeczywiste kliknięcie na telefonie, z aktywnym banerem cookies i czatem, a nie na czystej stronie stagingowej, na której nie ma żadnego z nich.
  • Przyklejone nagłówki zmieniają rachunek. Wiele motywów PrestaShop (oraz opcje sticky header w płatnych motywach) utrzymuje nawigację, wyszukiwarkę i koszyk przypięte u góry podczas przewijania. Jeśli tak jest u Ciebie, przycisk jest mniej niezbędny, wyszukiwarka i koszyk są już pod ręką, ale nadal ma sens przy szybkim powrocie do hero, filtrów u góry kategorii albo początku długiego wpisu blogowego. W motywie ze sticky header przycisk powinien być nieco mniejszy i spokojniejszy; to udogodnienie, nie koło ratunkowe.

Gdzie najbardziej zarabia na swoje miejsce w sklepie PrestaShop

Nie każda strona potrzebuje go tak samo. Przycisk najmocniej zwraca się dokładnie tam, gdzie strony PrestaShop są najdłuższe, i warto wiedzieć, które to miejsca, żeby sprawdzić go tam, gdzie naprawdę ma znaczenie:

  • Przede wszystkim mobile. Mniejszy viewport oznacza więcej przewijania dla tej samej treści, więc użytkownik telefonu pokonuje znacznie więcej długości ekranu niż użytkownik desktopu na identycznej stronie kategorii. Jeśli masz dopracować przycisk tylko na jednym typie urządzenia, dopracuj go na mobile, i zachowaj tam minimalny obszar dotknięcia 44–48px.
  • Długie strony kategorii z ponad 30 produktami, filtrami wyszukiwania fasetowego, infinite scroll albo głęboką paginacją. Gdy klient dociera do produktu numer 35, nagłówek naprawdę jest tysiące pikseli dalej.
  • Rozbudowane strony produktów z długimi opisami, tabelami specyfikacji, opiniami i karuzelami cross-sell, takie strony rutynowo przekraczają 5000px.
  • Strony bloga i CMS. Treści statyczne i redakcyjne często mają najdłuższe przewijanie w całym serwisie. Skoro już poprawiasz te strony, warto uporządkować także samą nawigację CMS, czytelniejsze etykiety menu dla stron statycznych pomagają klientom, którzy wrócą na górę, faktycznie znaleźć następny krok. Opisujemy to w nazwy wyświetlane stron CMS: lepsza nawigacja dla stron statycznych.

Jak dobrze ustawić zachowanie przycisku

Niezależnie od wybranej ścieżki te same drobne szczegóły odróżniają przycisk, który wygląda jak część sklepu, od przycisku doklejonego na siłę:

  • Pojawianie się dopiero po przewinięciu. Pokazywanie go na samej górze strony to bezsensowny bałagan. Ujawnij go dopiero wtedy, gdy klient przewinie mniej więcej jeden viewport.
  • Płynne przewijanie, nie teleport. Natychmiastowy skok na górę dezorientuje, klient nie wie, czy przewinął stronę, czy trafił na nową. Płynne przewinięcie trwające 300–500 ms zachowuje poczucie położenia.
  • Wygaszanie, nie podskakiwanie. Subtelne pojawianie się i znikanie przez około 200 ms wygląda dopracowanie. Podskakujące, wysuwane albo pulsujące animacje przyciągają uwagę, na którą ten przycisk nie zasługuje; ma być łatwy do odkrycia, nie rozpraszający.
  • Dostępność od początku. Prawdziwy <button> albo <a> (fokusowalny i ogłaszany), aria-label, widoczny obrys fokusu klawiatury i wystarczający kontrast względem tła strony, nad którym przycisk pływa. Poprawne zrobienie tego na etapie budowy nic nie kosztuje, a dokładanie później jest uciążliwe.

Czy warto to mierzyć?

Możesz, a w ruchliwym sklepie warto poświęcić na to kilka minut: wyślij zdarzenie analityczne przy każdym kliknięciu przycisku. Dzięki temu zobaczysz, jaki odsetek sesji na długich stronach faktycznie z niego korzysta i które strony generują najwięcej kliknięć. Zwykle to przydatny sygnał: „to są moje najgłębsze, najbardziej angażujące strony”. Każdy procent znaleziony gdzie indziej traktuj jako wskazówkę, nie cel; uczciwa liczba zależy wyłącznie od długości Twoich stron i zachowań klientów, więc odczytaj ją z własnego sklepu zamiast ufać wartości z bloga.

Przycisk powrotu na górę to rzadki przypadek w UX sklepu: usprawnienie prawie bez minusów. Kosztuje kilka linii, zużywa pomijalne zasoby, pomaga klientom, którzy go potrzebują, i pozostaje niewidoczny dla tych, którzy go nie potrzebują. W PrestaShop da się go zepsuć właściwie tylko przez niedbałe doklejenie, edycję motywu nadrzędnego, przez co zniknie przy następnej aktualizacji, albo wrzucenie go w róg już zajęty przez baner cookies i widżet czatu. Dodaj go czysto, w miejscu odpornym na aktualizacje, i przetestuj tam, gdzie pływające widżety faktycznie działają. Potem możesz o nim zapomnieć. Dokładnie na to pozwala dobrze zrobiony detal UX.

Najczęściej zadawane pytania

Czy domyślny motyw PrestaShop zawiera przycisk powrotu na górę?

Nie. Motyw Classic w PrestaShop 1.7, 8 i 9 jest dostarczany bez takiego przycisku, więc standardowa instalacja Classic wymaga jego dodania. Wiele płatnych motywów i motywów wywodzących się z Warehouse ma go wbudowanego, zwykle z przełącznikiem we własnych ustawieniach motywu. Zanim cokolwiek zbudujesz, przewiń długą stronę kategorii w działającym sklepie do końca, jeśli przycisk już się pojawia, Twoim zadaniem jest przełączenie checkboxa w panelu administracyjnym, nie pisanie kodu.

Jaki jest najczystszy sposób dodania go bez psucia aktualizacji?

Umieść znacznik w bloku HTML w panelu administracyjnym, na hooku stopki takim jak displayFooter albo displayBeforeBodyClosingTag, i zarejestruj JavaScript jako zewnętrzny plik przez mały moduł. Nic w drzewie motywu nie jest edytowane, więc aktualizacja motywu nie może tego skasować. Edycja footer.tpl w aktywnym motywie nadrzędnym to ścieżka, której należy unikać; jeśli musisz dotykać szablonów, zrób to w motywie potomnym.

Czy używać jQuery do logiki przewijania?

Nie, napisz ją w czystym JavaScripcie. Motyw Classic nadal dołącza jQuery, ale wiele lżejszych motywów zewnętrznych usuwa je albo odracza, więc nie możesz zakładać, że $() jest dostępne. Cały przycisk to około piętnaście linii zwykłego JS: ograniczony częstotliwościowo listener przewijania, który przełącza klasę widoczności po przekroczeniu około 400px, oraz window.scrollTo({ top: 0, behavior: 'smooth' }) po kliknięciu. Żadna biblioteka nie jest potrzebna.

Mój przycisk jest widoczny, ale nie da się go kliknąć. Dlaczego?

To najczęstsza usterka, konflikt warstw z-index. Widżety czatu i banery zgód często ustawiają bardzo wysokie wartości z-index, więc przycisk renderuje się pod nimi: jest widoczny, ale nieklikalny, co jest gorsze niż jego brak. Ustaw świadomy z-index i przetestuj realne kliknięcie na telefonie, z aktywnym banerem cookies i czatem, a nie na czystej stronie stagingowej, na której nie ma żadnego z nich.

Jak zapobiec zasłanianiu banera cookies albo dymka czatu?

Wszystkie trzy elementy chcą prawego dolnego rogu. Zostaw banerowi zgody pełną dolną listwę i trzymaj przycisk w rogu albo podnieś offset bottom przycisku, gdy baner jest widoczny. W przypadku dymka czatu ustaw przycisk nad nim z dodatkowym offsetem, żeby klient nigdy nie musiał wybierać między „porozmawiaj z nami” a „wróć na górę”. Zawsze weryfikuj to przy aktywnych obu widżetach.

Po jakim dystansie przewijania przycisk powinien się pojawić?

Mniej więcej po jednym viewporcie, około 300–500px od góry. Pokazywanie go na samym początku strony to bezsensowny bałagan; ujawnienie dopiero po przewinięciu sprawia, że wygląda celowo. Ogranicz częstotliwość listenera przewijania (osłona requestAnimationFrame plus listener pasywny), żeby sprawdzenie wykonywało się najwyżej raz na klatkę i nie obciążało głównego wątku.

Czy przycisk musi być dostępny i jak to zrobić?

Tak, a poprawne zrobienie tego na etapie budowy jest tanie. Użyj prawdziwego <button> albo <a> zamiast stylowanego <div>, żeby element był fokusowalny i ogłaszany, dodaj aria-label="Back to top", zachowaj widoczny obrys fokusu klawiatury, zapewnij wystarczający kontrast względem tła strony i uszanuj prefers-reduced-motion, przechodząc do natychmiastowego skoku. Dokładanie tego później jest znacznie bardziej bolesne niż uwzględnienie od początku.

Czy taki przycisk nadal ma sens, jeśli mój motyw ma sticky header?

Jest mniej niezbędny, ale nadal przydatny. Sticky header utrzymuje wyszukiwarkę i koszyk pod ręką, więc przycisk nie jest kołem ratunkowym, ale nadal pomaga klientowi szybko wrócić do hero, filtrów u góry kategorii albo początku długiego wpisu blogowego. W motywie ze sticky header przycisk powinien być nieco mniejszy i spokojniejszy, aby wyglądał jak udogodnienie, a nie konkurujący element fixed.

Powiązane poradniki

Tagi: PrestaShop UX
Udostępnij ten wpis:
David Miller

David Miller

Założyciel, mypresta.rocks

David Miller to specjalista PrestaShop z ponad dekadą praktycznego doświadczenia i założyciel mypresta.rocks, studia programistycznego z Tychów. Tworzy i utrzymuje katalog 152 modułów PrestaShop, w tym 21 pakietów „Revolution" obejmujących SEO, checkout, bezpieczeństwo, wydajność, marketing, wyszukiwanie, wsparcie i operacje magazynowe, które każdego dnia usprawniają realne sklepy, testowanych na PrestaShop 1.7.8, 8.x i 9.x. Sprawuje również opiekę nad sklepami produkcyjnymi generującymi miliony rocznego obrotu, dlatego jego pracę ocenia się po realnej sprzedaży, a nie po wersjach demo. Jego doświadczenie obejmuje pełen zakres e-commerce, wydajność, bezpieczeństwo, SEO i marketing, oraz wykracza poza PrestaShop, sięgając WooCommerce, Shopify i systemów tworzonych na zamówienie. Na blogu pisze o technicznej stronie PrestaShop: co platforma naprawdę robi pod maską, co psuje się na produkcji i które rozwiązania faktycznie się sprawdzają.

Komentarze

Brak komentarzy. Bądź pierwszy!
Spodobał Ci się ten artykuł?

Otrzymuj nasze najnowsze porady, przewodniki i aktualizacje modułów prosto na swoją skrzynkę.

Możesz zrezygnować w każdej chwili. W tym celu należy odnaleźć szczegóły w naszej informacji prawnej.

Ładowanie...
Do góry