Выпадающее меню.
Доброго дня всем.
Сразу оговорюсь я пока только учус, знаю немного, тренируюсь с тем что знаю. Имею такую вот конструкцию:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title></title>
<style type="text/css">
/*<![CDATA[*/
ul {
list-style: none;
margin: 0;
padding: 0;
}
li {
padding: 5px;
margin: 5px 0 0 0;
}
ul li {
display: inline-block;
*display: inline;
zoom:1;
vertical-align: top;
border: 1px dotted silver;
}
ul li ul li {
display: block;
}
ul li ul li ul {
background: #FFFF99;
}
/*]]>*/
</style>
<script type="text/javascript">
/*<![CDATA[*/
var menu = {
menuElement: null,
start: function(){
menu.menuElement = document.getElementById('menu');
menu.turn(menu.menuElement);
},
turn: function(obj){
var nodeElement = obj.children
if(nodeElement){
for(var i=0;i<nodeElement.length;i++){
var nodeElementName = nodeElement[i].nodeName;
/*alert('nodeElementName:'+nodeElementName);*/
if(nodeElementName == 'A' && menu.nextElementSibling(nodeElement[i])){
var element = menu.nextElementSibling(nodeElement[i]);
element.style.display = 'none';
}
menu.turn(nodeElement[i]);
}
}
},
nextElementSibling: function(obj){
for(var nextNode = obj.nextSibling;nextNode!=null;nextNode = nextNode.nextSibling){
if(nextNode.nodeType == 1 && nextNode.nodeName == 'UL'){
return nextNode;
}
menu.nextElementSibling(nextNode);
}
},
expande: function(obj){
var nodeElement = obj.children;
if(nodeElement){
for(var i=0;i<nodeElement.length;i++){
if (nodeElement[i].nodeName == 'A') {
obj = nodeElement[i];
break;
}
}
}
var element = menu.nextElementSibling(obj);
if(element){
element.style.display = 'block';
}
}
}
/*]]>*/
</script>
</head>
<body onload="menu.start()">
<div id="menu">
<ul>
<li onmousemove="menu.expande(this)" onmouseout="menu.turn(this)">
<a href="#">Link 1</a>
<ul>
<li onmousemove="menu.expande(this)" onmouseout="menu.turn(this)">
<a href="#">Link 1.1</a>
<ul>
<li>
<a href="#">Link 1.1.1</a>
</li>
</ul>
</li>
<li onmousemove="menu.expande(this)" onmouseout="menu.turn(this)">
<a href="#">Link 1.2</a>
<ul>
<li>
<a href="#">Link 1.2.1</a>
</li>
<li onmousemove="menu.expande(this)" onmouseout="menu.turn(this)">
<a href="#">Link 1.2.2</a>
<ul>
<li>
<a href="#">Link 1.2.2.1</a>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li onmousemove="menu.expande(this)" onmouseout="menu.turn(this)">
<a href="#">Link 2</a>
</li>
<li onmousemove="menu.expande(this)" onmouseout="menu.turn(this)">
<a href="#">Link 3</a>
<ul>
<li onmousemove="menu.expande(this)" onmouseout="menu.turn(this)">
<a href="#">Link 3.1</a>
<ul>
<li>
<a href="#">Link 3.1.1</a>
</li>
</ul>
</li>
<li>
<a href="#">Link 3.2</a>
</li>
<li>
<a href="#">Link 3.3</a>
</li>
</ul>
</li>
</ul>
</div>
</body>
</html>
Все вроде работает так как задумывалось, но: 1.При наведении на Link 1.1.1 и попытке перейти на link 1.2 все благополучно сворачивается, возможно стоит поставить setTimeout но хотелось бы узнать решение получше. 2.Беспокоит рекурсивный обход метода nextElementSibling, заканчивает рекурсию только после полного обхода, а не после возврата ноды, непонятно почему. Буду благодарен за разъяснения, ну и общие замечания/советы как упростить или сделать гибче/ошибки на которые укажете. |
надо было кнопочку приделать для запуска кода....
А вообще, бегло посмотрев, вижу что нигде нет setTimeout или setInterval, значит меню не анимированное, тем более значит что его можно сделать на чистом css, я в какой то теме показывал примерный вариант.. http://javascript.ru/forum/jquery/12...html#post99703 |
poorking
Спасибо за проявленный интерес. Цитата:
Анимацию планировал добавить немного позже, отработав простейший гибкий механизм, вот по нему у меня и вопросы, правильно ли построен подход к решению данной задачи ? стоит ли учесть какие то моменты непредусмотренные мной ? на каких моментах моей реализации стоит заострить внимание и почему ? итд. |
Как правильно.. Лично я считаю что любые двигающиеся и дергающиеся штуки на сайтах это зло, а тем более изначально скрытые как выпадающие менюшки. Ну а по сабжу, если уж делать на js, то я бы написал какое нибудь API которое и создает менюшку, а то вы ее разверстали, а потом скриптом подобрали. Чтобы был механизм, создающий меню. Например чтобы было как то так
document.body.appendChild(
MyMenyCreator(
[
{
title: "Главная",
url: "http://"
},
{
title: "Блог",
url: "http://"
},
{
title: "Портфолио",
url: "http://"
sub:[
{
title: "Верстка",
url: "http://"
},
{
title: "Скрипты",
url: "http://"
},
{
title: "Фотошоп",
url: "http://"
},
]
},
{
title: "Обо мне",
url: "http://"
}
]
)
)
Я бы сделал так, то есть функция ест параметры а возвращает готовый узел, естественно она также должна принимать стили, обработчики и прочее, все что вам нужно. Или по-другому можно спроектировать интерфейс. Например можно сделать MyMenuCreator синглтоном с методами, настраивающими менюшку, и методом, отдающим ее готовенькую. Вариантов много, фантазируйте :) Я считаю что скрипт должен быть такой, чтобы его можно было легко применить, а также при желании расширить новыми функциями, возможностями, не обязательно через API, но хотя бы, добавив, скажем в какой нибудь приватный набор какой нибудь новый элемент. Или через прототип удобно расширять. Ну это все чисто мое мнение и я говорю как бы старался сделать я) А у вас как то смешано все и вовсе не гибко, например обработчики через аттрибуты назначены, то есть мне чтобы применить ваш скрипт, нужно переверстать свою менюшку. Можно еще например попробовать такой вариант, скрипт принимает узел ul, и по определенным правилам, придуманными вами его сворачивает, например если в li вложен ul, то сделать тот ul выпадающим и т.п. Так что вот пара советов, раз вы хотите разработать гибкий интерфейс (но допускайте что я вам тут мог наврать :) ) |
Согласен с poorking
Анимированным меню не место на серьёзных сайтах. Максимум, что можно позволить - изменение цвета фона (текста) при наведении курсора мышки. Ещё один аргумент против аним. меню: Если вы например перешли по ссылке Link 3.1.1 то на вновь открывшейся странице вы должны показать, что находитесь в этом секторе меню! Как быть?! Строить развёрнутое меню? Это легче сделать на серверной стороне сгенерировав готовую статику... Несмотря на это - успехов в программировании! |
poorking, Спасибо, будем думать.
|
| Часовой пояс GMT +3, время: 20:30. |