Форум программистов, компьютерный форум, киберфорум
JavaScript
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
6 / 6 / 3
Регистрация: 12.03.2014
Сообщений: 341
1

Раскрывающееся меню - при открытии/закрытии вложенного меню закрывается все меню

03.05.2014, 10:33. Показов 2720. Ответов 6
Метки нет (Все метки)

Проблема во вложенном меню. При открытии/закрытии вложенного меню закрывается все меню. Надо, чтобы главное меню не реагировало на клики во вложенных меню, а реагировало только на своем заголовке.
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
<html>
<head>
    <meta charset="utf-8">
    <link rel="stylesheet" type="text/css" href="main.css">
</head>
<body>
    <ul class="menu">
            <li><a href="">Стратегия</a></li>
            <li><a href="">О нас</a></li>
            <li class="click" id="clickOne" onMouseUp="toggle('clickOne', 'menu_op')"><a href="">Продукция</a>
                <ul class="menu_op">
                    <li class="click" id="clickOneOne" onMouseUp="toggle('clickOneOne', 'menu_in_1')"><a href="">Софт</a>
                        <ul class="menu_in_1">
                            <li><a href="">Браузер</a></li>
                            <li><a href="">Почта</a></li>
                            <li><a href="">Мессенджер</a></li>
                        </ul>
                    </li>
                    <li class="click"  id="clickOneTwo" onMouseUp="toggle('clickOneTwo', 'menu_in_2')"><a href="">Железо</a>
                        <ul class="menu_in_2">
                            <li><a href="">Блоки питания</a></li>
                            <li><a href="">Видеокарты</a></li>
                            <li><a href="">Жесткие диски</a></li>
                        </ul>
                    </li>
                </ul>
            </li>
            <li class="click" id="clickTwo" onMouseUp="toggle('clickTwo', 'menu_op')"><a href="">Сообщества</a>
                <ul class="menu_op">
                    <li><a href="">Вконтакте</a></li>
                    <li><a href="">Твиттер</a></li>
                    <li><a href="">Фейсбук</a></li>
                    <li><a href="">ЖЖ</a></li>
                    <li><a href="">Гугл+</a></li>
                    <li><a href="">Одноклассники</a></li>
                </ul>
            </li>
            <li id="last_menu_item"><a href="">Контакты</a></li>
        </ul>
    <script>
        function toggle(el_id, el_class) 
        { 
            var list = document.getElementById(el_id).getElementsByClassName(el_class);
            for(var i=0;i<list.length;i++){
                if(list[i].style.display == "block") {list[i].style.display = "none"} else {list[i].style.display = "block"};
            }
            if (document.getElementById(el_id).style.listStyleImage == "url(close.jpg") {document.getElementById(el_id).style.listStyleImage = "url(open.jpg)"} else {document.getElementById(el_id).style.listStyleImage = "url(close.jpg)"};
        }
    </script>
</body>
</html>
CSS
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
ul.menu li {
list-style-image: url(close.jpg);
}
ul.menu {
display: inline-block;
}
ul.menu li ul.menu_op {
display: none;
}
ul.menu_op {
display: block;
z-index: 2;
}
ul.menu_op li ul.menu_in_1 {
display: none;
}
ul.menu_op li ul.menu_in_2 {
display: none;
}
ul.menu_in_2 {
display: block;
z-index: 3;
}
ul.menu_op li ul.menu_in_2 {
display: none;
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.05.2014, 10:33
Ответы с готовыми решениями:

Работа с меню. При клике на кнопке меню или вне его, меню должно закрываться
Добрый вечер! Изучаю JQuery. Вот ради развития решил написать меню, практически такое же как на...

Horizontal_multilevel шаблон меню. Первый и последний элемент вложенного меню отличаются
Доброго времени суток! Редактируя шаблон меню horizontal_multilevel, столкнулась с проблемой: как...

Раскрывающееся меню при наведении
Здравствуйте, у нас такая проблема, поставили в блок header.php виджет меню, которое должно...

Раскрывающееся меню (подобно меню "аккордион ")
Добрый день! Как можно реализовать следующее меню, но так, чтобы при открытии другой вкладки,...

6
635 / 522 / 195
Регистрация: 19.08.2013
Сообщений: 1,400
03.05.2014, 12:46 2
Лучший ответ Сообщение было отмечено Bolbine84455 как решение

Решение

HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
 <ul id="menu">
            <li><a href="#">Стратегия</a></li>
            <li><a href="#">О нас</a></li>
            <li><a href="#">Продукция</a>
                <ul>
                    <li><a href="#">Софт</a>
                        <ul>
                            <li><a href="#">Браузер</a></li>
                            <li><a href="#">Почта</a></li>
                            <li><a href="#">Мессенджер</a></li>
                        </ul>
                    </li>
                    <li><a href="#">Железо</a>
                        <ul>
                            <li><a href="#">Блоки питания</a></li>
                            <li><a href="#">Видеокарты</a></li>
                            <li><a href="#">Жесткие диски</a></li>
                        </ul>
                    </li>
                </ul>
            </li>
            <li><a href="#">Сообщества</a>
                <ul>
                    <li><a href="#">Вконтакте</a></li>
                    <li><a href="#">Твиттер</a></li>
                    <li><a href="#">Фейсбук</a></li>
                    <li><a href="#">ЖЖ</a></li>
                    <li><a href="#">Гугл+</a></li>
                    <li><a href="#">Одноклассники</a></li>
                </ul>
            </li>
            <li><a href="#">Контакты</a></li>
        </ul>
CSS
1
2
3
    #menu ul{display: none;}
    #menu .opened{display: block;}
    #menu .closed{display: none;}
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
function toggleList(el) {
        if(hasClass(el, 'opened') === true) {
           removeClass(el, 'opened');
           addClass(el, 'closed');
        }else{
           removeClass(el, 'closed');
           addClass(el, 'opened');
        }
      }
 
      function addClass(el, cls) {
        var len = el.className.length;
        len === 0 ? el.className += cls : el.className += ' ' + cls;
      }
 
      function removeClass(el, cls) {
        var classes = el.className.split(' ');
        for(var i = 0, len = classes.length; i < len; i++) {
          if(classes[i] === cls){
             classes.splice(i--,1);
          }
        }
        el.className = classes.join(' ');
      }
 
      function hasClass(el, cls) {
        var classes = el.className.split(' ');
        for(var i = 0, len = classes.length; i < len; i++) {
          if(classes[i] === cls) return true;
        }
        return false;
      }
 
      document.getElementById('menu').onclick = function(event) {
 
        event = event || window.event;
        var target = event.target || event.srcElement;
 
        if(target.tagName === 'A') {
           var lists =  target.parentNode.getElementsByTagName('ul'),
               listsLength = lists.length;
 
            if(listsLength !== 0) {
                toggleList(lists[0]);
                return false;
            }   
        }
 
      }
Добавлено через 1 минуту
Логику для url(close.jpg") думаю сможете сами дописать.

Добавлено через 4 минуты
На всякий случай http://codepen.io/anon/pen/BhCgG
1
Bolbine84455
03.05.2014, 14:32  [ТС]
  #3

Не по теме:

Работает отлично, но код(JS) какой-то уж слишком объемный. Я думал, такое можно реализовать в строчках 5-7

0
635 / 522 / 195
Регистрация: 19.08.2013
Сообщений: 1,400
03.05.2014, 15:04 4
Bolbine84455 я привел реализацию того, как я бы сделал. Функции removeClass, addClass и hasСlass можно использовать повторно на всем сайте. Ну а что касается 5-7 строк для такой реализации на чистом js, то я бы с удовольствием на это посмотрел

Добавлено через 14 минут
Кстати, если забить на ie (до аж 9 версии включительно) то код можно существенно сократить:
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
document.getElementById('menu').onclick = function(event) {
 
        event = event || window.event;
        var target = event.target || event.srcElement;
 
        if(target.tagName === 'A') {
           var lists =  target.parentNode.getElementsByTagName('ul'),
               listsLength = lists.length;
 
            if(listsLength !== 0) {
                lists[0].classList.toggle('opened');
                return false;
            }   
        }
 
      }
Добавлено через 1 минуту
Поддержку объекта classList можно посмотреть тут: http://caniuse.com/classlist
1
6 / 6 / 3
Регистрация: 12.03.2014
Сообщений: 341
04.05.2014, 00:16  [ТС] 5
По вашему примеру старому я смог картинки добавить
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
document.getElementById('menu').style.listStyleImage = 'url(close.jpg)';    
        
        function toggleList(el) {
        if(hasClass(el, 'opened') === true) {                           
           removeClass(el, 'opened');                                             
           addClass(el, 'closed');                                          
           el.parentNode.style.listStyleImage = "url(close.jpg)";
           el.style.listStyleImage = "url(close.jpg)";
        }else{
           removeClass(el, 'closed');
           addClass(el, 'opened');
           el.parentNode.style.listStyleImage = "url(open.jpg)";
           el.style.listStyleImage = "url(close.jpg)";
        }
      }
В новом примере подобное не выходит
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
document.getElementById('menu').onclick = function(event) {
 
        event = event || window.event;
        var target = event.target || event.srcElement;
        
        if(target.tagName === 'A') {
           var inf=false;
           var lists =  target.parentNode.getElementsByTagName('ul'),
               listsLength = lists.length; 
               
            if(listsLength !== 0) {
                lists[0].classList.toggle('opened');
                lists[0].parentNode.style.listStyleImage = 'url(open.jpg)';
                lists[0].style.listStyleImage = 'url(close.jpg)'; 
            }
            if(lists[0].parentNode.style.listStyleImage == 'url(open.jpg)') {lists[0].parentNode.style.listStyleImage = 'url(close.jpg)'; }
        }
 
      }
Картинку октрытия показывает, а при повторном клике, когда папка закрывается - оставляет старую картинку
0
635 / 522 / 195
Регистрация: 19.08.2013
Сообщений: 1,400
04.05.2014, 00:26 6
Если вы решили делать через classList api, то воспользуйтесь классами для добавления нужной картинки (аналогично как я сделал для показа и скарытия меню). создайте стили с картинками и меняйте класс через classList.toggle
1
Bolbine84455
04.05.2014, 04:46  [ТС]     Раскрывающееся меню - при открытии/закрытии вложенного меню закрывается все меню
  #7

Не по теме:

Сработало. Спасибо

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.05.2014, 04:46

Как сделать раскрывающееся меню при нажатие на кнопку в форме
Уважаемые форумчане подскажите, как сделать раскрывающееся меню при нажатие кнопки на форме! Есть...

Как добавить выплывающее меню к уже готовому горизонтальному меню (не меняя дизайн горизонтального меню)?
&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Strict//EN&quot;...

Добавить меню к итему меню, который уже находится в главном меню
Как можно программно добавить подменю к итему меню, который находится в главном меню? Чтобы...

раскрывающееся меню
Доброго времени суток. Необходимо сделать раскрывающееся меню с эффектом. Сверстал меню, которое...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru