Добавление эффекта слайда в раскрывающийся список бутстрапов

Я использую загрузчик, и я хотел бы добавить анимацию в раскрывающийся список. Я хочу добавить к нему анимацию, скользить вниз и назад при выходе из нее. Как я мог это сделать?

Вещи, которые я пытался:

Изменение выпадающего файла Js следующим образом:

Как сделать так, чтобы выпадающее меню Bootstrap плавно перемещалось вверх и вниз?

Ответ 1

Если вы обновляетесь до Bootstrap 3 (BS3), они открыли много событий Javascript, которые хороши для привязки нужной вам функциональности. В BS3 этот код предоставит всем раскрывающимся меню эффект анимации, который вы ищете:

  // Add slideDown animation to Bootstrap dropdown when expanding.
  $('.dropdown').on('show.bs.dropdown', function() {
    $(this).find('.dropdown-menu').first().stop(true, true).slideDown();
  });

  // Add slideUp animation to Bootstrap dropdown when collapsing.
  $('.dropdown').on('hide.bs.dropdown', function() {
    $(this).find('.dropdown-menu').first().stop(true, true).slideUp();
  });

Вы можете прочитать о событиях BS3 здесь и, в частности, о выпадающих событиях здесь.

Ответ 2

Также можно избежать использования JavaScript для выпадающего эффекта и использовать переход CSS3, добавив этот небольшой фрагмент кода в свой стиль:

.dropdown .dropdown-menu {
    -webkit-transition: all 0.3s;
    -moz-transition: all 0.3s;
    -ms-transition: all 0.3s;
    -o-transition: all 0.3s;
    transition: all 0.3s;

    max-height: 0;
    display: block;
    overflow: hidden;
    opacity: 0;
}

.dropdown.open .dropdown-menu { /* For Bootstrap 4, use .dropdown.show instead of .dropdown.open */
    max-height: 300px;
    opacity: 1;
}

Единственная проблема с этим способом состоит в том, что вы должны вручную указать максимальную высоту. Если вы установите очень большое значение, ваша анимация будет очень быстрой.

Это работает как шарм, если вы знаете приблизительную высоту выпадающих меню, в противном случае вы все равно можете использовать javascript, чтобы установить точное значение максимальной высоты.

Вот небольшой пример: ДЕМО


! В этом решении есть небольшая ошибка с отступом, проверьте комментарий Jacob Stamm с решением.

Ответ 3

Я делаю что-то в этом роде, но при наведении курсора вместо щелчка. Это код, который я использую, возможно, вы сможете немного его настроить, чтобы он работал при нажатии.

$('.navbar .dropdown').hover(function() {
  $(this).find('.dropdown-menu').first().stop(true, true).delay(250).slideDown();
}, function() {
  $(this).find('.dropdown-menu').first().stop(true, true).delay(100).slideUp()
});

Ответ 4

Я не знаю, смогу ли я поднять этот поток, но я нашел быстрое решение для визуальной ошибки, которая возникает, когда открытый класс удаляется слишком быстро. По сути, все, что нужно сделать, это добавить функцию OnComplete в событие slideUp и сбросить все активные классы и атрибуты. Идет примерно так:

Вот результат: пример Bootply

Javascript/Jquery:

$(function(){
    // ADD SLIDEDOWN ANIMATION TO DROPDOWN //
    $('.dropdown').on('show.bs.dropdown', function(e){
        $(this).find('.dropdown-menu').first().stop(true, true).slideDown();
    });

    // ADD SLIDEUP ANIMATION TO DROPDOWN //
    $('.dropdown').on('hide.bs.dropdown', function(e){
        e.preventDefault();
        $(this).find('.dropdown-menu').first().stop(true, true).slideUp(400, function(){
            //On Complete, we reset all active dropdown classes and attributes
            //This fixes the visual bug associated with the open class being removed too fast
            $('.dropdown').removeClass('show');
            $('.dropdown-menu').removeClass('show');
            $('.dropdown').find('.dropdown-toggle').attr('aria-expanded','false');
        });
    });
});

Ответ 5

вот мое решение для эффекта слайда и затухания:

   // Add slideup & fadein animation to dropdown
   $('.dropdown').on('show.bs.dropdown', function(e){
      var $dropdown = $(this).find('.dropdown-menu');
      var orig_margin_top = parseInt($dropdown.css('margin-top'));
      $dropdown.css({'margin-top': (orig_margin_top + 10) + 'px', opacity: 0}).animate({'margin-top': orig_margin_top + 'px', opacity: 1}, 300, function(){
         $(this).css({'margin-top':''});
      });
   });
   // Add slidedown & fadeout animation to dropdown
   $('.dropdown').on('hide.bs.dropdown', function(e){
      var $dropdown = $(this).find('.dropdown-menu');
      var orig_margin_top = parseInt($dropdown.css('margin-top'));
      $dropdown.css({'margin-top': orig_margin_top + 'px', opacity: 1, display: 'block'}).animate({'margin-top': (orig_margin_top + 10) + 'px', opacity: 0}, 300, function(){
         $(this).css({'margin-top':'', display:''});
      });
   });

Ответ 6

В щелчке это можно сделать, используя код ниже

$('.dropdown-toggle').click(function() {
  $(this).next('.dropdown-menu').slideToggle(500);
});

Ответ 7

Я использую код выше, но я изменил эффект задержки методом slideToggle.

Он уменьшает выпадающее меню при наведении анимации.

$('.navbar .dropdown').hover(function() {
    $(this).find('.dropdown-menu').first().stop(true, true).slideToggle(400);
    }, function() {
    $(this).find('.dropdown-menu').first().stop(true, true).slideToggle(400)
    });

Ответ 8

Обновление Bootstrap 4 2018

В Boostrap 4 класс .open был заменен на .show. Я хотел реализовать это, используя только переходы CSS без необходимости дополнительного JS или jQuery...

.show > .dropdown-menu {
  max-height: 900px;
  visibility: visible;
}

.dropdown-menu {
  display: block;
  max-height: 0;
  visibility: hidden;
  transition: all 0.5s ease-in-out;
  overflow: hidden;
}

Демо: https://www.codeply.com/go/3i8LzYVfMF

Примечание. Для параметра max-height можно задать любое большое значение, достаточное для размещения раскрывающегося содержимого.

Ответ 9

Расширенный ответ, был моим первым ответом, поэтому извините, если раньше не было достаточно деталей.

Для Bootstrap 3.x я лично предпочитаю анимацию CSS, и я использую animate.css и вместе с Bootstrap Dropdown Javascript Hooks. Хотя это может и не иметь точно такого эффекта, что вы после этого довольно гибкий подход.

Шаг 1: Добавьте animate.css на свою страницу с тегами заголовка:

<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/animate.css/3.4.0/animate.min.css">

Шаг 2: Используйте стандартный бутстрап HTML на триггере:

<div class="dropdown">
  <button type="button" data-toggle="dropdown">Dropdown trigger</button>

  <ul class="dropdown-menu">
    ...
  </ul>
</div>

Шаг 3: Затем добавьте два атрибута пользовательских данных в элемент меню dropdrop; data-drop-in для анимации и выпадающего списка данных для анимации out. Это могут быть любые эффекты animate.css, такие как fadeIn или fadeOut

<ul class="dropdown-menu" data-dropdown-in="fadeIn" data-dropdown-out="fadeOut">
......
</ul>

Шаг 4:. Затем добавьте следующий Javascript, чтобы прочитать атрибуты данных выпадающего меню/выхода и реагировать на крючки/события Bootstrap Javascript API (http://getbootstrap.com/javascript/#dropdowns-events):

var dropdownSelectors = $('.dropdown, .dropup');

// Custom function to read dropdown data
// =========================
function dropdownEffectData(target) {
  // @todo - page level global?
  var effectInDefault = null,
      effectOutDefault = null;
  var dropdown = $(target),
      dropdownMenu = $('.dropdown-menu', target);
  var parentUl = dropdown.parents('ul.nav'); 

  // If parent is ul.nav allow global effect settings
  if (parentUl.size() > 0) {
    effectInDefault = parentUl.data('dropdown-in') || null;
    effectOutDefault = parentUl.data('dropdown-out') || null;
  }

  return {
    target:       target,
    dropdown:     dropdown,
    dropdownMenu: dropdownMenu,
    effectIn:     dropdownMenu.data('dropdown-in') || effectInDefault,
    effectOut:    dropdownMenu.data('dropdown-out') || effectOutDefault,  
  };
}

// Custom function to start effect (in or out)
// =========================
function dropdownEffectStart(data, effectToStart) {
  if (effectToStart) {
    data.dropdown.addClass('dropdown-animating');
    data.dropdownMenu.addClass('animated');
    data.dropdownMenu.addClass(effectToStart);    
  }
}

// Custom function to read when animation is over
// =========================
function dropdownEffectEnd(data, callbackFunc) {
  var animationEnd = 'webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend';
  data.dropdown.one(animationEnd, function() {
    data.dropdown.removeClass('dropdown-animating');
    data.dropdownMenu.removeClass('animated');
    data.dropdownMenu.removeClass(data.effectIn);
    data.dropdownMenu.removeClass(data.effectOut);

    // Custom callback option, used to remove open class in out effect
    if(typeof callbackFunc == 'function'){
      callbackFunc();
    }
  });
}

// Bootstrap API hooks
// =========================
dropdownSelectors.on({
  "show.bs.dropdown": function () {
    // On show, start in effect
    var dropdown = dropdownEffectData(this);
    dropdownEffectStart(dropdown, dropdown.effectIn);
  },
  "shown.bs.dropdown": function () {
    // On shown, remove in effect once complete
    var dropdown = dropdownEffectData(this);
    if (dropdown.effectIn && dropdown.effectOut) {
      dropdownEffectEnd(dropdown, function() {}); 
    }
  },  
  "hide.bs.dropdown":  function(e) {
    // On hide, start out effect
    var dropdown = dropdownEffectData(this);
    if (dropdown.effectOut) {
      e.preventDefault();   
      dropdownEffectStart(dropdown, dropdown.effectOut);   
      dropdownEffectEnd(dropdown, function() {
        dropdown.dropdown.removeClass('open');
      }); 
    }    
  }, 
});

Шаг 5 (необязательно): Если вы хотите ускорить или изменить анимацию, вы можете сделать это с помощью CSS, как показано ниже:

.dropdown-menu.animated {
  /* Speed up animations */
  -webkit-animation-duration: 0.55s;
  animation-duration: 0.55s;
  -webkit-animation-timing-function: ease;
  animation-timing-function: ease;
}

Написал статью с более подробной информацией и загрузкой, если вам интересно: статья: http://bootbites.com/tutorials/bootstrap-dropdown-effects-animatecss

Надеюсь, что это полезно, и эта вторая запись имеет необходимый уровень детализации Том

Ответ 10

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

Этот код работает, если вы хотите раскрывать выпадающие списки при наведении указателя мыши.

Я просто изменил .slideToggle на .slideDown и .slideUp и удалил (400) timing

Ответ 11

BOOTSTRAP 3 ССЫЛКА

Добавил, потому что меня все время ловит решение в этой теме, и оно каждый раз меня заполняет.

По сути, раскрывающийся список BS немедленно удаляет класс .open из родительского, поэтому скольжение вверх не работает.

Используйте тот же бит, что и другие решения для slideDown();

// ADD SLIDEUP ANIMATION TO DROPDOWN //
$('.dropdown').on('hide.bs.dropdown', function(e){
  e.preventDefault();
  $(this).find('.dropdown-menu').first().stop(true, true).slideUp(300, function(){
    $(this).parent().removeClass('open');
  });
});

Ответ 12

Вот хорошее простое решение, использующее jQuery, которое прекрасно работает:

$('.dropdown-toggle').click(function () {
    $(this).next('.dropdown-menu').slideToggle(300);
});

$('.dropdown-toggle').focusout(function () {
    $(this).next('.dropdown-menu').slideUp(300);
})

Переключение слайд-анимации происходит при нажатии и всегда ускоряется при проигрывании фокуса.

Измените значение 300 на все, что хотите, тем меньше число, чем быстрее анимация.

Edit:

Это решение будет работать только для рабочего стола. Для того, чтобы хорошо отображать мобильные устройства, потребуется дополнительная модификация.

Ответ 13

В Bootstrap 3 этот вариант ответов выше делает slideUp() mobile slideUp() более плавной; Ответы выше содержат прерывистую анимацию, поскольку Bootstrap .open удаляет класс .open из родительского .open -переключателя, поэтому этот код восстанавливает класс до тех пор, пока не slideUp() анимация slideUp().

// Add animations to topnav dropdowns
// based on https://stackoverflow.com/a/19339162
// and https://stackoverflow.com/a/52231970

$('.dropdown')
  .on('show.bs.dropdown', function() {
    $(this).find('.dropdown-menu').first().stop(true, true).slideDown(300);
  })
  .on('hide.bs.dropdown', function() {
    $(this).find('.dropdown-menu').first().stop(true, false).slideUp(300, function() {
      $(this).parent().removeClass('open');
    });
  })
  .on('hidden.bs.dropdown', function() {
    $(this).addClass('open');
  });

Ключевые отличия:

  • В hide.bs.dropdown события hide.bs.dropdown я использую .stop() умолчанию .stop() (false) для второго аргумента (jumpToEnd)
  • hidden.bs.dropdown события hidden.bs.dropdown восстанавливает класс .open для родительского .open -переключателя выпадающего .open и делает это практически сразу после того, как класс был впервые удален. Тем временем slideUp() все еще работает, и, как и в ответах выше, ее обратный вызов "анимация завершена" отвечает за окончательное удаление класса .open из его родителя.
  • Методы связаны друг с другом, потому что селектор для каждого обработчика событий одинаков