Випадання завантажувальної програми за допомогою наведення курсора


179

Гаразд, тому що мені потрібно досить просто.

Я встановив навбар з деякими спадніми меню в ньому (використовуючи class="dropdown-toggle" data-toggle="dropdown"), і він працює чудово.

Річ у тім, що вона працює " onClick", тоді як я вважаю за краще, щоб вона працювала " onHover".

Чи є якийсь вбудований спосіб зробити це?


Дивіться мій нещодавно опублікований належний плагін, який запобігає виникненню нижчезазначених
István Ujj-Mészáros

Відповіді:


338

Найпростіше рішення було б у CSS. Додайте щось на кшталт ...

.dropdown:hover .dropdown-menu {
    display: block;
    margin-top: 0; // remove the gap so it doesn't close
 }

Робоча скрипка


3
Так набагато краще, ніж довгі «повноцінні» рішення. Просто додайте це, і випадаюче меню "натискання" за замовчуванням працює на наведення курсора без зайвих змін.
IamFace

47
Це буде суперечити вбудованому мобільному меню, тому вам слід загорнути його в точку перерви @media (min-width: 480px)
Біллі Ших

7
Також примітно: якщо у вас є спадне меню з стосунками батько-дитина, наприклад, у темі Wordpress, вам потрібно видалити data-toggleатрибут, щоб зробити батьківський елемент можливим натискання ... Просто слідкуйте за пошкодженням застави на екранах мобільних пристроїв.
Кен Принс

2
Чи є якийсь простий спосіб, як відключити показ при натисканні і зберегти лише поведінку наведення?
Micer

1
@Micer, я щойно опублікував плагін, в якому ви можете відключити подію натискання. Плагін працює без будь-якого хакера CSS, використовуючи лише API JavaScript Bootstrap, тому він сумісний з усіма пристроями: github.com/istvan-ujjmeszaros/bootstrap-dropdown-hover
István Ujj-Mészáros

66

Найкращий спосіб зробити це - просто запустити подію натискання завантажувальної машини за допомогою наведення курсору. Таким чином, він все одно повинен залишатися зручним для пристроїв із дотиком

$('.dropdown').hover(function(){ 
  $('.dropdown-toggle', this).trigger('click'); 
});

1
не вдасться, якщо у вас є більше одного рівня
спадання

1
Не працює з батьківським посиланням
піо

чи є спосіб видалити клас Active після закриття спадного меню?
мозковий відділ

Існує піксельний розрив між елементом, що випадає, та меню, який може спричинити приховання меню колись переходу, якщо ви не швидкі
Метт

1
Для використання декількох спадових меню потрібна деяка «найближча» фільтрація.
помилка

57

Ви можете скористатися функцією наведення jQuery.

Вам просто потрібно додати клас, openколи миша входить, і видалити клас, коли миша покидає спадне меню.

Ось мій код:

$(function(){
    $('.dropdown').hover(function() {
        $(this).addClass('open');
    },
    function() {
        $(this).removeClass('open');
    });
});

10
Шлях краще, ніж прийнята відповідь імхо. Це залишає недоторканими всю логіку завантаження та стилізацію. Хоча я б радив використовувати другий зворотній дзвінок і явно використовувати deleteClass і addClass, щоб запобігти деякій поведінці при натисканні на кнопку (де вона відкриється, коли ви покинете кнопку, і закриється, коли ви входите в неї).
Бастіан Ліндерс

3
Я також думаю, що це найкраща відповідь. Щоб змусити його працювати з меню Bootstrap 4, мені довелося використовувати showзамість open, а також включити dropdown-menu: $('.dropdown').hover(function() { $(this).addClass('show'); $(this).find('.dropdown-menu').addClass('show');}, function() {$(this).removeClass('show'); $(this).find('.dropdown-menu').removeClass('show');});(Вибачте за форматування)
Робін Циммерманн

Не працюйте, якщо у вас є два пункти меню, що випадає. Після наведення курсора на будь-який пункт, що випадає, буде показано обидва підменю
Juan Antonio Tubío

23

Простий спосіб за допомогою jQuery:

$(document).ready(function(){
    $('ul.nav li.dropdown').hover(function() {
      $(this).find('.dropdown-menu').stop(true, true).delay(200).fadeIn(200);
    }, function() {
      $(this).find('.dropdown-menu').stop(true, true).delay(200).fadeOut(200);
    });  
});

Я люблю плавний перехід, проте він змушує розширювати всі рівні меню замість лише першого рівня. Я не хочу, щоб меню другого рівня з’являлися, поки не наведіть курсор на їх батьків.
Connie DeCinko

1
Щоб отримати лише перший рівень, додайте .first() - $(this).find('.dropdown-menu').first().stop(true, true).delay(200).fadeIn(200);...
JEdot

9

Для CSS це стає божевільним, коли ви також натискаєте на нього. Це код, який я використовую, але він також нічого не змінює для мобільного перегляду.

$('.dropdown').mouseenter(function(){
    if(!$('.navbar-toggle').is(':visible')) { // disable for mobile view
        if(!$(this).hasClass('open')) { // Keeps it open when hover it again
            $('.dropdown-toggle', this).trigger('click');
        }
    }
});

Красуня! Тх! Замінники CSS не працюватимуть на Bootstrap 3 і далі.
Педро Феррейра



5

Отже, у вас є цей код:

<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>

Зазвичай він працює на події натискання, і ви хочете, щоб він працював над подією наведення. Це дуже просто, просто використовуйте цей код 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();
        })
    })
})

Це працює дуже добре, і ось пояснення: у нас є кнопка та меню. Коли ми натискаємо кнопку, ми відображаємо меню, а при натисканні кнопки ми приховуємо меню через 100 мс. Якщо вам цікаво, чому я це використовую, це тому, що вам потрібен час, щоб перетягнути курсор з кнопки на меню. Коли ви перебуваєте в меню, час скидається, і ви можете залишитися там скільки завгодно часу. Коли ви виходите з меню, ми будемо миттєво приховувати меню без будь-якого тайм-ауту.

Я використовував цей код у багатьох проектах, якщо у вас виникли проблеми з його використанням, не соромтесь задавати мені питання.


Цей код має багато проблем на bootstrap v3. 1.) Якщо спаду більше, ніж один, усі спадні вікна відображаються, коли будь-яке спадання наводиться. 2.) На невеликих екранах наведення курсору дивним чином показує спадне меню.
KayakinKoder

4

Це те, що я використовую для того, щоб зробити спадне місце наведення курсору з деяким jQuery

$(document).ready(function () {
    $('.navbar-default .navbar-nav > li.dropdown').hover(function () {
        $('ul.dropdown-menu', this).stop(true, true).slideDown('fast');
        $(this).addClass('open');
    }, function () {
        $('ul.dropdown-menu', this).stop(true, true).slideUp('fast');
        $(this).removeClass('open');
    });
});

Приємно, але не підтримує підменю.
Connie DeCinko

3

Спробуйте це за допомогою функції наведення курсора з анімацією fadein fadeout

$('ul.nav li.dropdown').hover(function() {
  $(this).find('.dropdown-menu').stop(true, true).delay(200).fadeIn(500);
}, function() {
  $(this).find('.dropdown-menu').stop(true, true).delay(200).fadeOut(500);
});

Ця анімація не працює на 3-й глибині, але працює на 2-й глибині. Чи є у вас якесь інше рішення для 3-ї глибини?
Jilani A

будь ласка, додайте JSFiddle для довідки
Ракеш Ваднал,

2

Це допоможе вам скласти власний клас наведення курсора для завантаження:

CSS:

/* Hover dropdown */
.hover_drop_down.input-group-btn ul.dropdown-menu{margin-top: 0px;}/*To avoid unwanted close*/
.hover_drop_down.btn-group ul.dropdown-menu{margin-top:2px;}/*To avoid unwanted close*/
.hover_drop_down:hover ul.dropdown-menu{
   display: block;
}

Поля встановлюється, щоб уникнути небажаного закриття, і вони необов’язкові.

HTML:

<div class="btn-group hover_drop_down">
  <button type="button" class="btn btn-default" data-toggle="dropdown"></button>
  <ul class="dropdown-menu" role="menu">
    ...
  </ul>
</div>

Не забудьте видалити атрибут кнопки data-toggle = "dropdown", якщо ви хочете видалити onclick open, і це також спрацює, коли введення додається зі спадним меню.


2

Це наближається до навбака лише тоді, коли ви не перебуваєте на мобільному пристрої, оскільки я вважаю, що навігація навігації не працює добре на мобільних пристроях:

    $( document ).ready(function() {

    $( 'ul.nav li.dropdown' ).hover(function() {
        // you could also use this condition: $( window ).width() >= 768
        if ($('.navbar-toggle').css('display') === 'none' 
            && false === ('ontouchstart' in document)) {

            $( '.dropdown-toggle', this ).trigger( 'click' );
        }
    }, function() {
        if ($('.navbar-toggle').css('display') === 'none'
            && false === ('ontouchstart' in document)) {

            $( '.dropdown-toggle', this ).trigger( 'click' );
        }
    });

});

Ви можете знайти набагато краще рішення тут: github.com/CWSpear/bootstrap-hover-dropdown .
solarbaypilot

2

Я пробую інші рішення, я використовую завантажувальний 3, але випадаюче меню закривається занадто швидко, щоб перейти по ньому

припускаємо, що ви додали class = "dropdown" до li, я додав тайм-аут

var hoverTimeout;
$('.dropdown').hover(function() {
    clearTimeout(hoverTimeout);
    $(this).addClass('open');
}, function() {
    var $self = $(this);
    hoverTimeout = setTimeout(function() {
        $self.removeClass('open');
    }, 150);
});

2

Оновлено відповідним плагіном

Я опублікував належний плагін для функціональності випадаючого курсору, в якому ви навіть можете визначити, що відбувається при натисканні на dropdown-toggleелемент:

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


Чому я це зробив, коли вже є багато рішень?

У мене були проблеми з усіма існуючими раніше рішеннями. Прості CSS не використовують .openклас на .dropdown, тому не буде зворотного зв'язку щодо елемента перемикання, що випадає, коли видно спадне меню.

Js вони перешкоджають натисканню .dropdown-toggle, тому спадне меню відображається на наведення курсору, потім приховує його при натисканні на відкрите спадне меню, а переміщення миші призведе до того, що спадне меню з’явиться знову. Деякі з рішень js гальмують сумісність iOS, деякі додатки не працюють на сучасних настільних браузерах, які підтримують сенсорні події.

Ось чому я створив плагін Bootstrap Dropdown Hover, який запобігає всім цим проблемам, використовуючи лише стандартний API JavaScript Bootstrap без будь-якого злому.


1
    $('.navbar .dropdown').hover(function() {
      $(this).find('.dropdown-menu').first().stop(true, true).slideDown(150);
    }, function() {
      $(this).find('.dropdown-menu').first().stop(true, true).slideUp(105)
    });

1

Ініціювання clickподії з а hoverмає невелику помилку. Якщо mouse-inі тоді clickстворює ефект навпаки. Це opensколи mouse-outі closeколи mouse-in. Краще рішення:

$('.dropdown').hover(function() {
    if (!($(this).hasClass('open'))) {
        $('.dropdown-toggle', this).trigger('click');
    }
}, function() {
    if ($(this).hasClass('open')) {
        $('.dropdown-toggle', this).trigger('click');
    }
});

1

html

        <div class="dropdown">

            <button class="btn btn-primary dropdown-toggle" type="button" data-toggle="dropdown">
                Dropdown Example <span class="caret"></span>
            </button>

            <ul class="dropdown-menu">
                <li><a href="#">HTML</a></li>
                <li><a href="#">CSS</a></li>
                <li><a href="#">JavaScript</a></li>
            </ul>

        </div> 

jquery

        $(document).ready( function() {                

            /* $(selector).hover( inFunction, outFunction ) */
            $('.dropdown').hover( 
                function() {                        
                    $(this).find('ul').css({
                        "display": "block",
                        "margin-top": 0
                    });                        
                }, 
                function() {                        
                    $(this).find('ul').css({
                        "display": "none",
                        "margin-top": 0
                    });                        
                } 
            );

        });

кодоп


0

Пропоноване нами рішення виявляє, якщо його не торкається пристрій, і що navbar-toggle(меню гамбургерів) не видно, і робить елемент батьківського меню, що відкриває підменю на курсор, і переходить за його посиланням при натисканні .

Також робить tne margin-top 0, оскільки розрив між навігаційною панеллю та меню в деяких браузерах не дасть вам навести курсор на підпункти

$(function(){
    function is_touch_device() {
        return 'ontouchstart' in window        // works on most browsers 
        || navigator.maxTouchPoints;       // works on IE10/11 and Surface
    };

    if(!is_touch_device() && $('.navbar-toggle:hidden')){
      $('.dropdown-menu', this).css('margin-top',0);
      $('.dropdown').hover(function(){ 
          $('.dropdown-toggle', this).trigger('click').toggleClass("disabled"); 
      });			
    }
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/>

<ul id="nav" class="nav nav-pills clearfix right" role="tablist">
    <li><a href="#">menuA</a></li>
    <li><a href="#">menuB</a></li>
    <li class="dropdown"><a href="#" class="dropdown-toggle" data-toggle="dropdown">menuC</a>
        <ul id="products-menu" class="dropdown-menu clearfix" role="menu">
            <li><a href="">A</a></li>
            <li><a href="">B</a></li>
            <li><a href="">C</a></li>
            <li><a href="">D</a></li>
        </ul>
    </li>
    <li><a href="#">menuD</a></li>
    <li><a href="#">menuE</a></li>
</ul>

$(function(){
  $("#nav .dropdown").hover(
    function() {
      $('#products-menu.dropdown-menu', this).stop( true, true ).fadeIn("fast");
      $(this).toggleClass('open');
    },
    function() {
      $('#products-menu.dropdown-menu', this).stop( true, true ).fadeOut("fast");
      $(this).toggleClass('open');
    });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/>

<ul id="nav" class="nav nav-pills clearfix right" role="tablist">
    <li><a href="#">menuA</a></li>
    <li><a href="#">menuB</a></li>
    <li class="dropdown"><a href="#" class="dropdown-toggle" data-toggle="dropdown">menuC</a>
        <ul id="products-menu" class="dropdown-menu clearfix" role="menu">
            <li><a href="">A</a></li>
            <li><a href="">B</a></li>
            <li><a href="">C</a></li>
            <li><a href="">D</a></li>
        </ul>
    </li>
    <li><a href="#">menuD</a></li>
    <li><a href="#">menuE</a></li>
</ul>


0

Спадне меню завантажувального пристрою Працюйте на наведення курсору та залишайтесь близьким при натисканні, додавши відображення властивості : блок; в css та видалення цих атрибутів data-toggle = "dropdown" role = "button" з кнопки тегу

.dropdown:hover .dropdown-menu {
  display: block;
}
<!DOCTYPE html>
<html>
<head>
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.0/css/bootstrap.min.css">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.0/js/bootstrap.min.js"></script>
</head>
<body>

<div class="container">                                     
  <div class="dropdown">
    <button class="btn btn-primary dropdown-toggle">Dropdown Example
    <span class="caret"></span></button>
    <ul class="dropdown-menu">
      <li><a href="#">HTML</a></li>
      <li><a href="#">CSS</a></li>
      <li><a href="#">JavaScript</a></li>
    </ul>
  </div>
</div>

</body>
</html>

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.