23.12.2015, 17:24
|
|
Интересующийся
|
|
Регистрация: 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.
|
|
23.12.2015, 17:42
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
Сообщение от golopogos
|
есть блок меню, который выезжает слева по щелчку на кнопку , по щелчку же и прячется.
|
$("body").click(function(e) - это что и есть кнопка, и причем тут e.preventDefault(), что у "body" может быть действием по умолчанию?
А если кнопка все таки есть, то по загрузке страницы запускать таймер а в нем триггер на обработчик этой кнопки.
|
|
23.12.2015, 19:02
|
|
Интересующийся
|
|
Регистрация: 19.05.2014
Сообщений: 24
|
|
Сообщение от laimas
|
$("body").click(function(e) - это что и есть кнопка, и причем тут e.preventDefault(), что у "body" может быть действием по умолчанию?
А если кнопка все таки есть, то по загрузке страницы запускать таймер а в нем триггер на обработчик этой кнопки.
|
Здравствуйте, laimas
Да, кнопкой должен служить любой элемент на странице - это сенсорный экран на терминале и когда по экрану "тапают" (в любом его месте), меню должно выдвинуться + те условия, что я выше описал... Я немного подправил, так?
Для меня сложна пока такая логика. Я сам не справлюсь, помогите пожалуйста.
|
|
23.12.2015, 19:33
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
Ну если "тапать" по телу, то:
$(function() {
var oB = $('body').click(function() {
//здесь ваш код, см. примечание
});
setTimeout(function() {
oB[0].click();
}, 500);
});
Примечание: можно ведь и не проверять состояние меню, то есть is(':animated') и далее действия. Если первый щелчок, это открыть, а последующий закрыть, так это как включать/выключать свет в комнате. Вы же не проверяете глядя на лампочку какая у нее нить накала, и если красная, то свет включен. По умолчанию (старт) лампочка выключена, первый щелчок включили, следующий - выключили, и т.д., автомат. А чтобы упростить работу автомата, можно запоминать состояние выключателя 0/1, умножая на которое значение смещения меню, тем самым без всяких проверок и условий показывать/скрывать его.
Ну это как примечание.
|
|
23.12.2015, 19:52
|
|
Интересующийся
|
|
Регистрация: 19.05.2014
Сообщений: 24
|
|
Спасибо Вам большое!)
|
|
23.12.2015, 20:24
|
|
Интересующийся
|
|
Регистрация: 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.
|
|
24.12.2015, 05:44
|
Профессор
|
|
Регистрация: 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>
|
|
24.12.2015, 09:10
|
|
Интересующийся
|
|
Регистрация: 19.05.2014
Сообщений: 24
|
|
У Вас на примере так же меню прячется единожды - после загрузки выдвигается и спустя некоторое время скрывается... Но как же все таки привязать к этой конструкции второй таймер?.. Что бы меню скрывалось не только в начале загрузки страницы единожды, а и всякий раз, спустя некоторое время после клика или при не-активности. Тут же нужно отслеживать его открытое состояние (через определенный промежуток времени открыто меню или закрыто), а у нас в данной конструкции нет привязки к конкретному состоянию...
Последний раз редактировалось golopogos, 24.12.2015 в 09:13.
|
|
24.12.2015, 12:55
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
Значит я не понял. Да, если еще и скрывать автоматом, то нужно проверить состояние меню, раскрывается ли оно ( if(!m) по примеру), и если да, то таймер. Но ведь и пользователь может его закрыть, а значит сработавший таймер уже не закроет меню, а откроет, и чтобы этого не случилось, нужно очищать таймер.
Но может быть иной сценарий лучше будет - запускать таймер на автоматическое закрытие только в случае, если пользователь покидает меню (или область меню, или кнопку ...), а если опять возвращается очищать таймер, то есть не связывать этот процесс со щелчками?
|
|
24.12.2015, 15:20
|
|
Интересующийся
|
|
Регистрация: 19.05.2014
Сообщений: 24
|
|
Да, спасибо Вам laimas за подробные ответы. Буду пробовать.
|
|
|
|