Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   выпадающее меню (https://javascript.ru/forum/jquery/20589-vypadayushhee-menyu.html)

Денис2201 10.08.2011 16:00

выпадающее меню
 
Есть следующий скрипт выпадающего меню:
$(document).ready(function () {
				
			$('#megamenu li').hover(
				function () {
				//показать подменю
			$('#level', this).slideDown(0);
				
				},
				function () {
				//скрыть подменю
				$('.level', this).slideUp(0);
				}
				);
				
		});


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

Заранее спасибо.

devote 10.08.2011 16:23

выяснить их ширину и сдвинуть на нужное значение, единственное есть НО это то что выяснить их ширину в момент когда они скрыты не реально, поэтому нужно временно его отобразить измерить скрыть

$(document).ready(function () { 
    $('#megamenu li').hover( 
        function () {
           var el = $('#level', this).show();
           if (el[0].offsetLeft > ( document.body.offsetWidth - el[0].offsetWidth) ) {
               el.css("left": (document.body.offsetWidth - el[0].offsetWidth) + "px");
           }
            //показать подменю 
           el.hide().slideDown(0); 
        }, 
        function () { 
            //скрыть подменю 
           $('.level', this).slideUp(0); 
        }
      ); 
});

Денис2201 10.08.2011 16:40

ругается на не закрытую скобку в условии, но вроде проверил все в порядке. Может я слепой?

Денис2201 10.08.2011 17:04

Цитата:

Сообщение от devote (Сообщение 119534)
выяснить их ширину и сдвинуть на нужное значение, единственное есть НО это то что выяснить их ширину в момент когда они скрыты не реально, поэтому нужно временно его отобразить измерить скрыть

$(document).ready(function () { 
    $('#megamenu li').hover( 
        function () {
           var el = $('#level', this).show();
           if (el[0].offsetLeft > ( document.body.offsetWidth - el[0].offsetWidth) ) {
               el.css("left": (document.body.offsetWidth - el[0].offsetWidth) + "px");
           }
            //показать подменю 
           el.hide().slideDown(0); 
        }, 
        function () { 
            //скрыть подменю 
           $('.level', this).slideUp(0); 
        }
      ); 
});

Когда я скрипт ставлю в xsl шаблон, то он в условии знак > меняет на > и считает, что после > идет конец условия.
Подскажите пожалуйста, как решить данную проблему?

devote 11.08.2011 04:31

$(document).ready(function () {  
    $('#megamenu li').hover(  
        function () { 
           var el = $('#level', this).show(); 
           if ( Math.max(0, el[0].offsetLeft - ( document.body.offsetWidth - el[0].offsetWidth ) ) != 0 ) { 
               el.css("left": (document.body.offsetWidth - el[0].offsetWidth) + "px"); 
           } 
            //показать подменю  
           el.hide().slideDown(0);  
        },  
        function () {  
            //скрыть подменю  
           $('.level', this).slideUp(0);  
        } 
      );  
});

Денис2201 11.08.2011 10:16

devote, спасибо.
С той ошибкой справились, но теперь выскакивает другая ошибка, теперь на двоеточие в этой стоке
el.css("left": (document.body.offsetWidth - el[0].offsetWidth) + "px");


Ошибка следующего вида: missing ) after argument list

devote 11.08.2011 10:17

Это я ошибку сделал:
el.css("left", (document.body.offsetWidth - el[0].offsetWidth) + "px");

Денис2201 11.08.2011 10:23

devote, огромное спасибо!!!!
Все заработало. А вы не подскажете можно ли регулировать отступом?
Например если я захочу, что бы выпадающая часть была не в плотную к краю экрана, а был отступ от края экрана в n-ое количество пикселей?

devote 11.08.2011 10:25

el.css("left", ((document.body.offsetWidth - el[0].offsetWidth) - 100) + "px");

Денис2201 11.08.2011 10:32

Еще раз Спасибо)

Денис2201 11.08.2011 10:56

Можно узнать а ведь можно выбрать не только границу экрана, а к примеру границы сайта?

devote 11.08.2011 11:01

можно конечно

Денис2201 11.08.2011 11:04

Извините меня за назойливость, вы мне не покажете на примере моего скрипта?

devote 11.08.2011 11:06

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

Денис2201 11.08.2011 11:08

могу дать ссылку на сайт

devote 11.08.2011 11:08

давай

Денис2201 11.08.2011 11:08

вообще он по центру, размер 1024px

Денис2201 11.08.2011 11:09

http://1.petrocol.z8.ru

devote 11.08.2011 11:14

$(document).ready(function () {   
    $('#megamenu li').hover(   
        function () {
           var maxLeft = $('.header').width() + $('.header')[0].offsetLeft,
                el = $('#level', this).show();

           if ( Math.max(0, el[0].offsetLeft - ( maxLeft - el[0].offsetWidth ) ) != 0 ) {  
               el.css("left", (maxLeft - el[0].offsetWidth) + "px");  
           }  
            //показать подменю   
           el.hide().slideDown(0);   
        },   
        function () {   
            //скрыть подменю   
           $('.level', this).slideUp(0);   
        }  
      );   
});

devote 11.08.2011 11:23

ну и помойку ты там развел =) код можно было сделать один универсальный а не клонировать его для каждого меню.

devote 11.08.2011 11:26

Вставь этот код где нить в одном месте, например в внутри тега <head>

<script type="text/javascript">
$(document).ready(function () {    
    $('.megamenu li').hover(    
        function () { 
           var maxLeft = $('.header').width() + $('.header')[0].offsetLeft, 
                el = $('.level', this).show(); 
  
           if ( Math.max(0, el[0].offsetLeft - ( maxLeft - el[0].offsetWidth ) ) != 0 ) {   
               el.css("left", (maxLeft - el[0].offsetWidth) + "px");   
           }   
            //показать подменю    
           el.hide().slideDown(0);    
        },    
        function () {    
            //скрыть подменю    
           $('.level', this).slideUp(0);    
        }   
      );    
});
</script>

И не нужно будет клонировать сотню раз его.

Денис2201 11.08.2011 11:28

дело все в том, что это скрипт находится в xsl шаблоне и в цикле, поэтому расклонировался для каждого пункта меню)

Денис2201 11.08.2011 11:30

а еще я привязан к id меню

Денис2201 11.08.2011 11:32

А вы не поможете ограничить вывод скрипта, на те пункты меню, в которых нет выпадающего списка? А то к ним применяется стиль для выпадающего меню, это видно в разделе Студентам

devote 11.08.2011 11:45

да я там еще кой чё пропустил у тя на сайте, в коде не то написал, надо вместо этого:
var maxLeft = $('.header').width() + $('.header')[0].offsetLeft,
написать так:
var maxLeft = $('.header').width(),
Я не обратил внимания на то что header стоит с релативной позицией.

Цитата:

Сообщение от Денис2201
А вы не поможете ограничить вывод скрипта, на те пункты меню, в которых нет выпадающего списка? А то к ним применяется стиль для выпадающего меню, это видно в разделе Студентам

$(document).ready(function () {
    $('.megamenu li').hover(
        function () {
           var maxLeft = $('.header').width(),
                el = $('.level', this);

           if ( el.find('a').length != 0 ) {
               el.show();
               if ( Math.max(0, el[0].offsetLeft - ( maxLeft - el[0].offsetWidth ) ) != 0 ) {
                   el.css("left", (maxLeft - el[0].offsetWidth) + "px");
               }
                //показать подменю
               el.hide().slideDown(0);
           }
        },
        function () {
            //скрыть подменю
           $('.level', this).slideUp(0);
        }
      );
});

Денис2201 11.08.2011 12:05

Работает)))

Денис2201 12.08.2011 10:27

а вы случаем не разбираетесь в xsl шаблонах?

devote 12.08.2011 10:32

Цитата:

Сообщение от Денис2201
а вы случаем не разбираетесь в xsl шаблонах?

я не очень если честно люблю этот способ формирования документов.

Денис2201 12.08.2011 10:43

у меня сайт на движке, который обязывает делать вывод через xsl(((

Денис2201 23.08.2011 16:52

devote, у меня еще пару вопросов по скрипту:
$(document).ready(function () {
	    $('.megamenu li').hover(
	        function () {
	           var maxLeft = $('.header').width(),
	                el = $('.level', this);
	 
	           if ( el.find('a').length != 0 ) {
	               el.show();
	               if ( Math.max(0, el[0].offsetLeft - ( maxLeft - el[0].offsetWidth ) ) != 0 ) {
	                   el.css("left", (maxLeft - el[0].offsetWidth) + "px");
	               }
	                //показать подменю
	               el.hide().slideDown(0);
	           }
	        },
	        function () {
	            //скрыть подменю
	           $('.level', this).slideUp(0);
	        }
	      );
	});


Ко всем элементам меню 3-его и 4-ого уровня меню(div level3 и div level4) применен олин стиль. Но у самого правого, к примеру в О КОЛЛЕДЖЕ это колледж сегодня, а в АБИТУРИЕНТАХ это колледж сегодня, когда выпадает список, то div level3 и div level4 которым в css задано быть рядом, просто отображаются друг под другом.

Дело в скрипте или все же css нужно править?
Хотя в css все нормуль, может у вас есть идеи?

devote 23.08.2011 19:51

Цитата:

Сообщение от Денис2201
Дело в скрипте или все же css нужно править?

Ну скрипт тут явно не причем, есть блок фиксированного размера, в нем стоят блоки с параметром float: left; дык вот последний просто не влезает в основной блок и браузер его просто переносит, тут надо с разметкой мудрить. Как решать подобное дивами я не в курсе, так как я программист в первую очередь, а верстальщик с меня не ах.. Обычно подобное меню делаю таблицами.

Денис2201 23.08.2011 20:01

а может сдвинуть скриптом крайний блок пикселей на 200? что бы поместились в 2 колонки?

Денис2201 23.08.2011 20:53

текущий скрипт ведь можно чуть подвинуть, правильно я понимаю?

devote 23.08.2011 21:13

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


Часовой пояс GMT +3, время: 15:09.