Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 23.12.2015, 17:24
Аватар для golopogos
Интересующийся
Отправить личное сообщение для golopogos Посмотреть профиль Найти все сообщения от golopogos
 
Регистрация: 19.05.2014
Сообщений: 24

Управление блоком меню
Добрый день, друзья. Как реализовать такую конструкцию:

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

1. чтоб при загрузке страницы блок меню автоматом выдвигался, а через некоторое время прятался (10 сек.);
2. одновременно блок можно как задвинуть, так и выдвинуть по щелчку.

код jQuery:

$(document).ready(function() {
			
			$("body").click(function(){

			var slidepx=$(".sidebar").width();
				if ( !$("#maincontent").is(':animated') ) { 
					if (parseInt($("#maincontent").css('marginLeft'), 10) < slidepx) {
						margin = "+=" + slidepx;
					} else {
						margin = "-=" + slidepx;
					}
					$("#maincontent").animate({ 
						marginLeft: margin
					}, {
							duration: 'slow',
							easing: 'easeOutQuint'
					});
				}
			});
		});


код HTML:

<div id="maincontent">
    <aside class="sidebar">
        <div><h3 >пример</h3></div>
    </aside>
</div>

Последний раз редактировалось golopogos, 23.12.2015 в 19:01.
Ответить с цитированием
  #2 (permalink)  
Старый 23.12.2015, 17:42
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Сообщение от golopogos
есть блок меню, который выезжает слева по щелчку на кнопку , по щелчку же и прячется.
$("body").click(function(e) - это что и есть кнопка, и причем тут e.preventDefault(), что у "body" может быть действием по умолчанию?

А если кнопка все таки есть, то по загрузке страницы запускать таймер а в нем триггер на обработчик этой кнопки.
Ответить с цитированием
  #3 (permalink)  
Старый 23.12.2015, 19:02
Аватар для golopogos
Интересующийся
Отправить личное сообщение для golopogos Посмотреть профиль Найти все сообщения от golopogos
 
Регистрация: 19.05.2014
Сообщений: 24

Сообщение от laimas Посмотреть сообщение
$("body").click(function(e) - это что и есть кнопка, и причем тут e.preventDefault(), что у "body" может быть действием по умолчанию?

А если кнопка все таки есть, то по загрузке страницы запускать таймер а в нем триггер на обработчик этой кнопки.
Здравствуйте, laimas

Да, кнопкой должен служить любой элемент на странице - это сенсорный экран на терминале и когда по экрану "тапают" (в любом его месте), меню должно выдвинуться + те условия, что я выше описал... Я немного подправил, так?

Для меня сложна пока такая логика. Я сам не справлюсь, помогите пожалуйста.
Ответить с цитированием
  #4 (permalink)  
Старый 23.12.2015, 19:33
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Ну если "тапать" по телу, то:

$(function() {
    var oB = $('body').click(function() {
        //здесь ваш код, см. примечание 
    });
    setTimeout(function() {
        oB[0].click();
    }, 500);
});


Примечание: можно ведь и не проверять состояние меню, то есть is(':animated') и далее действия. Если первый щелчок, это открыть, а последующий закрыть, так это как включать/выключать свет в комнате. Вы же не проверяете глядя на лампочку какая у нее нить накала, и если красная, то свет включен. По умолчанию (старт) лампочка выключена, первый щелчок включили, следующий - выключили, и т.д., автомат. А чтобы упростить работу автомата, можно запоминать состояние выключателя 0/1, умножая на которое значение смещения меню, тем самым без всяких проверок и условий показывать/скрывать его.

Ну это как примечание.
Ответить с цитированием
  #5 (permalink)  
Старый 23.12.2015, 19:52
Аватар для golopogos
Интересующийся
Отправить личное сообщение для golopogos Посмотреть профиль Найти все сообщения от golopogos
 
Регистрация: 19.05.2014
Сообщений: 24

Спасибо Вам большое!)
Ответить с цитированием
  #6 (permalink)  
Старый 23.12.2015, 20:24
Аватар для golopogos
Интересующийся
Отправить личное сообщение для golopogos Посмотреть профиль Найти все сообщения от golopogos
 
Регистрация: 19.05.2014
Сообщений: 24

Работает) только почему то не прячется) только первый раз, сразу после загрузки:

$(document).ready(function() {

			$(function() {
				var oB = $('body').click(function() {
 
					var slidepx=$(".sidebar").width();

					if ( !$("#maincontent").is(':animated') ) { 
						if (parseInt($("#maincontent").css('marginLeft'), 10) < slidepx) {
							margin = "+=" + slidepx;
						} else {
							margin = "-=" + slidepx;
						}
						$("#maincontent").animate({ 
							marginLeft: margin
						}, {
								duration: 'slow',
								easing: 'easeOutQuint'
						});
					}
				});
				setTimeout(function() {
					oB[0].click();
				}, 500);
			});
		});

Последний раз редактировалось golopogos, 23.12.2015 в 20:33.
Ответить с цитированием
  #7 (permalink)  
Старый 24.12.2015, 05:44
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Начальное состояние не то значит.
Вообще кроме меню на страницах могут быть иные кнопки и т.п., которые также активируются по щелчку, и можно представить себе как при этом будет вести себя меню. Может быть хотя бы область документа, а не все тело страницы должно управлять меню, если не одна кнопка?
Вот пример, в котором управление меню определено для родительского элемента, как область на странице, при этом управление производится по принципу описанному ранее в примечании:

<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
<style>
html, body {
	height: 100%;
    margin: 0;
}

#mainbox {
    position: relative;
    width: 300px;
    height: 100%;
}

.sidebar {
    position: absolute;
    left: 0;
    top: 0;
    width: 300px;
    height: 100%;
    background: #eee;
}

</style> 
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<script> 
$(function() {
    var oB = $('#mainbox').click(function() {
        var m = !oB.data('m'); //получить состояние меню и инвертировать его режим
        //по умолчанию меню открыто, что определяет его стиль
        //а объект не имеет установленного значения и m = !false = true
        oB.data({m:m}) //запомнить состояние меню
          .find('.sidebar')
          .stop()
          .animate({left: -m * 300}, 600); //скрыть/показать меню, что при первом обращении будет равно -true * 300 = -300
    })
    //.data({m:1/0}); //здесь можно определить начальное состояние меню - открыто или закрыто, то есть под логику,
    //но в данном случае мы не устанавливаем это, почему, в обработчике пояснение
    
    //скрыть меню при загрузке
    setTimeout(function() {
        oB[0].click();
    }, 1000);
});
</script>     
</head> 

<body>
<div id="mainbox">
    <div class="sidebar">Main</div>
</div>
</body> 
</html>
Ответить с цитированием
  #8 (permalink)  
Старый 24.12.2015, 09:10
Аватар для golopogos
Интересующийся
Отправить личное сообщение для golopogos Посмотреть профиль Найти все сообщения от golopogos
 
Регистрация: 19.05.2014
Сообщений: 24

У Вас на примере так же меню прячется единожды - после загрузки выдвигается и спустя некоторое время скрывается... Но как же все таки привязать к этой конструкции второй таймер?.. Что бы меню скрывалось не только в начале загрузки страницы единожды, а и всякий раз, спустя некоторое время после клика или при не-активности. Тут же нужно отслеживать его открытое состояние (через определенный промежуток времени открыто меню или закрыто), а у нас в данной конструкции нет привязки к конкретному состоянию...

Последний раз редактировалось golopogos, 24.12.2015 в 09:13.
Ответить с цитированием
  #9 (permalink)  
Старый 24.12.2015, 12:55
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Значит я не понял. Да, если еще и скрывать автоматом, то нужно проверить состояние меню, раскрывается ли оно ( if(!m) по примеру), и если да, то таймер. Но ведь и пользователь может его закрыть, а значит сработавший таймер уже не закроет меню, а откроет, и чтобы этого не случилось, нужно очищать таймер.
Но может быть иной сценарий лучше будет - запускать таймер на автоматическое закрытие только в случае, если пользователь покидает меню (или область меню, или кнопку ...), а если опять возвращается очищать таймер, то есть не связывать этот процесс со щелчками?
Ответить с цитированием
  #10 (permalink)  
Старый 24.12.2015, 15:20
Аватар для golopogos
Интересующийся
Отправить личное сообщение для golopogos Посмотреть профиль Найти все сообщения от golopogos
 
Регистрация: 19.05.2014
Сообщений: 24

Да, спасибо Вам laimas за подробные ответы. Буду пробовать.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Замена стилей класса Павел Турченко Элементы интерфейса 9 30.10.2015 15:24
Бесконечноуровневое меню на CSS ruslan_mart Ваши сайты и скрипты 5 12.01.2015 20:59
Текуший пункт меню и разные родители Kiano Элементы интерфейса 17 08.01.2015 07:59
Выделение активных пунктов многоуровневого меню на jQuery Letto Элементы интерфейса 2 04.12.2013 15:30
Проблема с аккордионом и меню Tie ExtJS 3 01.09.2011 14:36