Zum Hauptinhalt springen

YOOtheme Pro
Build a real accordion menu (mobile-dialog)

To use the normal Joomla menu module, which contains all menu- and submenu-entries, in the offcanvas-position (mobile-dialog) without the restriction of having to use «separators» to toggle the submenu, you could use the following scripts:

Menu-type has to be set to «Nav» in the menu module-settings / in the module-builder.

I used this on a company website to be able to use the «normal» Joomla menu module and display its content as accordion-nav in yootheme pro, without having to add separators or other unwanted stuff to the menu itself.

Real accordion menu with level 2 submenus:

Use the following script in Settings → Advanced → Custom Code

1. To indicate, that the menu is an accordion-menu (which allows to open multiple items)
<script>
jQuery(function($) {
    $('.uk-offcanvas-bar .uk-nav.uk-nav-default').attr('uk-nav','multiple: true').attr('uk-nav', 'targets: > .js-accordion').addClass('uk-nav-accordion level1');
}); 
</script>
2. Indicate, that the first-level submenu is also an accordion-menu (which allows to open multiple items)
<script>
    jQuery(function($) {
        $('.uk-offcanvas-bar .uk-nav.uk-nav-default .uk-nav-sub').attr('uk-nav-sub','multiple: true').attr('uk-nav', 'targets: > .js-accordion').attr('id', 'subnav').addClass('uk-nav-accordion level2');
    }); 
</script>
3. Give the second-level submenu(s) a separate class
<script>
    jQuery(function($) {
        $('.uk-offcanvas-bar .uk-nav.uk-nav-default .uk-nav-sub ul').attr('id', 'sub-subnav').addClass('uk-nav sub-subnav');
    }); 
</script>

4. Add the correct class «js-accordion» to the parent items

<script>
    jQuery(function($) {
        $('.uk-offcanvas-bar .uk-nav.uk-nav-default li.uk-parent').addClass('js-accordion');
    }); 
</script>

5. To add a unique ID to the subnavs

<script>
    jQuery(function($) {
        $('.uk-nav-sub').each(function(n) {$(this).attr('id', 'subnav' + n)});
}); 
</script>

6. To add a unique ID to the second-level subnavs

<script>
    jQuery(function($) {
        $('.sub-subnav').each(function(n) {$(this).attr('id', 'sub-subnav' + n)});
}); 
</script>

7. Add wrapper code in order to separate the toggle from the menu-entry and to open the first-level submenu by clicking the toggle

<script>
    jQuery(function($) {
        $('.uk-offcanvas-bar .uk-nav.uk-nav-default>li.uk-parent>a').wrap('<div class="tm-grid-expand uk-grid-column-small uk-grid" uk-grid><div class="uk-width-expand"></div></div>').addClass('uk-panel uk-width-expand');
        $('.uk-offcanvas-bar .uk-nav.uk-nav-default li.uk-parent .tm-grid-expand').append('<div class="uk-width-auto"><div><a class="uk-toggle level2"><span uk-icon="icon:chevron-down" class="uk-icon"></span></a></div>')
}); 
</script>

8. Add wrapper code in order to separate the toggle from the submenu-entry and open the second-level submenu by clicking the toggle

<script>
    jQuery(function($) {
		$('.uk-offcanvas-bar .uk-nav-sub.level2 li.uk-parent>a').wrap('<div class="tm-grid-expand uk-grid-column-small uk-grid" uk-grid><div class="uk-width-expand"></div></div>').addClass('uk-panel uk-width-expand');
        $('.uk-offcanvas-bar .uk-nav-sub.level2 li.uk-parent .tm-grid-expand').append('<div class="uk-width-auto"><div><a class="uk-toggle level3"><span uk-icon="icon:chevron-down" class="uk-icon"></span></a></div>')
    }); 
</script>
9. Find the closest subnav for each first-level submenu toggle and set the correct target-id
<script>
    jQuery(function($) {
    	$('a.level2').each(function () {
    	var id = $(this).closest('li').find('.uk-nav-sub').attr('id');
    	$(this).attr('uk-toggle', 'target:#' + id);});
	});
</script>
10. Do the same for second-level submenu toggles
<script>
	jQuery(function($) {
    	$('a.level3').each(function () {
    	var id = $(this).closest('li').find('.sub-subnav').attr('id');
    	$(this).attr('uk-toggle', 'target:#' + id);});
	});
</script>
11. Make the toggle turn onclick
<script>
    jQuery(function($) {
        $('a.uk-toggle').on('click', function () {
    	$(this).toggleClass('rotate');});
    });
</script>
12. Don't forget to add the desired transformation of the toggle in the CSS section
.uk-toggle.rotate svg {transform: rotate(180deg)}
Wir benutzen Cookies
Wir nutzen Cookies auf unserer Website. Einige von ihnen sind essenziell für den Betrieb der Seite, während andere uns helfen, diese Website und die Nutzererfahrung zu verbessern. Du kannst selbst enscheiden, ob du Cookies zulassen möchtest. Bitte beachte, dass bei Ablehnung womöglich nicht mehr alle Funktionalitäten zur Verfügung stehen.