Страницы

Поиск по вопросам

суббота, 14 декабря 2019 г.

Toggle эффект для многоуровневого меню в Jquery

#javascript #html #jquery #css


Дано:
Сложное меню с несколькими субменюшками открывающимися как slide справа.
Все срабатывает, только вот идет проблема с toggle, т.е. меню открывается, а при
повторном клике не закрывается.

Механизм меню:

1.Для открытия второй субменюшки нужно кликнуть по элементам меню с самого меню.

2.Третья субменюшка открывается при hover-е на элементы меню со второй субменюшки.


Собственно все это получается, однако у меня не получаетсяя реализовать эффект toggle
на первом этапе, т.е. при повторном нажатии на элемент в меню, оно должно закрываться.

Проблема только в toggle эффекте, с остальным справился. 

Пробовал изменить addClass и RemoveClass на toggleClass, но бестолку. Работает, но
как-то немного глючить и при нажатии на элементы меню со второй субменюшки все закрывается.
По идее такого быть не должно.

Пробовал повесить счетчик кликов на элемент. Однако сработало не как я ожидал.

Помогите пожалуйста именно с этим кодом. Bootstrapовский дропдаун не адаптировался
к этому, а я получил кусочек кода из которого слепил эту кашицу на jquery. Менять код
скорее всего не стану так как я уже показал заказчику.

P.S. Вопрос все еще сильно актуален. 



console.log($('.category>li').length);
$('.category>li').click(function(event) {
  $(this).siblings('li').find('.r_div').removeClass('slideRight').find('.cat_3').removeClass('slideRight');
  $(this).find('.r_div').addClass('slideRight');
});
$('.cat_2>li').hover(function(event) {
  $(this).siblings('li').find('.cat_3').removeClass('slideRight')
  $(this).find('.cat_3').addClass('slideRight');
});
ul {
  list-style: none;
  position: relative;
  padding: 0;
}

ul.category {
  width: 100px;
}

.category li {
  padding: 5px 0;
  background: #eee;
  cursor: pointer;
  border-bottom: 1px solid #fff;
}

.r_div,
.cat_3 {
  position: absolute;
  top: 0;
  width: 0%;
  background: #eee;
  left: 100%;
  border-left: 3px solid #000;
  padding: 0 10px;
  visibility: hidden;
  opacity: 0;
}

.r_div.slideRight,
.cat_3.slideRight {
  visibility: visible;
  width: 100px;
  transition: all .3s linear;
  opacity: 1;
}

  • Menu #1
    • Test
      • submenu
      • submenu
      • submenu
      • submenu
      • submenu
    • Test
      • submenu
      • submenu
      • submenu
      • submenu
      • submenu
    • Test
      • submenu
      • submenu
      • submenu
      • submenu
      • submenu
    • Test
      • submenu
      • submenu
      • submenu
      • submenu
      • submenu
    • Test
      • submenu
      • submenu
      • submenu
      • submenu
      • submenu
  • Menu #2
    • Test2
    • Test2
    • Test2
    • Test2
    • Test2
  • Menu #3
    • Test3
    • Test3
    • Test3
    • Test3
    • Test3
  • Menu #4
    • Test4
    • Test4
    • Test4
    • Test4
    • Test4
  • Menu #5
    • Test5
      • submenu
      • submenu
      • submenu
      • submenu
      • submenu
    • Test5
    • Test5
    • Test5
    • Test5
Текущий процесс: http://osiyo-nur.uz/goodgross/


Ответы

Ответ 1



console.log($('.category>li').length); $('.category > li').click(function(event) { $(this).find('.r_div').toggle(); $('.r_div').addClass('subtog'); $(this).find('.r_div').removeClass('subtog'); }); $('.cat_2>li').hover(function(event) { $(this).find('.cat_3').addClass('slideRight'); $(this).siblings('li').find('.cat_3').removeClass('slideRight') }); ul { list-style: none; position: relative; padding: 0; } ul.category { width: 100px; } .category li { padding: 5px 0; background: #eee; cursor: pointer; border-bottom: 1px solid #fff; } .r_div, .cat_3 { position: absolute; top: 0; width: 0%; background: #eee; left: 100%; border-left: 3px solid #000; padding: 0 10px; /*visibility: hidden;*/ } .r_div { display:none; width: 100px; transition: all .3s linear; } .cat_3.slideRight { visibility: visible; width: 100px; transition: all .3s linear; opacity: 1; display:block; } .subtog { display:none !important; } .cat_3 {visibility: hidden; opacity: 0;}
  • Menu #1
    • Test
      • submenu
      • submenu
      • submenu
      • submenu
      • submenu
    • Test
      • submenu
      • submenu
      • submenu
      • submenu
      • submenu
    • Test
      • submenu
      • submenu
      • submenu
      • submenu
      • submenu
    • Test
      • submenu
      • submenu
      • submenu
      • submenu
      • submenu
    • Test
      • submenu
      • submenu
      • submenu
      • submenu
      • submenu
  • Menu #2
    • Test2
    • Test2
    • Test2
    • Test2
    • Test2
  • Menu #3
    • Test3
    • Test3
    • Test3
    • Test3
    • Test3
  • Menu #4
    • Test4
    • Test4
    • Test4
    • Test4
    • Test4
  • Menu #5
    • Test5
      • submenu
      • submenu
      • submenu
      • submenu
      • submenu
    • Test5
    • Test5
    • Test5
    • Test5


Ответ 2



$('.category a').click(function(event) { $(this).toggleClass("active"); $(".category a").not($(this)).not($(this).parents("li>a")).removeClass("active"); $(".category ul").not($(this).parents("ul")).not($(this).next("ul")).removeClass("active"); $(this).next("ul").toggleClass("active"); }); .category>li ul { position: absolute; left: 100%; display: none; padding: 0px; top: 0px; } .category>li ul.active { display: block; } ul.category { width: auto; display: inline-block; } ul.category li, ul.category a { color: #000; text-decoration: none; } .category, .category ul { background: #a9a9a9; color: #000; } ul.category li { list-style: none; padding: 5px 10px; } ul.category ul { margin: 0px; padding: 0px; top: 0px; } .category { position: relative; } * { box-sizing: border-box; } ul.category, ul.category ul { border-right: 1px #fff solid; } ul.category { margin: 0px; padding: 0px; } .category a.active { color: red; }
  • Menu #1
    • test
      • submenu
      • submenu
      • submenu
      • submenu
      • submenu
    • test
      • submenu
      • submenu
      • submenu
      • submenu
      • submenu
    • test
      • submenu
      • submenu
      • submenu
      • submenu
      • submenu
    • test
      • submenu
      • submenu
      • submenu
      • submenu
      • submenu
    • test
      • submenu
      • submenu
      • submenu
      • submenu
      • submenu
  • Menu #2
    • test
      • submenu
      • submenu
      • submenu
      • submenu
      • submenu
    • test
      • submenu
      • submenu
      • submenu
      • submenu
      • submenu
    • test
      • submenu
      • submenu
      • submenu
      • submenu
      • submenu
    • test
      • test
        • submenu
        • submenu
        • submenu
        • submenu
        • submenu
      • test
        • submenu
        • submenu
        • submenu
        • submenu
        • submenu
      • test
        • submenu
        • submenu
        • submenu
        • submenu
        • submenu
      • test
        • submenu
        • submenu
        • submenu
        • submenu
        • submenu


Ответ 3



Скорее всего вы просто не вставили toggle $('.category>li').click(function(event) { $(this).toggle(function() { ваша анимация }); });

Ответ 4



А изобретение велосипеда обязательно? Нельзя использовать bootstrap? К примеру вот: $(document).ready(function(){ $('.dropdown-submenu a.test').on("click", function(e){ $(this).next('ul').toggle(); e.stopPropagation(); e.preventDefault(); }); });

Multi-Level Dropdowns

In this example, we have created a .dropdown-submenu class for multi-level dropdowns (see style section above).

Note that we have added jQuery to open the multi-level dropdown on click (see script section below).

Multi-Level Dropdowns Да и к тому же с такой структурой меню Вас часто будет вспоминать тот кто будет реализовывать это на backend. Если без кликов, а просто с hover, то можно вот так: #main-menu { background-color: #000; min-height: 45px; margin-bottom: 0; } #main-menu .navbar-collapse { padding: 0; } #main-menu .nav { width: 100%; position: relative; } #main-menu .nav li.active a { background-color: #c4c4c4 c; } #main-menu .nav li.parent { position: relative; } #main-menu .nav li.parent > a::after { content: "\e900"; font-family: 'icomoon'; position: absolute; color: #fff; font-size: 6px; top: 12px; right: 13px; transform-origin: center; } #main-menu .nav li.parent > a:hover::after { transform: rotate(180deg); } #main-menu .nav li.parent .parent > ul { position: absolute; left: 100%; top: 0; } #main-menu .nav li.parent .parent > ul a { background-color: #c2c2c2; } #main-menu .nav li.parent .parent a::after { top: 18px; } #main-menu .nav li.parent > ul { display: none; background-color: #000; list-style: none; position: absolute; padding-left: 0; width: 100%; } #main-menu .nav li.parent > ul > li { max-height: 44px; width: 100%; } #main-menu .nav li.parent > ul > li > a { font-size: 14px; text-transform: none; padding: 12px 20px; width: 100%; display: block; } #main-menu .nav li.parent > a { padding: 12px 35px 12px 15px; } #main-menu .nav li.parent > a:hover { background-color: #c4c4c4; } #main-menu .nav li.parent > a:hover + ul { display: block; } #main-menu .nav li.parent ul:hover { display: block; } #main-menu .nav a { color: #fff; font-size: 14px; font-weight: 500; text-transform: uppercase; padding: 12px 25px; } #main-menu .nav a:hover { background-color: #c2c2c2; } Multi-Level Menu Тут адаптивом проблемы, лучше на смотреть на всю страницу.

Комментариев нет:

Отправить комментарий