Jak zrobić rozwijane menu Twitter Bootstrap po najechaniu kursorem zamiast kliknąć

Chciałbym, aby moje menu Bootstrap automatycznie rozwijało się po najechaniu kursorem, zamiast klikać tytuł menu. Chciałbym również stracić małe strzałki obok tytułów menu.

Author: Peter Mortensen, 2012-01-16

30 answers

Stworzyłem menu rozwijane pure on hover oparte na najnowszym (v2.0.2) frameworku Bootstrap, który ma wsparcie dla wielu podmenu i pomyślałem, że opublikuję go dla przyszłych użytkowników:

body {
  padding-top: 60px;
  padding-bottom: 40px;
}

.sidebar-nav {
  padding: 9px 0;
}

.dropdown-menu .sub-menu {
  left: 100%;
  position: absolute;
  top: 0;
  visibility: hidden;
  margin-top: -1px;
}

.dropdown-menu li:hover .sub-menu {
  visibility: visible;
}

.dropdown:hover .dropdown-menu {
  display: block;
}

.nav-tabs .dropdown-menu,
.nav-pills .dropdown-menu,
.navbar .dropdown-menu {
  margin-top: 0;
}

.navbar .sub-menu:before {
  border-bottom: 7px solid transparent;
  border-left: none;
  border-right: 7px solid rgba(0, 0, 0, 0.2);
  border-top: 7px solid transparent;
  left: -7px;
  top: 10px;
}

.navbar .sub-menu:after {
  border-top: 6px solid transparent;
  border-left: none;
  border-right: 6px solid #fff;
  border-bottom: 6px solid transparent;
  left: 10px;
  top: 11px;
  left: -6px;
}
<link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/2.3.2/css/bootstrap.min.css" rel="stylesheet" />

<div class="navbar navbar-fixed-top">
  <div class="navbar-inner">
    <div class="container-fluid">
      <a data-target=".nav-collapse" data-toggle="collapse" class="btn btn-navbar">
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
      </a>
      <a href="#" class="brand">Project name</a>
      <div class="nav-collapse">
        <ul class="nav">
          <li class="active"><a href="#">Home</a></li>
          <li><a href="#">Link</a></li>
          <li><a href="#">Link</a></li>
          <li><a href="#">Link</a></li>
          <li class="dropdown">
            <a data-toggle="dropdown" class="dropdown-toggle" href="#">Dropdown <b class="caret"></b></a>
            <ul class="dropdown-menu">
              <li>
                <a href="#">2-level Dropdown <i class="icon-arrow-right"></i></a>
                <ul class="dropdown-menu sub-menu">
                  <li><a href="#">Action</a></li>
                  <li><a href="#">Another action</a></li>
                  <li><a href="#">Something else here</a></li>
                  <li class="divider"></li>
                  <li class="nav-header">Nav header</li>
                  <li><a href="#">Separated link</a></li>
                  <li><a href="#">One more separated link</a></li>
                </ul>
              </li>
              <li><a href="#">Another action</a></li>
              <li><a href="#">Something else here</a></li>
              <li class="divider"></li>
              <li class="nav-header">Nav header</li>
              <li><a href="#">Separated link</a></li>
              <li><a href="#">One more separated link</a></li>
            </ul>
          </li>
        </ul>
        <form action="" class="navbar-search pull-left">
          <input type="text" placeholder="Search" class="search-query span2">
        </form>
        <ul class="nav pull-right">
          <li><a href="#">Link</a></li>
          <li class="divider-vertical"></li>
          <li class="dropdown">
            <a class="#" href="#">Menu</a>
          </li>
        </ul>
      </div>
      <!-- /.nav-collapse -->
    </div>
  </div>
</div>

<hr>

