TL; DR: Czy Sticky rzeczywiście jest w stanie reagować na zmiany, które wprowadzam za pomocą JavaScript? Jeśli tak to jak?
(Projekt korzysta z Foundation 6.2 i WordPress 4.4, motyw zainstalowany za pomocą Node.js / npm i gulp 4.0. Moje szczegółowe pytania są zaznaczone pogrubioną czcionką).
Chcę, aby navpasek był lepki za pomocą Sticky Plugin Foundation, ale tylko wtedy, gdy kliknę przycisk. Oznacza to, że po zakończeniu całego DOM, navpasek nie powinien przyklejać się „sam”, ale pozostawać w swoim górnym położeniu w dokumencie. Dodatkowo powinien znikać podczas przewijania w dół, ale trzymać się podczas przewijania w górę.
navPasek jest prawidłowo opakowane wszystkie wymagane divs, więc navbar jest w stanie trzymać. Problemy pojawiają się w przypadku części „dodatkowej”. Mój pomysł był taki, aby najpierw utworzyć instancję Sticky przy użyciu PHP:
<div data-sticky-container>
<header class="header" role="banner" id="sticky_header" data-sticky data-top-anchor="1"
data-btm-anchor="content:top" data-options="marginTop:0;" style="width:100%"
>
<?php get_template_part('parts/nav', 'offcanvas-topbar'); ?>
</header>
</div>
Następnie zmień na data-btm-anchorbieżącą pozycję przewijania za pomocą JavaScript, który jest uruchamiany po kliknięciu. To nie działało tak dobrze, jak bym chciał. Czego próbowałem do tej pory:
- Podczas używania
getElementByIDa następniesetAttribute,data-btm-anchorw pliku PHP zmienia się zgodnie z Firebug, ale nie wpływanavto trochę na pasek; zostaje tam, gdzie jest. Czy muszę „przywrócić” Sticky, a jeśli tak, to w jaki sposób? - W Docs wspomnieć:
Ustawianie opcji w JavaScript wymaga przekazania obiektu do funkcji konstruktora, na przykład:
var options = { multiExpand: true, allowAllClosed: false }; var accordion = new Foundation.Accordion($('#some-accordion'), options);
Czy to oznacza, że mogę przekazać nowe parametry do już istniejącej instancji wtyczki? Za każdym razem, gdy przekazywałem nowy Foundation.Stickyobiekt z niczym innym jak innym btmAnchor jako parametrem tablicy opcji do my jQuery('#sticky_header'), nic się nie działo.
W docs również zaproponować programowo dodając przyklejony do mojego „sticky_header”. Gdyby to zadziałało, mógłbym spróbować bezpośrednio zmienić obiekt jQuery. Do tej pory udało mi się z powodzeniem powiązać wtyczkę Sticky z moim nagłówkiem:
- wrzucenie .js, z którego przycisk pobiera swoją funkcję
assets/js/scripts(a następnie uruchomieniegulp) - usunięcie wszystkich znaczników „sticky data” z my
<header class="header">, więc nie ma zarejestrowanej wtyczki w nagłówku po zakończeniu ładowania DOM programowe dodanie wtyczki:
function button_fire(){ var options = { topAnchor:"1", btmAnchor:"footer:top", marginTop:"1" }; var stick = new Foundation.Sticky(jQuery('.header'), options); }
Nagłówek zyskuje teraz klasę „sticky” według Firebuga. Ale to nadal nie działa - raczej powoduje usterki: „Przestrzeń nagłówka” jest nieco zwinięta, więc nieznacznie zakrywa „zawartość”
divponiżej. Co wiesz, nagłówek się nie przykleja. Czy to błąd?Załóżmy, że teraz zadziałaby „genialnie”. Czy teoretycznie jestem w stanie zmienić atrybuty poprzez dereferencję
var sticklub użyciejQuery('#sticky_header')lubjQuery('.header')?- wrzucenie .js, z którego przycisk pobiera swoją funkcję
Przede wszystkim jQuery nie działa tak, jak powinno. Miałem wiele problemów z używaniem $w swoich skryptach i nie mogę z tego powodu na przykład uruchomić destroy()metody Sticky (jeśli zadziałała, być może zniszczyłem instancję Sticky, aby utworzyć nową z btmAnchorzestaw do nowej pozycji przewijania). Otworzę kolejne pytanie.
var $ = jQuerylub przekazać to przy wywołaniu metody .ready () w ten sposób:jQuery(document).ready(function($){ //your code here with using $ or jQuery });
wp_enqueue_script( 'jquery' );Niestety nadal ten sam problem co poprzednio. A może nieprawidłowo zakolejkowałem jQuery? Czy JointsWP ma własne biblioteki jQuery?