Robię prostego frameworka i dodałem ostatnio możliwość robienia nieskończenie wielu poziomów menu.
Doszło do widoku we frontendzie i mam mały problem.
PHP generuje mi taką strukturę:
<div id="menu_gl" class="box menu"> <ul class="lvl1 dnone"> <li> <ul class="lvl2 dnone"> <li> <ul class="lvl3 dnone"> <li> <ul class="lvl4 dnone"> <li> <ul class="lvl5 dnone"> <li> </li> <li> <ul class="lvl6 dnone"> <li> </li> <li> </li> <li> <ul class="lvl7 dnone"> <li> </li> <li> </li> <li> <ul class="lvl8 dnone"> <li> </li> <li> </li> <li> <ul class="lvl9 dnone"> <li> </li> <li> <ul class="lvl10 dnone"> <li> </li> <li> <ul class="lvl11 dnone"> <li> </li> <li> <ul class="lvl12 dnone"> <li> </li> <li> </li> <li> </li> </ul> </li> <li> </li> </ul> </li> <li> </li> </ul> </li> <li> </li> </ul> </li> <li> </li> </ul> </li> </ul> </li> <li> </li> </ul> </li> </ul> </li> </ul> </li> </ul> </li> </ul> </li> <li> <ul class="lvl2 dnone"> <li> <ul class="lvl3 dnone"> <li> </li> <li> <ul class="lvl4 dnone"> <li> </li> <li> </li> <li> </li> <li> <ul class="lvl5 dnone"> <li> </li> </ul> </li> <li> </li> <li> </li> </ul> </li> <li> </li> </ul> </li> </ul> </li> </ul> </div>
Napisałem do tego CSS:
#menu_gl { float: left; } #menu_gl>ul ul { left: 0; position: absolute; top: 44px; width: 200px; } #menu_gl>ul ul ul { left: 180px; position: absolute; top: 0px; width: 200px; } #menu_gl>ul li { width: 180px; margin: 0 auto; } #menu_gl>ul { display: block; } #menu_gl ul li { float: left; position: relative; } #menu_gl ul li a { display: block; padding: 10px; background: #ffbcda; margin: 2px; text-decoration: none; } #menu_gl ul li a:hover { background: #dfedcb; } li:hover>ul { display: block; }
I wszystko działa świetnie. CSSy są napisane dziwne po to aby pierwsze pod menu wyświetlało się pod spodem a kolejne na prawo od rodzica.
Dodałem do tego skrypt JS który sprawia, że jeśli nie ma miejsca z prawej strony to elementy rozjeżdżają się w lewo, i na odwrót, ponadto jeżeli nie ma miejsca na dole to elementy wyjeżdżają do góry (jak w interfejsie systemowym):
$(function(){ $('ul li ul').mouseenter(function(){ var elementWidth = $(this).width(); var elementHeight = $(this).height(); var pageWidth = window.innerWidth; var pageHeight = window.innerHeight; var left = $(this).offset(); if (left.left + (elementWidth * 2) > pageWidth) { $(this).find('ul').each(function(){ $(this).css('left','-'+(elementWidth-20)+'px'); }) } if (left.left - elementWidth < 0) { $(this).find('ul').each(function(){ $(this).css('left',(elementWidth-20)+'px').css('top','0px'); }) } if (left.top + (elementHeight * 2) > pageHeight) { $(this).find('ul').each(function(){ var h = $(this).height(); $(this).css('top','-'+(h-43)+'px'); }) } }); });
I tu pojawił się taki problem, kiedy rozwijam kilkunasty poziom zagłębienia naturalne jest, że niektóre elementy będą nachodzić na poprzednie (jakichś przodków) bo miejsca na ekranie nie jest nieskończoność i tu pojawia się problem: czasami przodek jest nad elementem ostatnio rozwiniętym... Logicznie nie powinno się tak dziać, walczę z tym 2 godziny i nic nie wymyśliłem.
Proszę o pomoc i pozdrawiam.