<ul class="nav nav-pills">
  <li class="active"><a href="#">Regular link</a></li>
  <li class="dropdown">
    <a href="#" data-toggle="dropdown" class="dropdown-toggle">Dropdown <b class="caret"></b></a>
    <ul class="dropdown-menu" id="menu1">
      <li>
        <a href="#">2-level Menu <i class="icon-arrow-right"></i></a>
        <ul class="dropdown-menu sub-menu">
          <li><a href="#">Action</a></li>
          <li><a href="#">Another action</a></li>
          <li><a href="#">Something else here</a></li>
          <li class="divider"></li>
          <li class="nav-header">Nav header</li>
          <li><a href="#">Separated link</a></li>
          <li><a href="#">One more separated link</a></li>
        </ul>
      </li>
      <li><a href="#">Another action</a></li>
      <li><a href="#">Something else here</a></li>
      <li class="divider"></li>
      <li><a href="#">Separated link</a></li>
    </ul>
  </li>
  <li class="dropdown">
    <a href="#">Menu</a>
  </li>
  <li class="dropdown">
    <a href="#">Menu</a>
  </li>
</ul>

Demo

 537
Author: Andres Ilich,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-29 18:18:37

Aby menu automatycznie spadało po najechaniu kursorem, można to osiągnąć za pomocą podstawowego CSS. Musisz przećwiczyć selektor do opcji ukrytego menu, a następnie ustawić go na wyświetlanie jako blok, gdy odpowiedni znacznik li jest najechany. Biorąc przykład ze strony Bootstrap na Twitterze, selektor będzie wyglądał następująco:

ul.nav li.dropdown:hover > ul.dropdown-menu {
    display: block;    
}

Jeśli jednak używasz funkcji responsywnych 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:

@media (min-width: 979px) {
  ul.nav li.dropdown:hover > ul.dropdown-menu {
    display: block;
  }
}

Aby ukryć strzałkę (karetkę), odbywa się to na różne sposoby w zależności od tego, czy używasz Twittera Bootstrap w wersji 2 i niższej, czy w wersji 3:

Bootstrap 3

Aby usunąć karetkę w wersji 3 wystarczy usunąć HTML {[5] } z elementu anchor .dropdown-toggle:

<a class="dropdown-toggle" data-toggle="dropdown" href="#">
    Dropdown
    <b class="caret"></b>    <-- remove this line
</a>

Bootstrap 2 & lower

Aby usunąć karetkę w wersji 2 potrzebujesz trochę więcej wglądu w CSS i sugerujemy przyjrzenie się bardziej szczegółowemu działaniu pseudo elementu :after. Aby rozpocząć swoją drogę do zrozumienia, aby kierować i usuwać strzałki w przykładzie Twitter bootstrap, użyjesz następującego selektora CSS i kodu:

a.menu:after, .dropdown-toggle:after {
    content: none;
}

Będzie to działać na Twoją korzyść, jeśli przyjrzysz się dalej, Jak to działa, a nie tylko skorzystasz z odpowiedzi, które ci dałem.

Dzięki @CocaAkat za zwrócenie uwagi, że brakowało nam kombinatora " > " child, aby zapobiec sub menu wyświetlane po najechaniu na rodzica

 879
Author: My Head Hurts,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-22 19:28:38

Oprócz odpowiedzi z "Boli mnie głowa "(co było świetne):

ul.nav li.dropdown:hover ul.dropdown-menu{
    display: block;    
}

Są 2 Problemy:

  1. kliknięcie na link rozwijany otworzy menu rozwijane. I pozostanie otwarty, chyba że użytkownik kliknie gdzieś indziej lub zawiesi kursor na nim, tworząc niezręczny interfejs użytkownika.
  2. pomiędzy linkiem rozwijanym i menu rozwijanym znajduje się margines 1px. Powoduje to, że menu rozwijane staje się ukryte, jeśli poruszasz się powoli między rozwijanym menu i menu rozwijane.
Rozwiązanie (1) polega na usunięciu elementów "class" i "data-toggle" z łącza nav
<a href="#">
     Dropdown
     <b class="caret"></b>
</a>

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 do (2) jest usunięcie margin-top na .dropdown-menu selector

.navbar .dropdown-menu {
 margin-top: 0px;
}
 221
Author: Cory Price,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-24 18:14:52

Użyłem trochę jQuery:

// Add hover effect to menus
jQuery('ul.nav li.dropdown').hover(function() {
  jQuery(this).find('.dropdown-menu').stop(true, true).delay(200).fadeIn();
}, function() {
  jQuery(this).find('.dropdown-menu').stop(true, true).delay(200).fadeOut();
});
 120
Author: John Montgomery,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-29 18:21:08

Jest tu wiele naprawdę dobrych rozwiązań. Ale pomyślałem, że zrobię to tutaj, jako alternatywę. To tylko prosty fragment jQuery, który robi to tak, jak zrobiłby to bootstrap, gdyby obsługiwał kursor dla rozwijanych menu zamiast po prostu kliknąć. Testowałem to tylko z wersją 3, więc nie wiem, czy zadziała z wersją 2. Zapisz go jako fragment w edytorze i umieść za naciśnięciem klawisza.

<script>
    $(function() {
        $(".dropdown").hover(
            function(){ $(this).addClass('open') },
            function(){ $(this).removeClass('open') }
        );
    });
</script>

W Zasadzie, to tylko powiedzenie, gdy unosisz się na Klasa rozwijana, doda do niej klasę otwartą. Wtedy to po prostu działa. Gdy zatrzymasz kursor na rodzicu li z rozwijaną klasą lub potomku ul / li, usunie on klasę otwartą. Oczywiście jest to tylko jedno z wielu rozwiązań i można do niego dodać, aby działało tylko na konkretnych instancjach .lista startowa. Lub dodać przejście do rodzica lub dziecka.

 64
Author: stereoscience,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-31 17:28:27

Po prostu dostosuj swój styl CSS w trzech liniach kodu

.dropdown:hover .dropdown-menu {
   display: block;
}
 62
Author: Ranjith,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-26 13:44:57

Jeśli masz element z klasą dropdown taką jak ta (na przykład):

<ul class="list-unstyled list-inline">
    <li class="dropdown">
        <a data-toggle="dropdown" href="#"><i class="fa fa-bars"></i> Dropdown 1</a>
        <ul class="dropdown-menu">
            <li><a href="">Item 1</a></li>
            <li><a href="">Item 2</a></li>
            <li><a href="">Item 3</a></li>
            <li><a href="">Item 4</a></li>
            <li><a href="">Item 5</a></li>
        </ul>
    </li>
    <li class="dropdown">
        <a data-toggle="dropdown" href="#"><i class="fa fa-user"></i> Dropdown 2</a>
        <ul class="dropdown-menu">
            <li><a href="">Item A</a></li>
            <li><a href="">Item B</a></li>
            <li><a href="">Item C</a></li>
            <li><a href="">Item D</a></li>
            <li><a href="">Item E</a></li>
        </ul>
    </li>
</ul>

Następnie możesz mieć rozwijane menu automatycznie rozwijane po najechaniu na nie, zamiast klikać jego tytuł, używając tego fragmentu kodu jQuery:

<script>
    $('.dropdown').hover(
        function() {
            $(this).find('.dropdown-menu').stop(true, true).delay(200).fadeIn();
        },
        function() {
            $(this).find('.dropdown-menu').stop(true, true).delay(200).fadeOut();
        }
    );

    $('.dropdown-menu').hover(
        function() {
            $(this).stop(true, true);
        },
        function() {
            $(this).stop(true, true).delay(200).fadeOut();
        }
    );
</script>

Oto demo

Ta odpowiedź opiera się na @Michael answer , wprowadziłem kilka zmian i dodałem kilka dodatków, aby menu rozwijane działało poprawnie

 20
Author: Amr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-29 18:38:14

[Update] wtyczka jest na GitHub i pracuję nad pewnymi ulepszeniami (np. używaj tylko z atrybutami danych (bez JS). Zostawiłam kod poniżej, ale to nie to samo co na Githubie.

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 karane za poślizg myszy, który wychodzi 1 px poza rozwijaną listę itp.), i jak wspomniano w komentarzach, jest to 1px z rozwijanej listy margines, z którym masz do czynienia lub czasami nav zamyka się nieoczekiwanie, gdy przenosisz się do listy rozwijanej z oryginalnego przycisku itp.

Stworzyłem szybki mały plugin, który użyłem na kilku stronach i działa ładnie. Każdy element nav jest obsługiwany niezależnie, więc mają własne timery opóźnienia, itp.

JS

// outside the scope of the jQuery plugin to
// keep track of all dropdowns
var $allDropdowns = $();

// if instantlyCloseOthers is true, then it will instantly
// shut other nav items when a new one is hovered over
$.fn.dropdownHover = function(options) {

    // the element we really care about
    // is the dropdown-toggle's parent
    $allDropdowns = $allDropdowns.add(this.parent());

    return this.each(function() {
        var $this = $(this).parent(),
            defaults = {
                delay: 500,
                instantlyCloseOthers: true
            },
            data = {
                delay: $(this).data('delay'),
                instantlyCloseOthers: $(this).data('close-others')
            },
            options = $.extend(true, {}, defaults, options, data),
            timeout;

        $this.hover(function() {
            if(options.instantlyCloseOthers === true)
                $allDropdowns.removeClass('open');

            window.clearTimeout(timeout);
            $(this).addClass('open');
        }, function() {
            timeout = window.setTimeout(function() {
                $this.removeClass('open');
            }, options.delay);
        });
    });
};  

Parametr delay jest dość oczywisty, a instantlyCloseOthers natychmiast zamknie wszystkie inne rozwijane listy, które są otwarte po najechaniu kursorem na nowy.

Nie czysty CSS, ale mam nadzieję, że pomoże komuś o tak późnej porze (tzn. jest to stary wątek).

Jeśli chcesz, możesz zobaczyć różne procesy, przez które przeszedłem (w dyskusji na IRC #concrete5), aby uruchomić go za pomocą różnych kroków w tym gist: https://gist.github.com/3876924

Podejście do wzorców wtyczek jest znacznie czystsze, aby obsługiwać Indywidualne Zegary itp.

Więcej informacji można znaleźć w wpisie na blogu .
 19
Author: CWSpear,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-26 19:56:46

To mi pomogło:

.dropdown:hover .dropdown-menu {
    display: block;
}
 16
Author: Amay Kulkarni,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-29 18:41:08

Jest to wbudowane w Bootstrap 3. Po prostu dodaj to do swojego CSS:

.dropdown:hover .dropdown-menu {
display: block;
}
 10
Author: BSUK,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-18 20:23:39

Jeszcze lepiej z jQuery:

jQuery('ul.nav li.dropdown').hover(function() {
  jQuery(this).find('.dropdown-menu').stop(true, true).show();
  jQuery(this).addClass('open');
}, function() {
  jQuery(this).find('.dropdown-menu').stop(true, true).hide();
  jQuery(this).removeClass('open');
});
 9
Author: caarlos0,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-17 01:51:38

Możesz użyć domyślnej metody $().dropdown('toggle'), aby przełączyć rozwijane menu po najechaniu kursorem:

$(".nav .dropdown").hover(function() {
  $(this).find(".dropdown-toggle").dropdown("toggle");
});
 9
Author: sdvnksv,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-23 08:47:18

Chcę tylko dodać, że jeśli masz wiele rozwijanych (tak jak ja) powinieneś napisać:

ul.nav li.dropdown:hover > ul.dropdown-menu {
    display: block;    
}
I będzie działać poprawnie.
 8
Author: Maxim Filippov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-17 22:11:11

Najlepszym sposobem na to jest po prostu uruchomienie zdarzenia kliknięcia Bootstrap za pomocą najechania kursorem. W ten sposób powinien pozostać przyjazny dla urządzeń dotykowych.

$('.dropdown').hover(function(){ 
  $('.dropdown-toggle', this).trigger('click'); 
});
 8
Author: Mark Williams,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-29 18:31:08

Moim zdaniem najlepszy sposób jest taki:

;(function($, window, undefined) {
    // Outside the scope of the jQuery plugin to
    // keep track of all dropdowns
    var $allDropdowns = $();

    // If instantlyCloseOthers is true, then it will instantly
    // shut other nav items when a new one is hovered over
    $.fn.dropdownHover = function(options) {

        // The element we really care about
        // is the dropdown-toggle's parent
        $allDropdowns = $allDropdowns.add(this.parent());

        return this.each(function() {
            var $this = $(this),
                $parent = $this.parent(),
                defaults = {
                    delay: 500,
                    instantlyCloseOthers: true
                },
                data = {
                    delay: $(this).data('delay'),
                    instantlyCloseOthers: $(this).data('close-others')
                },
                settings = $.extend(true, {}, defaults, options, data),
                timeout;

            $parent.hover(function(event) {

                // So a neighbor can't open the dropdown
                if(!$parent.hasClass('open') && !$this.is(event.target)) {
                    return true;
                }

                if(settings.instantlyCloseOthers === true)
                    $allDropdowns.removeClass('open');

                window.clearTimeout(timeout);
                $parent.addClass('open');
            }, function() {
                timeout = window.setTimeout(function() {
                    $parent.removeClass('open');
                }, settings.delay);
            });

            // This helps with button groups!
            $this.hover(function() {
                if(settings.instantlyCloseOthers === true)
                    $allDropdowns.removeClass('open');

                window.clearTimeout(timeout);
                $parent.addClass('open');
            });

            // Handle submenus
            $parent.find('.dropdown-submenu').each(function(){
                var $this = $(this);
                var subTimeout;
                $this.hover(function() {
                    window.clearTimeout(subTimeout);
                    $this.children('.dropdown-menu').show();

                    // Always close submenu siblings instantly
                    $this.siblings().children('.dropdown-menu').hide();
                }, function() {
                    var $submenu = $this.children('.dropdown-menu');
                    subTimeout = window.setTimeout(function() {
                        $submenu.hide();
                    }, settings.delay);
                });
            });
        });
    };

    $(document).ready(function() {
        // apply dropdownHover to all elements with the data-hover="dropdown" attribute
        $('[data-hover="dropdown"]').dropdownHover();
    });
})(jQuery, this);

Przykładowy znacznik:

<li class="dropdown">
    <a href="#" class="dropdown-toggle" data-toggle="dropdown" data-hover="dropdown" data-delay="1000" data-close-others="false">
        Account <b class="caret"></b>
    </a>
    <ul class="dropdown-menu">
        <li><a tabindex="-1" href="#">My Account</a></li>
        <li class="divider"></li>
        <li><a tabindex="-1" href="#">Change Email</a></li>
        <li><a tabindex="-1" href="#">Change Password</a></li>
        <li class="divider"></li>
        <li><a tabindex="-1" href="#">Logout</a></li>
    </ul>
</li>
 7
Author: Alex,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-29 18:30:00

Udało mi się to w następujący sposób:

$('ul.nav li.dropdown').hover(function(){
       $(this).children('ul.dropdown-menu').slideDown(); 
    }, function(){
       $(this).children('ul.dropdown-menu').slideUp(); 
});
Mam nadzieję, że to komuś pomoże...
 7
Author: Mehdi Maghrooni,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-29 18:30:29

Dodano również margin-top: 0, aby zresetować margines Bootstrap css dla .rozwijane-menu, aby lista menu nie znikała, gdy użytkownik najeżdża powoli z rozwijanego menu na listę menu.

ul.nav li.dropdown:hover > ul.dropdown-menu {
    display: block;    
}

.nav .dropdown-menu {
    margin-top: 0;
}
 5
Author: Sudharshan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-14 12:05:35

To prawdopodobnie głupi pomysł, ale aby po prostu usunąć strzałkę skierowaną w dół, Możesz usunąć

<b class="caret"></b>

To jednak nie robi nic dla wskazującego w górę...

 5
Author: stinaq,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-29 18:20:23

Opublikowałem odpowiedni plugin dla funkcji Bootstrap 3 rozwijanego hover, w którym możesz nawet zdefiniować, co się dzieje po kliknięciu na element dropdown-toggle (kliknięcie można wyłączyć):

Https://github.com/istvan-ujjmeszaros/bootstrap-dropdown-hover


Dlaczego to zrobiłem, skoro rozwiązań jest już wiele?

Miałem problemy ze wszystkimi istniejącymi wcześniej rozwiązaniami. Proste CSS nie używają klasy .open na .dropdown, więc nie będzie żadnych informacji zwrotnych na temat rozwijanego elementu przełączającego, gdy rozwijane jest widoczne.

Te js zakłócają klikanie na .dropdown-toggle, więc rozwijane pojawia się po najechaniu kursorem, a następnie ukrywa je po kliknięciu na otwartej rozwijanej, a przesunięcie myszy spowoduje, że rozwijane pojawi się ponownie. Niektóre z rozwiązań js łamią kompatybilność z iOS, niektóre wtyczki nie działają na nowoczesnych przeglądarkach desktopowych, które obsługują zdarzenia dotykowe.

Dlatego zrobiłem Bootstrap rozwijany Hover wtyczka , która zapobiega wszystkim tym problemom przez używając tylko standardowego Bootstrap javascript API, bez żadnych hack . Nawet atrybuty Aria działają dobrze z tą wtyczką.

 5
Author: István Ujj-Mészáros,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-25 01:49:43

Użyj tego kodu, aby otworzyć podmenu w mousehover (tylko na pulpicie):

$('ul.nav li.dropdown').hover(function () {
    if ($(window).width() > 767) {
        $(this).find('.dropdown-menu').show();
    }
}, function () {
    if ($(window).width() > 767) {
        $(this).find('.dropdown-menu').hide().css('display','');
    }
});

I jeśli chcesz, aby menu pierwszego poziomu było klikalne, nawet na telefonie dodaj to:

    $('.dropdown-toggle').click(function() {
    if ($(this).next('.dropdown-menu').is(':visible')) {
        window.location = $(this).attr('href');
    }
});

Podmenu (menu rozwijane) zostanie otwarte za pomocą mousehover na komputerze, a za pomocą click/touch na telefonie komórkowym i tablecie. Po otwarciu podmenu drugie kliknięcie pozwoli Ci otworzyć link. Dzięki if ($(window).width() > 767), podmenu zajmie pełną szerokość ekranu w telefonie komórkowym.

 4
Author: Jibato,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-10 15:53:14
$('.dropdown').hover(function(e){$(this).addClass('open')})
 4
Author: Савостьянов Максим,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-14 13:45:08

To ukryje up one

.navbar .dropdown-menu:before {
   display:none;
}
.navbar .dropdown-menu:after {
   display:none;
}
 3
Author: allochi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-11 16:26:06

To powinno ukryć spadki i ich karetki, jeśli są mniejsze niż tabletka.

@media (max-width: 768px) {
    .navbar ul.dropdown-menu, .navbar li.dropdown b.caret {
        display: none;
    }
}
 3
Author: Kevin Nuut,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-17 22:12:07

Rozwiązanie jQuery jest dobre, ale będzie musiało radzić sobie z wydarzeniami kliknięć (na telefon komórkowy lub tablet), ponieważ hover nie będzie działać poprawnie... Może uda Ci się wykryć zmianę rozmiaru okna?

Odpowiedź Andres Ilich wydaje się działać dobrze, ale powinna być owinięta w Zapytanie medialne:
@media (min-width: 980px) {

    .dropdown-menu .sub-menu {
        left: 100%;
        position: absolute;
        top: 0;
        visibility: hidden;
        margin-top: -1px;
    }

    .dropdown-menu li:hover .sub-menu {
        visibility: visible;
    }

    .dropdown:hover .dropdown-menu {
        display: block;
    }

    .nav-tabs .dropdown-menu, .nav-pills .dropdown-menu, .navbar .dropdown-menu {
        margin-top: 0;
    }

    .navbar .sub-menu:before {
        border-bottom: 7px solid transparent;
        border-left: none;
        border-right: 7px solid rgba(0, 0, 0, 0.2);
        border-top: 7px solid transparent;
        left: -7px;
        top: 10px;
    }
    .navbar .sub-menu:after {
        border-top: 6px solid transparent;
        border-left: none;
        border-right: 6px solid #fff;
        border-bottom: 6px solid transparent;
        left: 10px;
        top: 11px;
        left: -6px;
    }
}
 3
Author: Fizex,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-29 18:23:22

Zastąp bootstrap.js z tym skryptem.

jQuery(document).ready(function ($) {
$('.navbar .dropdown').hover(function() {
    $(this).addClass('extra-nav-class').find('.dropdown-menu').first().stop(true, true).delay(250).slideDown();
}, function() {
    var na = $(this)
    na.find('.dropdown-menu').first().stop(true, true).delay(100).slideUp('fast', function(){ na.removeClass('extra-nav-class') })
});

$('.dropdown-submenu').hover(function() {
    $(this).addClass('extra-nav-class').find('.dropdown-menu').first().stop(true, true).delay(250).slideDown();
}, function() {
    var na = $(this)
    na.find('.dropdown-menu').first().stop(true, true).delay(100).slideUp('fast', function(){ na.removeClass('extra-nav-class') })
});

}); 
 2
Author: Hari Krishnan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-22 05:53:21

Oto moja technika, która dodaje niewielkie opóźnienie przed zamknięciem menu po zatrzymaniu kursora myszy na menu lub przycisku przełączania. <button>, które zwykle klikasz, aby wyświetlić menu nav, to #nav_dropdown.

$(function() {
  var delay_close_it, nav_menu_timeout, open_it;
  nav_menu_timeout = void 0;
  open_it = function() {
    if (nav_menu_timeout) {
      clearTimeout(nav_menu_timeout);
      nav_menu_timeout = null;
    }
    return $('.navbar .dropdown').addClass('open');
  };
  delay_close_it = function() {
    var close_it;
    close_it = function() {
      return $('.navbar .dropdown').removeClass('open');
    };
    return nav_menu_timeout = setTimeout(close_it, 500);
  };
  $('body').on('mouseover', '#nav_dropdown, #nav_dropdown *', open_it).on('mouseout', '#nav_dropdown', delay_close_it);
  return $('body').on('mouseover', '.navbar .dropdown .dropdown-menu', open_it).on('mouseout', '.navbar .dropdown .dropdown-menu', delay_close_it);
});
 2
Author: Sarah Vessels,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-18 19:43:21

Aby poprawić odpowiedź Sudharshana , zawijam to w Zapytanie o media, aby zapobiec najechaniu kursorem, gdy na szerokości wyświetlacza XS...

@media (min-width:768px)
{
    ul.nav li.dropdown:hover > ul.dropdown-menu {
        display: block;    
    }

    .nav .dropdown-menu {
        margin-top: 0;
    }
}

Również karetka w znacznikach nie jest wymagana, tylko klasa rozwijana dla li .

 2
Author: johna,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:47:26

To działa dla WordPress Bootstrap:

.navbar .nav > li > .dropdown-menu:after,
.navbar .nav > li > .dropdown-menu:before {
    content: none;
}
 2
Author: Fred K,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-29 18:23:46

Więc masz ten kod:

<a class="dropdown-toggle" data-toggle="dropdown">Show menu</a>

<ul class="dropdown-menu" role="menu">
    <li>Link 1</li>
    <li>Link 2</li> 
    <li>Link 3</li>                                             
</ul>

Zwykle działa na zdarzeniu kliknięcia i chcesz, aby działało na zdarzeniu najazdu. Jest to bardzo proste, wystarczy użyć tego kodu JavaScript / jQuery:

$(document).ready(function () {
    $('.dropdown-toggle').mouseover(function() {
        $('.dropdown-menu').show();
    })

    $('.dropdown-toggle').mouseout(function() {
        t = setTimeout(function() {
            $('.dropdown-menu').hide();
        }, 100);

        $('.dropdown-menu').on('mouseenter', function() {
            $('.dropdown-menu').show();
            clearTimeout(t);
        }).on('mouseleave', function() {
            $('.dropdown-menu').hide();
        })
    })
})

To działa bardzo dobrze i oto Wyjaśnienie: mamy przycisk i menu. Po najechaniu na przycisk wyświetlamy menu, a po najechaniu na przycisk ukrywamy menu po 100 ms. Jeśli zastanawiasz się, dlaczego tego używam, to dlatego, że potrzebujesz czasu, aby przeciągnąć kursor z przycisku nad menu. Kiedy jesteś w menu, czas jest resetowany i możesz pozostać tam tyle czasu, ile chcesz. Po wyjściu z menu natychmiast ukryjemy menu bez limitu czasu.

Używałem tego kodu w wielu projektach, jeśli napotkasz jakiś problem z jego użyciem, nie krępuj się zadawać mi pytań.

 2
Author: Crisan Raluca Teodora,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-29 18:32:52

Dla karetki... Nie widziałem żadnego określającego prosty CSS, który całkowicie blokuje karetkę.

Proszę bardzo:

.caret {
    display: none !important;
}
 2
Author: Restartit Fbapp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-29 18:39:07