6 / 6 / 5
Регистрация: 21.08.2012
Сообщений: 45
1

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

18.08.2016, 21:28. Показов 4913. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый вечер! Изучаю JQuery. Вот ради развития решил написать меню, практически такое же как на Хабре.
Два дня ломаю голову над тем, как объединить два метода в один. Суть в том чтоб при клике на кнопку меню или при клике вне области меню, меню должно закрываться.

По отдельности это сделать получилось, а вот объединить не получается.


Код HTML
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<section class="content">
        <div class="container">
            <div class="wrapper_menu">
                <div id="navbar_overlay" class="overlay hidden"></div>
                <div class="left_menu">
                    <a href="#" id="top_nav"><span class="fa fa-bars fa-5x" id="menu-icon"></a>
                </div>
                
                <div class="menu_tab " >
                    <div class="sub_menu" id="sub_menu">
                            <div class="title">Разделы</div>
                            <form class="search_sub">
                                <input type="text" name="search" placeholder="Search..">
                            </form>
                            <hr/>
                    </div>  
                </div>
            </div>
                
        </div>
    </section>
Код JQ

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
        $(".left_menu").click(function() {
            
            $('.menu_tab').toggle();
            var docHeight = $(document).height();
            $("body").append("<div id='overlay'></div>");
            $("#overlay")
                .height(docHeight)
                .css({
                     'opacity' : 0.4,
                     'position': 'absolute',
                     'top': 0,
                     'left': 0,
                     'background-color': 'black',
                     'width': '100%',
                     'z-index': 5000
                }); 
        });
        $(document).on('click', function(e) {
            if (!$(e.target).closest(".wrapper_menu").length) {
                $('.menu_tab').hide();
                $("#overlay").remove();
 
                
            }
            return false;
            e.stopPropagation();
        });

Так же прилагаю сам архив, со всеми файлами.

Буду признателен за помощь в написании кода или же за помощь в продумывании логики)).
Вложения
Тип файла: rar test_section.rar (759.4 Кб, 12 просмотров)
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.08.2016, 21:28
Ответы с готовыми решениями:

Меню должно выпадать при клике на его пункцт
&lt;!DOCTYPE html&gt; &lt;html&gt; &lt;head&gt; &lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=utf-8&quot; /&gt; &lt;link rel=&quot;stylesheet&quot;...

Скрыть меню при клике вне его области
Здравствуйте, имеется меню которое появляется по клику на кнопке. Я хочу сделать, чтобы по клику извне оно скрывалось. Гуглил, но не нашёл...

Показать/скрыть меню при клике вне его области
&lt;button type=&quot;button&quot; id=&quot;toggle&quot;&gt;Меню&lt;/button&gt; &lt;ul class=&quot;nav&quot; id=&quot;nav&quot;&gt; &lt;li&gt;&lt;a href=&quot;#&quot;&gt;Home&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a...

5
 Аватар для sad67man
2408 / 1405 / 663
Регистрация: 23.08.2015
Сообщений: 3,539
19.08.2016, 12:56 2
Лучший ответ Сообщение было отмечено Danzel как решение

Решение

Danzel,
CSS
1
2
3
4
5
6
7
8
9
#navbar_overlay {
    position: fixed;
    left: 0;
    top: 0;
    right: 0;
    bottom: 0;
    z-index: 1000;
    background: rgba(0,0,0,.55);
}
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$('.menu_tab').click(function(e){
    e.stopPropagation()
});
 
$(".left_menu").click(function(e) {
    if(!$('.menu_tab').is(":visible")){
        $('.menu_tab').show();
        $("#navbar_overlay").removeClass("hidden")
        e.stopPropagation();
        $(document).one("click", function(){
            $('.menu_tab').hide();
            $("#navbar_overlay").addClass("hidden");
        })
    }
})
1
6 / 6 / 5
Регистрация: 21.08.2012
Сообщений: 45
19.08.2016, 15:59  [ТС] 3
sad67man,

Огромное спасибо, как раз то, что нужно.

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

Вот код JQ, если кому - то вдруг станет интересно:
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$('.menu_tab').click(function(e){
    e.stopPropagation();
});
 
$(".left_menu").click(function(e) {
    if(!$('.menu_tab').is(":visible")){
        $('.menu_tab').show();
        $("#navbar_overlay").removeClass("hidden")
        e.stopPropagation();
        $(document).one("click", function(){
            $('.menu_tab').hide();
            $("#navbar_overlay").addClass("hidden");
             return false;
         })
         return false;  
    }
})
0
 Аватар для sad67man
2408 / 1405 / 663
Регистрация: 23.08.2015
Сообщений: 3,539
19.08.2016, 16:16 4
Danzel, Ну да. вверх прыгает из-за того, что срабатывает ссылка '#'.
В принципе return false генерирует e.stopPropagation(); и e.eventDefault();
Так что e.stopPropagation(); внутри функции .left_menu можно убрать.
Ну или наоборот добавить e.preventDefault();
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
$(".left_menu").click(function(e) {
    e.preventDefault();
    if(!$('.menu_tab').is(":visible")){
        $('.menu_tab').show();
        $("#navbar_overlay").removeClass("hidden")
        e.stopPropagation();
        $(document).one("click", function(){
            $('.menu_tab').hide();
            $("#navbar_overlay").addClass("hidden");
        })
    }
})
Ну или убрать ссылку "#". Вместо нее можно написать к примеру "javascript:void(0)". В общем вариантов масса. Даже не знаешь какой лучше)
0
6 / 6 / 5
Регистрация: 21.08.2012
Сообщений: 45
19.08.2016, 16:34  [ТС] 5

sad67man,


Спасибо, возьму на вооружение)

По поводу "javascript:void(0)" - впервые вижу), так что надо о ней почитать).
Еще раз спасибо за такую оперативную помощь))
0
 Аватар для sad67man
2408 / 1405 / 663
Регистрация: 23.08.2015
Сообщений: 3,539
19.08.2016, 16:43 6
Danzel, javascript код можно вставлять куда угодно, хоть в ссылку, хоть в адресную строку. void(0) - это пустое действие, которое ничего не делает. Заглушка "#", на самом деле это якорная ссылка на сам документ. Некоторые вместо "#" пишут "javascript:" Либо "javascript:void(0)";
В вашем случае можно вообще тег a убрать, вместо него поставить div или span, а в стилях добавить свойство
cursor:pointer;, чтоб изменялся курсор при наведении.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.08.2016, 16:43
Помогаю со студенческими работами здесь

Меню аккордион jQurty (расскрыть меню при клике на иконку)
Приветствую! Помогите пожалуста разобраться в разработке многоуровневого вертикального меню меню. В сети очень много готовых решений для...

Как сделать, чтобы меню-гамбургер скрывалось при клике на любую область, кроме самого меню
// Menu opener hamburger $('.menu-open').click(function() { // При клике на button ...

Раскрывающееся меню - при открытии/закрытии вложенного меню закрывается все меню
Проблема во вложенном меню. При открытии/закрытии вложенного меню закрывается все меню. Надо, чтобы главное меню не реагировало на клики во...

Работа меню при наведении, оставить фон основного меню
Добрый день! Помогите решить вопрос. Есть dropdown меню (белый буквы и черные фон) открывается при наведении, цвет и текст основного меню...

Не работает меню. Должно скрывать меню и раскрывать.
Беда в том, что меню не работает в JS. Должно скрывать меню и раскрывать. &lt;!DOCTYPE html&gt; &lt;html lang=&quot;en&quot;&gt; ...


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

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

Новые блоги и статьи
Циклы for в Python
py-thonny 17.03.2025
Существует множество ситуаций, когда нам нужно выполнить одно и то же действие несколько раз. Цикл for в Python — настоящий рабочий конь для большинства программистов. Если вам нужно пройтись по всем. . .
Предсказание ветвлений - путь к высокопроизводи­тельному C++
NullReferenced 17.03.2025
В высокопроизводительном программировании на C++ каждый такт процессора на счету. Когда речь заходит о разработке систем с низкой задержкой — будь то высокочастотная торговля, обработка потоковых. . .
Паттерн CQRS в C#
UnmanagedCoder 17.03.2025
Создание сложных корпоративных приложений часто требует нестандартных подходов к архитектуре. Один из таких подходов — паттерн CQRS (Command Query Responsibility Segregation), предлагающий простую,. . .
Паттерн Цепочка ответственности в C#
UnmanagedCoder 17.03.2025
Цепочка ответственности — это поведенческий паттерн проектирования, который позволяет передавать запросы последовательно по цепочке потенциальных обработчиков, пока один из них не обработает запрос. . . .
Создаем микросервисы с NestJS, TCP и Typescript
run.dev 17.03.2025
NestJS — фреймворк, который значительно упрощает создание серверных приложений на Node. js. Его прелесть в том, что он комбинирует концепции ООП, функционального программирования и предлагает. . .
Гексагональная архитектура со Spring Boot
Javaican 17.03.2025
Если вы когда-нибудь сталкивались с ситуацией, когда внесение простых изменений в базу данных или пользовательский интерфейс заставляло вас переписывать весь код, то вы точно оцените элегантность. . .
Позиционировани­е Kafka Consumer и Seek-операции
Javaican 17.03.2025
Что же такое Consumer Seek в Kafka? По сути, это API-метод, который позволяет программно указать, с какой позиции (offset) Consumer должен начать или продолжить чтение данных из партиции. Без этого. . .
Python NumPy: Лучшие практики и примеры
py-thonny 17.03.2025
NumPy (Numerical Python) — одна из ключевых библиотек для научных вычислений в Python. Она превращает Python из просто удобного языка общего назначения в среду для проведения сложных математических. . .
Java Micronaut в Docker: контейнеризация с Maven и Jib
Javaican 16.03.2025
Когда речь заходит о микросервисной архитектуре на Java, фреймворк Micronaut выделяется среди конкурентов. Он создан с учётом особенностей облачных сред и контейнеров, что делает его идеальным. . .
Управление зависимостями в Java: Сравнение Spring, Guice и Dagger 2
Javaican 16.03.2025
Инъекция зависимостей (Dependency Injection, DI) — один из фундаментальных паттернов проектирования, который радикально меняет подход к созданию гибких и тестируемых Java-приложений. Суть этого. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru