Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

HTML+CSS+JavaScript

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Помогите реализовать трёхуровневое выпадающее меню.
 
 автор: Footer   (25.01.2008 в 14:48)   письмо автору
 
 

Я взял пример из книги "PHP 5 На примерах" в котором было рассмотрено построение двухуровневой системы меню. Я его немного изменил и получилось следующее:

<table border ="0" cellspacing="0" cellpadding="0" width = "100%"><tr valign = top align=center>
    <td width = "90px" class = "menu_1">
     <div class = rootmenu>
      <a href = "#"<b>Страница 1</b></a></div>
    </td>
    <td width = "90px" class = "menu_1">
     <div class = rootmenu>
      <a href = "#"<b>Страница 2</b></a></div>
    </td>
    <td width = "90px" class = "menu_1">
     <div class = rootmenu>
      <a href = "#"<b>Страница 3</b></a></div>
    </td>
    <td width = "110px" class = "menu_1">
     <div class = rootmenu>
      <a href = "#" onmouseover = "showmenu('m1')"
           onmouseout = "hidemenu()"><b>Страница 4</b></a></div>
     <div id = "m1" class = "submenu" onmouseover = "showmenu('m1')"
                         onmouseout = "hidemenu()">
     <a href = "#">Страница 1 подменю</a><br>
     <a href = "#">Страница 2 подменю</a><br>
     <a href = "#">Страница 3 подменю</a></td>
    </div>
    </td>
    <td width = "120px"class = "menu_1">
     <div class = rootmenu>
      <a href = "#" onmouseover = "showmenu ('m2')"
           onmouseout = "hidemenu()"><b>Страница 5</b></a></div>
      <div id = "m2" class = "submenu" onmouseover = "showmenu ('m2')"
                          onmouseout = "hidemenu ()">
      <a href = "#">Страница 4 подменю</a><br>
      <a href = "#">Страница 5 подменю</a><br>
      <a href = "#">Страница 6 подменю</a></td>
    </div>
    </td>
    <td width = "80px" class = "menu_1">
         <div class = rootmenu>
      <a href = "#"><b>Страница 6</b></a></div>
    </td>
    <td width = "120px"class = "menu_1">
     <div class = rootmenu>
      <a href = "#" onmouseover = "showmenu ('m3')"
           onmouseout = "hidemenu()"><b>Страница 7</b></a></div>
      <div id = "m3" class = "submenu" onmouseover = "showmenu ('m3')"
                          onmouseout = "hidemenu ()">
      <a href = "#">Страница 7 подменю</a><br>
      <a href = "#">Страница 8 подменю</a><br>
      <a href = "#">Страница 9 подменю</a></td>
    </div>
    </td>
    <td width = "80px" class = "menu_1">
         <div class = rootmenu>
      <a href = "#"><b>Страница 8</b></a></div>
    </td>
</tr></table>

Код на Java Scriptе:

<!--
var oldsubmenu;
var timeOnMenu;
function showmenu (obj)
{
if (timeOnMenu)    {
    clearTimeout (timeOnMenu);
}
if (oldsubmenu) hide (oldsubmenu);
show (obj);
oldsubmenu = obj;
}

function hidemenu()
{
if (oldsubmenu) timeOnMenu = setTimeout ("hide (oldsubmenu)", 500)
}

function getObject (obj)
{
var theObj
if (document.layers)    {
    if (typeof obj == "string") return document.layers [obj]
    else return obj
}
if (document.all)    {
    if (typeof obj == "string")
    {
       if (document.all (obj) != null) return document.all (obj).style;
       else return null;
    }
    else return obj.style
}
if (document.getElementById)
{
    if (typeof obj == "string")
        return document.getElementById (obj).style
    else return obj.style
}
return null
}
function show (obj)     {
var theObj = getObject (obj);
if (typeof theObj.visibility != "undefined")
   theObj.visibility = "visible"
if (typeof theObj.display != "undefined") theObj.display = "block"
}
function hide (obj)
{
var theObj = getObject (obj)
if (typeof theObj.visibility != "undefuned")
   theObj.visibility = "hidden"
if (typeof theObj.display != "undefined") theObj.display = "none"
}

//-->

Стиль, применяемый к меню:

a:link {text-decoration: none; color: #A4A428}
a:visited {text-decoration: none; color: #A4A428}
a:hover {text-decoration: none; color: #6F9324}
a:active {text-decoration: none; color: #A4A428}
#menu {position: absolute; top: 64px; left: 0px}
.rootmenu {border-style: solid; border-width: 0px; padding: 2px}
.submenu {display: none; padding: 0px 0px 0px 5px; background-color: #DDDD9B; border-style: solid; border-width: 1px;}
.rootmenu2 {border-style: solid; border-width: 0px; padding: 2px;}
.submenu2 {display: none; position: absolute; bottom: 75px; left: 0px; padding: 0px 10px 0px 10px; background-color: #DDDD9B; 

border-style: solid; border-width: 1px;}
.menu_1 {
    font-family: Verdana, Arial, Helvetica, sans-serif;
    font-size: 12px;
    color: #A4A428;
    font-style: normal;
    font-weight: bold;
}
.menu_2 {
    font-family: Verdana, Arial, Helvetica, sans-serif;
    font-size: 12px;
    color: #A4A428;
    background-color: #CCCC66;
    text-align: center;
    font-weight: bold;
}


Помогите мне реализовать трёхуровневую систему меню. То есть, чтобы при наведении курсора на пункт подменю для него выпадал ещё один (третий) блок дополнительных меню.

   
 
 автор: Footer   (25.01.2008 в 18:34)   письмо автору
 
   для: Footer   (25.01.2008 в 14:48)
 

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

   
 
 автор: AmBuddy   (25.01.2008 в 18:42)   письмо автору
 
   для: Footer   (25.01.2008 в 18:34)
 

Подозреваю, что это невозможно с таким подходом. Я тоже сейчас вот мучаюсь с многоуровневым меню. Тот подход, что ты описал предполагает только один уровень. По кроайней мере я так и не смог добавить еще один хотя бы. Я не профи, но кажись это факт. Многоуровневые меню делаются на дивах, с использованием нескольких сотен строк кода.

   
 
 автор: Footer   (25.01.2008 в 19:04)   письмо автору
 
   для: AmBuddy   (25.01.2008 в 18:42)
 

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

   
 
 автор: elenaki   (25.01.2008 в 19:09)   письмо автору
 
   для: Footer   (25.01.2008 в 19:04)
 

дарю. четыре уровня. больше нет смысла делать - задолбаешься кликать...

   
 
 автор: Footer   (25.01.2008 в 19:20)   письмо автору
 
   для: elenaki   (25.01.2008 в 19:09)
 

Не очень понял что там и как. Я не очень разбираюсь в JavaScriptе. Получается, мне нужно три уровня. Как тогда сделать для трёх уровней?

   
 
 автор: elenaki   (25.01.2008 в 19:35)   письмо автору
 
   для: Footer   (25.01.2008 в 19:20)
 

Содержимое этой таблицы поместите между <HEAD> и </HEAD>

 
<style>
<!--
#foldheader{cursor:hand ; font-weight:bold ;
list-style-image:url(fold.gif)}
#foldinglist{list-style-image:url(list.gif)}
//-->
</style>
<script language="JavaScript1.2">
<!--
/** 
* Based on Folding Menu Tree 
* Dynamic Drive (www.dynamicdrive.com)
* For full source code, installation instructions,
* 100's more DHTML scripts, and Terms Of
* Use, visit dynamicdrive.com
*
* Updated to support arbitrarily nested lists
* by Mark Quinn (mark@robocast.com) November 2nd 1998
*/

var head="display:''"
img1=new Image()
img1.src="fold.gif"
img2=new Image()
img2.src="open.gif"

function change(){
if(!document.all)
return
if (event.srcElement.id=="foldheader") {
var srcIndex = event.srcElement.sourceIndex
var nested = document.all[srcIndex+1]
if (nested.style.display=="none") {
nested.style.display=''
event.srcElement.style.listStyleImage="url(open.gif)"
}
else {
nested.style.display="none"
event.srcElement.style.listStyleImage="url(fold.gif)"
}
}
}

document.onclick=change

//-->
</script>
 


Содержимое этой таблицы поместите между <BODY> и </BODY>


<ul>
<li id="foldheader">Новости</li>
<ul id="foldinglist" style="display:none" style=&{head};>
<li><a href="http://www.cnn.com">CNN</a></li>
<li><a href= "http://www.abcnews.com">ABC News</a></li>
<li><a href= "http://www.vancouversun.com">Vancouver Sun</a></li>
</ul>

<li id="foldheader">Игры</li>
<ul id="foldinglist" style="display:none" style=&{head};>
<li><a href= "http://www.gamespot.com">GameSpot</a></li>
<li><a href= "http://www.happypuppy.com">Happy Puppy</a></li>
<li><a href= "http://www.gamecenter.com">Game Center</a></li>
</ul>

<li id="foldheader">Софт</li>
<ul id="foldinglist" style="display:none" style=&{head};>
<li><a href="http://www.download.com">outer 1</a></li>
<li><a href="http://www.hotfiles.com">outer 2</a></li>
<li id="foldheader">JavaScript &amp; DHTML</li>
<ul id="foldinglist" style="display:none" style=&{head};>
<li><a href= "http://www.dynamicdrive.com">Dynamicdrive </a> </li>
<li><a href="http://javashelp.cjb.net">JS Help</a></li>
</ul>
<li><a href="http://www.windows95.com">outer 3</a></li>
<li><a href="http://www.shareware.com">outer 4</a></li>
</ul>
</ul>
<script language="JavaScript1.2">
<!--
/**
* Get cookie routine by Shelley Powers 
* (shelley.powers@ne-dev.com)
*/
function get_cookie(Name) {
var search = Name + "="
var returnvalue = "";
if (document.cookie.length > 0) {
offset = document.cookie.indexOf(search)
// if cookie exists
if (offset != -1) { 
offset += search.length
// set index of beginning of value
end = document.cookie.indexOf(";", offset);
// set index of end of cookie value
if (end == -1) end = document.cookie.length;
returnvalue= unescape(document.cookie.substring(offset, end))
}
}
return returnvalue;
}

if (get_cookie(window.location.pathname) != ''){
var openresults= get_cookie(window.location.pathname).split(" ")
for (i=0 ; i < openresults.length ; i++){
foldinglist[openresults[i]].style.display=''
document.all[foldinglist[openresults[i]].sourceIndex -
1].style.listStyleImage="url(open.gif)"
}
}

if (document.all){
var nodelength=foldinglist.length-1
var nodes=new Array(nodelength)
var openones=''
}

function check(){
for (i=0 ; i <= nodelength ; i++){
if (foldinglist[i].style.display=='')
openones=openones + " " + i
}
document.cookie=window.location.pathname+"= "+openones
}

if (document.all)
document.body.onunload=check
//-->
</script> 
 


--------------------------------------------------------------------------------

   
 
 автор: Footer   (26.01.2008 в 07:22)   письмо автору
 
   для: elenaki   (25.01.2008 в 19:35)
 

Спасибо, всё работает. Но ещё такой вопрос: там чтобы открылось подменю, нужно щёлкнуть на пункт меню, а можно как-то сделать, чтобы просто при наведении на пункт меню выпадало подменю, то есть без щёлчка?

   
 
 автор: Footer   (26.01.2008 в 07:24)   письмо автору
 
   для: elenaki   (25.01.2008 в 19:35)
 

.

   
 
 автор: elenaki   (26.01.2008 в 18:28)   письмо автору
 
   для: Footer   (26.01.2008 в 07:24)
 

document.onclick=change


наверно, надо сделать тут onmouseover...

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

   
 
 автор: Footer   (28.01.2008 в 14:24)   письмо автору
 
   для: elenaki   (26.01.2008 в 18:28)
 

Я сейчас зашёл на http://www.milonic.com/ Там сразу на этой странице есть горизонтальное меню трёхуровневое. Мне вот такое нужно. Но не получается понять как оно построено. Помогите, плиз, кодом JavaScripta, который там работает.

   
 
 автор: Footer   (29.01.2008 в 12:52)   письмо автору
 
   для: Footer   (28.01.2008 в 14:24)
 

Так всё таки, как вытащить из этого сайта меню? Хелп!

   
 
 автор: elenaki   (29.01.2008 в 13:38)   письмо автору
 
   для: Footer   (29.01.2008 в 12:52)
 

пойти по ссылке download и скачать

   
 
 автор: Footer   (29.01.2008 в 15:59)   письмо автору
 
   для: elenaki   (29.01.2008 в 13:38)
 

Скачал меню. Настроил. Но вылезает текст при наведении на пункты меню о том, что нужно разеригстрировать этот продукт. Ребят, а как его убрать самому, чтобы не платить за программу? Прилагаю два файла, которые должны быть на сайте. Помогите, пожалуйста, убрать их рекламу.

   
 
 автор: вялый   (29.01.2008 в 21:03)   письмо автору
 
   для: Footer   (28.01.2008 в 14:24)
 

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

table.child {background:  #FFFFFF;  position: absolute; text-align: center; visibility: hidden}

table.parent { position: absolute; text-align: center}

td {background:  #c0c0c0; font-size: small;}

/* End of style section. Generated by AceHTML at 29.05.2007 10:35:11 */
-->
</style>
</head>
<body style="font-size: xx-large">
<div style="position: absolute; left: 200px">
<script>
var menu=Array("О нас","Новейшие достижения","Ссылки","Реклама","Мои фотки")
var menu1=new Array();
 menu1[0]=Array("Кто мы","Как нас зовут","Сколько нам лет");
 menu1[1]=Array("Спортивные достижения","Производственные достижения","Научные достижения");
 menu1[2]=Array("Левые ссылки","Хорошие ссылки");
 menu1[3]=Array("Наша реклама","Чужая реклама","Реклама с дружественных ресурсов");

var h=30;  //Высота строки
var wg=200; // Ширина главного меню
var wl=300; //Ширина локального меню
var bc="#000000"; //Цвет границы рамки
var b=0;      //Толщина рамки
var cc=2;      //Толщина границы между ячейками
var cd=2;     //Толщина границы между рамкой и текстом
var d=document;

function in1(id)
     {var elem=document.getElementById(id);
      elem.style.visibility='visible'; 
      }                               
function out1(id)
     {var elem=document.getElementById(id);
     elem.style.visibility='hidden';
      }
function in2(th)
     {th.style.backgroundColor="#d3d3d3";
      th.style.cursor="hand";
     }
function out2(th)
     {th.style.backgroundColor="#c0c0c0";
     }
function h1(i)
     {if(menu1[i])return(h*menu1[i].length)
     else return(h);
     }
                           //Глобальное меню
d.write("<table class='parent' width='"+wg+"' height='"+(h*menu.length)+"'border='"+b+"'        bordercolor='"+bc+"' cellspacing='"+cc+"' cellpadding='"+cd+"' style='position:    absolute'>");
 for(i=0;i<menu.length;i++)
  {d.write("   <tr>");
  d.write("       <td onmouseover=in1('child"+i+"',this),in2(this)   onmouseout=out1('child"+i+"',this),out2(this)>"+menu[i]+"</td>");
  d.write("   </tr>");
 }
 d.write("</table>");

                            //Локальные меню 
  for(i=0;i<=menu.length;i++)
 {d.write(" <table class='child' ID='child"+i+"' onmouseover=in1('child"+i+"')  onmouseout=out1('child"+i+"') width='"+wl+"' height='"+h1(i)+"' border='"+b+"' bordercolor='"+bc+"' cellpadding='"+cd+"' cellspacing='"+cc+"'  style='visibility: hidden; left:"+(wg-3)+"; top:"+(h*i)+";'");
 for(a=0;a<menu1[i].length;a++)
 { d.write("<tr>");
  d.write("       <td onmouseover=in2(this) onmouseout=out2(this)>"+menu1[i][a]+"</td>");
  d.write("    </tr>");
 }
d.write("</table>");
}
</script>
</div>

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования