Высота, чтобы эта суб-навигация скользила вверх при первом нажатии

0

У меня есть список, где некоторые элементы имеют суб-навигацию:

  <ul role="menu">
    <li role="menuitem">
      <a href="#" class="clearfix">Top Level</a>
    </li>
    <li class="slidedown open" role="menuitem">
      <a href="#" class="clearfix">Top Level</a>
      <span class="slidedown-toggle">Show Sub Menu</span>
      <!-- Subnav -->
      <ul class="list-reset nav-sub" role="menu">
        <li role="menuitem">
          <a href="#">Second Level</a>
        </li>
        <li role="menuitem">
          <a href="#">Second Level</a>
        </li>
        <li role="menuitem">
          <a href="#">Second Level</a>
        </li>
      </ul>
    </li>
  </ul>

У меня есть этот скрипт, который вычисляет высоту subnav <ul> при нажатии на .slidedown-toggle а затем меняет его на 0 в зависимости от родительского <li> имеющего открытый класс.

$(document).ready( function(){ 

  var $slidedownToggle = $('.nav-sidebar .slidedown-toggle');

  $slidedownToggle.click(function () {

    var $slidedown = $(this).parent('.slidedown'); // Get the container item
    var $subnav = $(this).siblings('.nav-sub'); // Get the ul that needs to slide up/down

    var totalHeight = 0; // Calculate the height required (in px) to show all <li>'s
    $subnav.find('li').each(function() {
      totalHeight += $(this).outerHeight(true);
    });

    // Toggle 'open' class on the parent <li>
    $slidedown.toggleClass('open');

    // Set the appropriate height
    if ($slidedown.hasClass('open')) {
      $subnav.css({height: totalHeight + 'px'});
    } else {
      $subnav.css({height: '0px'});
    }

  });

});

Проблема в том, что иногда класс 'open' уже был добавлен <li class="slidedown"> потому что, когда вы находитесь на странице subnav, я хочу, чтобы меню было израсходовано, чтобы показать, где вы находитесь. Поскольку я устанавливал height: auto в CSS для .slidedown.open, высота не анимирована (я знаю весь слайдунг с использованием max-height, и я не хочу этого), когда вы сначала нажимаете переключатель slidedown-toggle "открытых" предметов.

Самый простой способ увидеть, что я делаю, это посмотреть на JSBIN. Нажмите второе "шоу-меню", и оно будет хорошо скользить вверх и вниз. Нажмите первый, и первый клик не будет скользить (из-за автоматической высоты). Как я могу это исправить? Может быть, сначала установите высоту щелчка, а затем установите значение 0?

http://jsbin.com/poxiy/2/edit

Теги:

2 ответа

2
Лучший ответ

Это неприятный взлом, который работает... на готовом обработчике присваивает высоту открытому subnav

$('.nav-sidebar .slidedown.open .nav-sub').height(function(){
    return $(this).height();
})

Демо: скрипка

Другое решение обсуждается в нижеследующих сообщениях

  • 0
    Можете ли вы объяснить, почему это "мерзкий взлом"? Я знаю о других решениях CSS, но они терпят неудачу, когда у вас есть subnavs различной длины, которые в некоторых случаях очень длинные. Возможно, было бы лучше использовать стандартные .show() and .hide() , но я обнаружил, что анимация порой прерывистая по сравнению с CSS-анимацией.
  • 0
    @davidpauljunior (не эксперт в css-анимации) Я назвал это неприятным хаком, потому что может быть более элегантное решение, а то, что мы делаем, это хак
0

Вы можете попробовать список меню на основе наведения - выглядит супер сексуально.

HMTL

> <!DOCTYPE html> <html> <head> <script
> src="http://code.jquery.com/jquery-1.9.1.min.js"></script> <ul
> id="nav">     <li><a href="#">Parent 01</a></li>  <li><a href="#"
> class="selected">Parent 02</a>        <ul>            <li><a href="#">Item
> 01</a></li>           <li><a href="#" class="selected">Item 02</a></li>
>           <li><a href="#">Item 03</a></li>        </ul>       <div
> class="clear"></div>  </li>   <li><a href="#">Parent 03</a>   <ul>
>       <li><a href="#">Item 04</a></li>        <li><a href="#">Item 05</a></li>
>       <li><a href="#">Item 06</a></li>        <li><a href="#">Item 07</a></li>
>   </ul>                   <div class="clear"></div>   </li>   <li><a href="#">Parent
> 04</a></li> </ul>   </body> </html>

Ява

$(document).ready(function () { 

    $('#nav li').hover(
        function () {
            //show its submenu
            $('ul', this).stop().slideDown();

        }, 
        function () {
            //hide its submenu
            $('ul', this).stop().slideUp();         
        }
    ); 

});
  • 0
    Я мог бы сделать, да, но это не та функциональность, которую я хочу.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню