Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Меню аккардион jQuery (https://javascript.ru/forum/jquery/29510-menyu-akkardion-jquery.html)

DzirT 01.07.2012 01:32

Меню аккардион jQuery
 
Господа программисты помогите пож-та немного доработать.
Есть вертикальное меню меню вида:
<ul id="menu">
  <li> <a href="#">Главная</a>
    <ul>
      <li><a href="#">Каталог 1</a></li>
      <li><a href="#">Каталог 2</a>
        <ul>
          <li><a href="#">Подкаталог 1</a></li>
          <li><a href="#">Подкаталог 2</a></li>
          <li><a href="#">Подкаталог 3</a></li>
        </ul>
      </li>
      <li><a href="#">Каталог 3</a></li>
    </ul>
  </li>
  <li> <a href="#">Programming Languages</a>
    <ul>
      <li><a href="#">PHP</a></li>
      <li><a href="#">Ruby</a></li>
    </ul>
  </li>
</ul>

При клике на Главную открываются пункты: Каталоги, а подкаталоги остаются скрыты.
Какие изменения внести в код ниже чтобы Подкаталоги тоже открывались при клике на Главную.
function initMenu() {
  $('#menu ul').hide();
  $('#menu ul:first').show();
  $('#menu li a').click(
    function() {
      var checkElement = $(this).next();
      if((checkElement.is('ul')) && (checkElement.is(':visible'))) {
        return false;
        }
      if((checkElement.is('ul')) && (!checkElement.is(':visible'))) {
        $('#menu ul:visible').slideUp('normal');
        checkElement.slideDown('normal');
        return false;
        }
      }
    );
  }
$(document).ready(function() {initMenu();});

aDiVaNToS 01.07.2012 13:42

Это все можно сделать с помощью одного лишь СSS и не нужно здесь скрипта =) сэкономишь на времени загрузки страницы пару милисек =)

devote 01.07.2012 14:00

Цитата:

Сообщение от aDiVaNToS
Это все можно сделать с помощью одного лишь СSS и не нужно здесь скрипта =) сэкономишь на времени загрузки страницы пару милисек =)

Покажешь как? Мне даже любопытно как ты это сделаешь так, что бы открытое меню еще и не закрывалось после открытия.

<style>
    #menu > li ul {
        display: none;
    }
    #menu > li > a:focus ~ ul,
    #menu > li > a:focus ~ ul ul {
        display: block;
    }
</style>
<ul id="menu">
  <li> <a href="#">Главная</a>
    <ul>
      <li><a href="#">Каталог 1</a></li>
      <li><a href="#">Каталог 2</a>
        <ul>
          <li><a href="#">Подкаталог 1</a></li>
          <li><a href="#">Подкаталог 2</a></li>
          <li><a href="#">Подкаталог 3</a></li>
        </ul>
      </li>
      <li><a href="#">Каталог 3</a></li>
    </ul>
  </li>
  <li> <a href="#">Programming Languages</a>
    <ul>
      <li><a href="#">PHP</a></li>
      <li><a href="#">Ruby</a></li>
    </ul>
  </li>
</ul>

aDiVaNToS 01.07.2012 14:30

devote,
извини забыл оно должно не сворачиваться=(
прочитал просто меню =)))

DzirT 01.07.2012 15:56

Видимо в таком варианте решения нет :cray:

Deff 01.07.2012 15:57

DzirT,
Да есть - не хнычь - думайте - или ждите вечера я или devote или melky
поправят
к примеру для инициализации нун так
$('#menu li:first ul').show()

DzirT 01.07.2012 18:29

нашел вариант к списку подкаталогов присвоить селектор :
<ul id="menu2">
            <li><a href="#">Подкаталог 1</a></li>
            <li><a href="#">Подкаталог 2</a></li>
            <li><a href="#">Подкаталог 3</a></li>
          </ul>


ну а далее .toggle() :

function initMenu() {
  $('#menu ul').hide();
  $('#menu ul:first, #menu li:first ul').show();
  $('#menu li a').click(
    function() {
	$('#menu2, #menu2 li, #menu2 li a').toggle()
      var checkElement = $(this).next();
      if((checkElement.is('ul')) && (checkElement.is(':visible'))) {
        return false;
        }
      if((checkElement.is('ul')) && (!checkElement.is(':visible'))) {
        $('#menu ul:visible, #menu li:visible ul').slideUp('normal');
        checkElement.slideDown('normal');
        return false;
        }
      }
    );
  }
$(document).ready(function() {initMenu();});

На сколько это правильно? А вот без второго селектора, как изначально задумано, никак - не могу понять как указать в таком случае вложенность.
P.S. и так при клике на любом пункте <ul id="menu2">....</ul> закрывается.

devote 01.07.2012 18:53

Цитата:

Сообщение от DzirT
нашел вариант к списку подкаталогов присвоить селектор :

яж показал вариант на CSS, перелопатить его не джуквери не должно было составить труда:
<!DOCTYPE html>
<html>
    <head>
        <style type="text/css">
            #menu > li > ul {
                display: none;
            }
        </style>
        <script src="http://code.jquery.com/jquery.min.js" type="text/javascript"></script>
        <script type="text/javascript">
            $(function(){
                $("#menu > li > a").click(function() {
                    $( "~ ul", this ).slideToggle();
                });
            });
        </script>
    </head>
    <body>
        <ul id="menu">
          <li> <a href="#">Главная</a>
            <ul>
              <li><a href="#">Каталог 1</a></li>
              <li><a href="#">Каталог 2</a>
                <ul>
                  <li><a href="#">Подкаталог 1</a></li>
                  <li><a href="#">Подкаталог 2</a></li>
                  <li><a href="#">Подкаталог 3</a></li>
                </ul>
              </li>
              <li><a href="#">Каталог 3</a></li>
            </ul>
          </li>
          <li> <a href="#">Programming Languages</a>
            <ul>
              <li><a href="#">PHP</a></li>
              <li><a href="#">Ruby</a></li>
            </ul>
          </li>
        </ul>
    </body>
</html>

DzirT 01.07.2012 19:37

Цитата:

яж показал вариант на CSS,
Кликнул на главную - открылось, кликнул на Programming Languages - открылось, а главная не закрылась. Тот код что я дал в начале есть чуть ли не в каждом ГС -блоге, и ваш вариант в интерпретациях попадался тоже. Но к сожалению варианта как я указал ( чистые списки с тремя уровнями, не накачанные тегами span div и тд не нашел, где при клике на пункт - неактивный свертывается, может плохо искал.
Цитата:

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

devote 01.07.2012 19:58

Цитата:

Сообщение от DzirT
где при клике на пункт - неактивный свертывается, может плохо искал.

вот проблема то. Вы же ничего изначально не пояснили, от того и получили вариант не тот что нужно:
<!DOCTYPE html>
<html>
    <head>
        <style type="text/css">
            #menu > li > ul {
                display: none;
            }
            #menu > li:first-child > ul {
                display: block;
            }
        </style>
        <script src="http://code.jquery.com/jquery.min.js" type="text/javascript"></script>
        <script type="text/javascript">
            $(function(){
                $("#menu > li > a").click(function() {

                    $( "~ ul", this ).slideToggle();

                    var self = $( this ).next();

                    $( "#menu > li > ul" ).each(function() {

                        if ( self[0] !== this ) {

                            $( this ).slideUp();
                        }
                    });
                });
            });
        </script>
    </head>
    <body>
        <ul id="menu">
          <li> <a href="#">Главная</a>
            <ul>
              <li><a href="#">Каталог 1</a></li>
              <li><a href="#">Каталог 2</a>
                <ul>
                  <li><a href="#">Подкаталог 1</a></li>
                  <li><a href="#">Подкаталог 2</a></li>
                  <li><a href="#">Подкаталог 3</a></li>
                </ul>
              </li>
              <li><a href="#">Каталог 3</a></li>
            </ul>
          </li>
          <li> <a href="#">Еще какая то</a>
            <ul>
              <li><a href="#">Каталог 1</a></li>
              <li><a href="#">Каталог 2</a>
                <ul>
                  <li><a href="#">Подкаталог 1</a></li>
                  <li><a href="#">Подкаталог 2</a></li>
                  <li><a href="#">Подкаталог 3</a></li>
                </ul>
              </li>
              <li><a href="#">Каталог 3</a></li>
            </ul>
          </li>
          <li> <a href="#">Programming Languages</a>
            <ul>
              <li><a href="#">PHP</a></li>
              <li><a href="#">Ruby</a></li>
            </ul>
          </li>
        </ul>
    </body>
</html>


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