Chciałbym, aby moje menu Bootstrap automatycznie opuszczało się po najechaniu myszą, zamiast konieczności klikania tytułu menu. Chciałbym również zgubić małe strzałki obok tytułów menu.
css
drop-down-menu
twitter-bootstrap
wahać się
źródło
źródło
Odpowiedzi:
Stworzyłem menu rozwijane wyłącznie po najechaniu kursorem w oparciu o najnowszą (v2.0.2) platformę Bootstrap, która obsługuje wiele podmenu i pomyślałem, że opublikuję ją dla przyszłych użytkowników:
Próbny
źródło
class="dropdown-toggle" data-toggle="dropdown"
, aby tylko najechanie kursorem myszy, a nie kliknięcie, uruchomiło menu. Zwróć uwagę, że gdy używasz responsywnych stylów, menu wciąż są przesuwane do małego przycisku w prawym górnym rogu, który jest nadal uruchamiany przez kliknięcie. Wielkie dzięki!@media (min-width: 768px) {.dropdown-menu li:hover .sub-menu {visibility: visible;}}
i@media (min-width: 768px) {.dropdown:hover .dropdown-menu {display: block;}}
Aby menu było automatycznie upuszczane po najechaniu myszą, można to osiągnąć za pomocą podstawowego CSS. Musisz wypracować selektor do ukrytej opcji menu, a następnie ustawić go tak, aby wyświetlał się jako blok po
li
najechaniu kursorem na odpowiedni znacznik. Biorąc przykład ze strony startowej Twittera, selektor wyglądałby następująco:Jeśli jednak używasz responsywnych funkcji Bootstrap, nie będziesz chciał tej funkcji na zwiniętym pasku nawigacyjnym (na mniejszych ekranach). Aby tego uniknąć, zawiń powyższy kod w zapytaniu o media:
Aby ukryć strzałkę (karetkę), robi się to na różne sposoby, w zależności od tego, czy używasz Twitter Bootstrap w wersji 2 i niższej czy w wersji 3:
Bootstrap 3
Aby usunąć daszek w wersji 3, wystarczy usunąć HTML
<b class="caret"></b>
z.dropdown-toggle
elementu zakotwiczenia:Bootstrap 2 i niższe
Aby usunąć daszek w wersji 2, potrzebujesz trochę więcej wglądu w CSS i sugeruję przyjrzeć się
:after
bardziej szczegółowo działaniu pseudoelementu. Aby rozpocząć pracę na drodze do zrozumienia, celowania i usuwania strzałek w przykładzie bootowania na Twitterze, użyj następującego selektora CSS i kodu:Będzie to działało na twoją korzyść, jeśli przyjrzysz się bliżej ich działaniu, a nie tylko skorzystasz z odpowiedzi, które ci dałem.
Podziękowania dla @CocaAkat za zwrócenie uwagi, że brakuje nam dziecinnego kombinatora „>”, aby zapobiec wyświetlaniu podmenu w oknie nadrzędnym
źródło
margin: 0;
, w przeciwnym razie powyższy margines 1px.dropdown-menu
spowoduje nieprawidłowe działanie.data-toggle="dropdown"
atrybut.Oprócz odpowiedzi z „My Head Hurts” (co było świetne):
Istnieją 2 problemy z utrzymaniem się:
Rozwiązaniem (1) jest usunięcie elementów „class” i „data-toggle” z linku nawigacyjnego
Daje to również możliwość utworzenia linku do strony nadrzędnej - co nie było możliwe przy domyślnej implementacji. Możesz po prostu zastąpić „#” dowolną stroną, którą chcesz wysłać użytkownikowi.
Rozwiązaniem (2) jest usunięcie marginesu na selektorze menu .dropdown
źródło
data-toggle="dropdown"
atrybut, który wydawał się działać..nav-pills .dropdown-menu { margin-top: 0px; }
Użyłem trochę jQuery:
źródło
$('ul.nav li.dropdown').hover(function() { $(this).find('.dropdown-menu').stop(true, true).delay(200).fadeIn(); }, function() { $(this).find('.dropdown-menu').stop(true, true).delay(200).fadeOut().hover(function() { $(this).stop(true, true); }); });
200 ms było zbyt szybkie, więc zmieniłem go na : Kiedy podmenu jest zatrzymane, zatrzymaj zanikanieTutaj jest wiele naprawdę dobrych rozwiązań. Ale pomyślałem, że pójdę naprzód i postawię tu moją jako kolejną alternatywę. Jest to prosty fragment kodu jQuery, który robi to tak, jak bootstrap, gdyby obsługiwał najechanie kursorem zamiast list rozwijanych. Przetestowałem to tylko z wersją 3, więc nie wiem, czy będzie działać z wersją 2. Zapisz go jako fragment kodu w swoim edytorze i trzymaj go za naciśnięciem klawisza.
Zasadniczo mówi tylko, że kiedy najedziesz kursorem na rozwijaną klasę, doda do niej klasę otwartą. To po prostu działa. Kiedy przestaniesz unosić się nad rodzimym li z rozwijaną klasą lub potomnymi ul / li, usuwa ono klasę otwartą. Oczywiście jest to tylko jedno z wielu rozwiązań i można do niego dodać, aby działało tylko w określonych przypadkach .dropdown. Lub dodaj przejście do rodzica lub dziecka.
źródło
Po prostu dostosuj swój styl CSS w trzech liniach kodu
źródło
Jeśli masz element z taką
dropdown
klasą (na przykład):Następnie możesz ustawić menu rozwijane, aby było automatycznie rozwijane po najechaniu myszą, zamiast klikania jego tytułu, za pomocą tego fragmentu kodu jQuery:
Oto demo
Ta odpowiedź polegała na odpowiedzi @Michael. Wprowadziłem pewne zmiany i dodałem kilka dodatków, aby menu rozwijane działało poprawnie
źródło
[Aktualizacja] Wtyczka działa na GitHub i pracuję nad kilkoma ulepszeniami (np. Używaj tylko z atrybutami danych (nie wymaga JS). Zostawiłem poniższy kod, ale nie jest taki sam jak na GitHub.
Podobała mi się wersja czysto CSS, ale miło jest mieć opóźnienie, zanim się zamknie, ponieważ zwykle jest to lepsze doświadczenie użytkownika (tj. Nie jest karane za poślizg myszy, który wychodzi 1 px poza listę rozwijaną itp.), I jak wspomniano w komentarzach , masz 1 piksel marginesu, z którym masz do czynienia, lub czasami nawigacja zamyka się nieoczekiwanie, gdy przechodzisz do menu rozwijanego od oryginalnego przycisku itp.
Stworzyłem szybką, małą wtyczkę, której używałem na kilku stronach i działa dobrze. Każdy element nawigacyjny jest obsługiwany niezależnie, więc mają własne liczniki opóźnień itp.
JS
delay
Parametr jest dość oczywista, ainstantlyCloseOthers
natychmiast zamknąć wszystkie inne Dropdowns które są otwarte po najechaniu na nową.Nie czysty CSS, ale mam nadzieję, że pomoże komuś innemu o tak późnej porze (tj. Jest to stary wątek).
Jeśli chcesz, możesz zobaczyć różne procesy, przez które przeszedłem (w dyskusji na
#concrete5
IRC), aby zmusić go do działania, wykonując różne kroki w tej liście: https://gist.github.com/3876924Podejście do schematu wtyczek jest znacznie bardziej przejrzyste, aby obsługiwać indywidualne liczniki itp.
Zobacz post na blogu, aby uzyskać więcej.
źródło
To działało dla mnie:
źródło
Jest to wbudowane w Bootstrap 3. Po prostu dodaj to do swojego CSS:
źródło
Jeszcze lepiej z jQuery:
źródło
jQuery('ul.nav li.dropdown').hover(function() { jQuery(this).closest('.dropdown-menu').stop(true, true).show(); jQuery(this).addClass('open'); }, function() { jQuery(this).closest('.dropdown-menu').stop(true, true).hide(); jQuery(this).removeClass('open'); });
aby podmenu nie było wyświetlane po najechaniu myszą.Możesz użyć domyślnej
$().dropdown('toggle')
metody, aby przełączyć menu rozwijane po najechaniu myszką:źródło
Chcę tylko dodać, że jeśli masz wiele list rozwijanych (tak jak ja), powinieneś napisać:
I będzie działać poprawnie.
źródło
margin: 2px 0 0;
myśli powolną mysz Wprowadzanie z góry przedwcześnie ukrywało menu.ul.dropdown-menu{ margin-top: 0; }
Moim zdaniem najlepszy sposób jest taki:
Przykładowy znacznik:
źródło
Najlepszym sposobem jest wywołanie zdarzenia kliknięcia Bootstrap za pomocą najechania kursorem. W ten sposób powinien pozostać przyjazny dla urządzenia dotykowego.
źródło
Udało mi się to w następujący sposób:
Mam nadzieję, że to pomoże komuś ...
źródło
Dodano także margin-top: 0, aby zresetować margines css ładowania początkowego dla .dropdown-menu, aby lista menu nie znikała, gdy użytkownik powoli unosi się z rozwijanego menu do listy menu.
źródło
Jest to prawdopodobnie głupi pomysł, ale aby usunąć strzałkę skierowaną w dół, możesz usunąć
To jednak nic nie robi dla osoby wskazującej w górę ...
źródło
Opublikowałem odpowiednią wtyczkę dla funkcji rozwijania menu rozwijanego Bootstrap 3, w której możesz nawet zdefiniować, co dzieje się po kliknięciu
dropdown-toggle
elementu (kliknięcie można wyłączyć):https://github.com/istvan-ujjmeszaros/bootstrap-dropdown-hover
Dlaczego to zrobiłem, skoro jest już wiele rozwiązań?
Miałem problemy ze wszystkimi poprzednimi rozwiązaniami. Proste CSS nie używają tej
.open
klasy na.dropdown
, więc nie będzie opinii na temat elementu przełączającego rozwijanego, gdy menu rozwijane jest widoczne.Te js przeszkadzają w kliknięciu
.dropdown-toggle
, więc menu pojawia się po najechaniu myszką, a następnie ukrywa je po kliknięciu otwartego menu rozwijanego, a wysunięcie myszy spowoduje wyświetlenie menu rozwijanego. Niektóre rozwiązania js łamią kompatybilność z iOS, niektóre wtyczki nie działają w nowoczesnych przeglądarkach komputerowych, które obsługują zdarzenia dotykowe.Dlatego stworzyłem wtyczkę Bootstrap Dropdown Hover, która zapobiega wszystkim tym problemom, używając tylko standardowego interfejsu API javascript Bootstrap, bez żadnego włamania . Nawet atrybuty Aria działają dobrze z tą wtyczką.
źródło
bootstrap-dropdown-hover
, ponieważ wydaje się, że wykonuje pracę i jest bardziej kompaktowy. Buduję lądowisko z lewym paskiem nawigacyjnym.Użyj tego kodu, aby otworzyć podmenu po najechaniu myszką (tylko na komputerze):
A jeśli chcesz, aby menu pierwszego poziomu było klikalne, nawet na urządzeniach mobilnych dodaj:
Podmenu (menu rozwijane) zostanie otwarte po najechaniu myszką na pulpicie oraz kliknięciu / dotknięciu na telefonie komórkowym i tablecie. Po otwarciu podmenu drugie kliknięcie pozwoli otworzyć link. Dzięki temu
if ($(window).width() > 767)
podmenu zajmie pełną szerokość ekranu na urządzeniach mobilnych.źródło
źródło
To ukryje te
źródło
To powinno ukryć listy rozwijane i ich opiekę, jeśli są mniejsze niż tablet.
źródło
Rozwiązanie jQuery jest dobre, ale będzie musiało poradzić sobie ze zdarzeniami związanymi z kliknięciem (na telefonie komórkowym lub tablecie), ponieważ hover nie będzie działał poprawnie ... Może może wykryć zmianę rozmiaru okna?
Odpowiedź Andresa Ilicha wydaje się działać dobrze, ale należy ją zawrzeć w zapytaniu medialnym:
źródło
Bardzo proste rozwiązanie dla wersji 2, tylko CSS. Zachowuje tę samą przyjazną funkcjonalność dla telefonu komórkowego i tabletu.
źródło
Zastąp bootstrap.js tym skryptem.
źródło
Oto moja technika, która dodaje niewielkie opóźnienie przed zamknięciem menu po zatrzymaniu najechania na menu lub przycisku przełączania.
<button>
Które normalnie kliknij, aby wyświetlić menu NAV#nav_dropdown
.źródło
Aby ulepszyć odpowiedź Sudharshana, zawijam to w kwerendę medialną, aby zapobiec najechaniu kursorem na szerokości wyświetlania XS ...
Również kursor w znacznikach nie jest wymagany, tylko klasa rozwijana dla li .
źródło
Działa to w przypadku WordPress Bootstrap:
źródło
Więc masz ten kod:
Zwykle działa na zdarzenie kliknięcia i chcesz, aby działało na zdarzeniu najechania kursorem. Jest to bardzo proste, wystarczy użyć tego kodu JavaScript / jQuery:
Działa to bardzo dobrze i oto wyjaśnienie: mamy przycisk i menu. Po najechaniu myszką na przycisk wyświetlamy menu, a po najechaniu myszką na przycisk ukrywamy menu po 100 ms. Jeśli zastanawiasz się, dlaczego go używam, to dlatego, że potrzebujesz czasu, aby przeciągnąć kursor z przycisku nad menu. Po przejściu do menu czas jest resetowany i możesz tam pozostać tyle czasu, ile chcesz. Po wyjściu z menu natychmiast ukryjemy menu, bez żadnego limitu czasu.
Użyłem tego kodu w wielu projektach, jeśli napotkasz jakiś problem z jego użyciem, możesz zadawać mi pytania.
źródło