За последние 24 часа нас посетили 17437 программистов и 1722 робота. Сейчас ищут 957 программистов ...

Выдвигающееся меню

Тема в разделе "JavaScript и AJAX", создана пользователем DaniilKhanin, 3 авг 2014.

  1. DaniilKhanin

    DaniilKhanin Новичок

    С нами с:
    30 июл 2014
    Сообщения:
    24
    Симпатии:
    0
    Решил заморочиться и сделать выдвигающееся меню . выдвигаться оно будет сверху.

    HTML
    Код (Text):
    1.  
    2.  
    3. <div id="menu" style="position:absolute; background-color:blue; height:100px;width:100%;top:-100px;"></div>
    4. <div id="button" style="background-color:black;width:40px;height:40px;position:absolute;"></div>
    JS
    Код (Text):
    1.  
    2.  
    3. window.onload=function () {
    4.    
    5.     var button=document.getElementById('button'),
    6.    
    7.      menu=document.getElementById('menu');
    8.    
    9.         button.onclick= function () {
    10.        
    11.         menu.style.top='0';
    12.            
    13.        
    14.        
    15.        
    16.        
    17.        
    18.        
    19.         }
    20.    
    21.    
    22.     }

    1) Так как js изучаю совсем недолго не могу понять как сделать чтобы при втором щелчке оно обратно задвигалось.

    2) Как реализовать плавное выдвижение (css3 не хочу использовать).

    3) Почему
    Код (Text):
    1. document.getElementsByTagName('body').style.top='200';
    является неправильным??? Cannot set property 'top'
    Просьба сам код не выкладывать а натолкнуть на мысль ...
     
  2. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    Одним словом - "флаг". Чуть расшифровав: сначала "флаг" = false, после открытия - "флаг" = true, закрыли - опять false и т.д.
    Для плавности: setInterval или setTimeout - каждый интервал времени какое-то одно маленькое действие
    P.S. Заметил, что вы добавили еще третий пункт. Ответ - нет, не правильно. И не правильно по двум причинам:
    1. Не правильный синтаксис. Корректней так:
    Код (Text):
    1. document.getElementsByTagName('body')[0].style.top='200px';
    При этом, у body должно быть свойство position: absolute; или position: fixed;
    2. Не правильно с точки зрения самого подхода. BODY - это как основной холст и манипулировать им не есть гуд , лучше создать внутреннюю обёртку для всех элементов и извращаться над ней.
     
  3. DaniilKhanin

    DaniilKhanin Новичок

    С нами с:
    30 июл 2014
    Сообщения:
    24
    Симпатии:
    0
    Код (Text):
    1.  
    2.  
    3.     window.onload=function () {
    4.    
    5.     var button=document.getElementById('button'),
    6.    
    7.         menu=document.getElementById('menu');
    8.    
    9.         button.onclick= function () {
    10.        
    11.         if button.hasClass('closed'){
    12.         menu.style.top='0';
    13.         this.removeClass('closed').addClass('open');
    14.         }
    15.        
    16.         else if button.hasClass('open'){
    17.         menu.style.top='-100';
    18.        
    19.        
    20.        
    21.         }
    22.        
    23.            
    24.         }
    25.    
    26.    
    27.     }
    Я правильно понял?? или несовсем?? Этой функцией я хочу сказать следующее: Если кнопка с id 'button' имеет класс 'closed' тогда menu top='0' удаляем класс 'closed' добавляем 'open', если кнопка имеет класс 'open' menu top='100' ;
     
  4. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    Что-то вы тут намешали... hasClass, addClass и removeClass - это методы jQuery. Когда вы работаете с этой библиотекой, то методы применяются не к DOM-элементу, а к объекту jQuery. Например, если на чистом JS мы используем this, то в jQuery - $(this). Поэтому, для начала определитесь - вы изучаете нативный JavaScript или его библиотеку. К тому же window.onload - это плохой подход, но пока, пару дней ;) , можете на этом не заострять внимание.

    И дополнил ответ в предыдущем своём ответе.
     
  5. DaniilKhanin

    DaniilKhanin Новичок

    С нами с:
    30 июл 2014
    Сообщения:
    24
    Симпатии:
    0
    да это я подглядел в код который на JQery, я так понимаю hasClass , addClass removeClass должны быть на чистом js
     
  6. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    Перечитайте мой ответ и попробуйте догадаться с трёх попыток.
     
  7. DaniilKhanin

    DaniilKhanin Новичок

    С нами с:
    30 июл 2014
    Сообщения:
    24
    Симпатии:
    0
    понял. Тогда получается вся эта заваруха с классами неправильный подход. куда копать?
     
  8. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    Неправильный подход в том, что вы нахватались кода на каком-то ресурсе и, не понимая его смысла, пытаетесь "лепить из *овна пулю". Если начали изучение, то или читайте обучающую литературу, или пользуйтесь правильными ресурсами. Для начала изучите (хотя бы) основы JavaScript (вот очень хороший ресурс), а потом уже можете освоить и jQuery. Не рвите сцепление, а двигайтесь постепенно.
     
  9. DaniilKhanin

    DaniilKhanin Новичок

    С нами с:
    30 июл 2014
    Сообщения:
    24
    Симпатии:
    0
    На данный момент пытаюсь изучить чистый js в Jquery лезть не хочу (покачто), addClass, removeClass, использовал потомучто не знал что они с кода написанного на Jquery.

    В общем я понял что мне нужно Условие если true то выполняется top='0', если false = '-100' , только вот какое условие написать я не пойму((((
     
  10. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    А вы за своё. Ладно, я вам покажу простейший пример, как желательно писать сценарий, когда нам нужно всего-навсего менять цвет бэкграунда у элемента по клику. Вот ссылочка. А потом, сами себе задайте вопрос: "Смогу ли я написать эту грёбаную менюху, если даже элементарных основ не знаю?"
     
  11. DaniilKhanin

    DaniilKhanin Новичок

    С нами с:
    30 июл 2014
    Сообщения:
    24
    Симпатии:
    0
    К сожалению не могу понять этот вот код ... что это за условие зачем оно?
    Код (Text):
    1. // функция кроссбраузерной установки обработчиков событий
    2. function addEvent(elem, type, handler){
    3.   if(elem.addEventListener){
    4.     elem.addEventListener(type, handler, false);
    5.   } else {
    6.     elem.attachEvent('on'+type, handler);
    7.   }
    8.   return false;
    9. }
    менюшку реализовал через такое условие
    Код (Text):
    1. if (menu.style.top == '0px') {
    2.     menu.style.top = '-100px';
    3. } else {
    4.     menu.style.top = '0px';
    5. }
     
  12. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    Осёл восьмой версии не понимает addEventListener ... да и не только это. Но мириться с этим пока еще приходится, т.к. по умолчанию с Windows 7 , устанавливается и IE8. И не все могут, по тем или иным причинам, установить нормальный браузер.
     
  13. DaniilKhanin

    DaniilKhanin Новичок

    С нами с:
    30 июл 2014
    Сообщения:
    24
    Симпатии:
    0
    Deonis спасибо за помощь
     
  14. DaniilKhanin

    DaniilKhanin Новичок

    С нами с:
    30 июл 2014
    Сообщения:
    24
    Симпатии:
    0
    Подскажите пожалуйста как реализовать плавное выдвижение через SetInterval или setTimeout, я пробовал вставить один из методов в функцию отвечающее за появление блока , только вот установив setTimeout я всеголишь указываю что функция выполняется (например) через 3с, и блок появляется через 3с (лочично))))). но как плавно реализовать не доходит(((
    Код (Text):
    1.  button.onclick=  function top() {
    2.        
    3.         menu.style.top=(flag ? '-100px' : '-90px');
    4.        
    5.         flag=!flag;
    6.        
    7.         //return false;
    8.         setInterval (top,3000);
    9.            
    10.         }
     
  15. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    Вот простой примерчик. Существуют полярные мнения по поводу того, что лучше использовать для анимации: setInterval или setTimeout, но решите для себя сами. Я же показал вам выше просто схему того, как это можно реализовать.
     
  16. DaniilKhanin

    DaniilKhanin Новичок

    С нами с:
    30 июл 2014
    Сообщения:
    24
    Симпатии:
    0
    Deonis я тут обверрнул это всё дело в функцию 'go()' и подключил событие onclick к диву, только вот теперь хочу чтобы по второму клику менюшка обратно заезжала. решил делать через flag, только вот с выражением (pos++)+'px' у меня проблемы(((( http://jsfiddle.net/62U2F/3/
     
  17. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    Сегодня нет много времени, посему коротко: задумывайтесь над тем, какие переменные должны быть глобальны и инициализироваться один раз и второе - onclick, да и вообще смешивание js и html это плохо. Уже рекорд побил по тому, сколько раз за пару дней это сказал.
    http://jsfiddle.net/Deonis/62U2F/4/
     
  18. DaniilKhanin

    DaniilKhanin Новичок

    С нами с:
    30 июл 2014
    Сообщения:
    24
    Симпатии:
    0
    Deonis, http://www.lol.domstroi69.ru нажмите на черный квадрат, выйдет менюшка, но проблема в том что она тормозит (хром и опера) в ИЕ всё норм, убрал css свойство background-size:cover; в хроме норм стало, есть идеи??? можно ли bg-size:cover заменить скриптом?? так как ие 8ой его не понимает(( , или может быть мой js на выезжающий блок слегка кривой?

    JS
    Код (Text):
    1. var flag = true,
    2.     pos = -150,
    3.     position = 0,
    4. pozner = 0;
    5.  
    6. function go() {
    7.  
    8.     var el = document.getElementById('myblock'),
    9.         knopka = document.getElementById('button'),
    10.         block = document.getElementById('bg'),
    11.         timer = setInterval(function () {
    12.             el.style.top = (flag ? pos++ : pos--) + 'px';
    13.        
    14.             knopka.style.top = (flag ? position++ : position--) + 'px';
    15.          
    16.             block.style.top = (flag ? pozner++ : pozner--) + 'px';
    17.          
    18.             if (pos >= 0 || pos < -150) {
    19.                 clearInterval(timer);
    20.                
    21.                 flag = !flag;
    22.             }
    23.  
    24.         }, 5);
    25.        
    26. }
    27. //document.getElementById('button').addEventListener('click', go, false);
    2)кстати браузер выдает ошибку на .addEventListener. (( пришлось в html на кнопку ставить...

    3) для ускорения менюшки ставил значение setInterval на '1' но чтото не очень быстро както (во всех браузерах по разному), а вот когда в скрипт дублируешь строки
    Код (Text):
    1. knopka.style.top = (flag ? position++ : position--) + 'px';
    2.          
    3.             block.style.top = (flag ? pozner++ : pozner--) + 'px';
    то помогает...

    Есть варианты как исправить торможение это??