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


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.