Косяк с меню - помогите разобраться

Тема в разделе "JavaScript", создана пользователем AlexGood, 20 апр 2018.

  1. AlexGood

    AlexGood

    Регистрация:
    28 ноя 2016
    Сообщения:
    254
    Симпатии:
    7
    Сделал меню на JS https://jsfiddle.net/AlexGood2016/f5c80mmo/#&togetherjs=ab9r2Kvurf.
    По клику на текст должно открываться меню справа налево под ним.
    А по итогу:
    1) по первому клику все РЕЗКО появляется на весь экран
    2) при втором клике плавно сворачивается слева-направо
    3) при третьем клике уже выезжает плавно как надо справа налево
    В чем косяк? Как сделать чтобы после обновления страницы сразу плавно открывалось справа-налево под ним при первом клике?
     
    Последнее редактирование: 20 апр 2018
  2. Dotrox

    Dotrox Команда форума

    Регистрация:
    27 ноя 2012
    Сообщения:
    3.198
    Симпатии:
    1.306
    Потому что вы его изначально задвинули за другой край экрана и браузер не может плавно выдвинуть справа то, что задвинуто за левый край экрана.
    Уберите из стилей right (или auto поставьте) и сразу задайте left.

    А вообще рекомендую для подобных штук использовать transform: translateX().
     
    AlexGood нравится это.
  3. AlexGood

    AlexGood

    Регистрация:
    28 ноя 2016
    Сообщения:
    254
    Симпатии:
    7
    Появилась ошибка в консоли http://joxi.ru/ZrJyD88C9EbvdA , сразу не заметил. Можете подсказать что может быть?
     
  4. Dotrox

    Dotrox Команда форума

    Регистрация:
    27 ноя 2012
    Сообщения:
    3.198
    Симпатии:
    1.306
    Проблема в том, что icon = null.

    А что это за консоль, прямо в Сублиме?
     
    AlexGood нравится это.
  5. AlexGood

    AlexGood

    Регистрация:
    28 ноя 2016
    Сообщения:
    254
    Симпатии:
    7
    нет это в самом chrome консоль, я просто так экраны сдвинул чтобы продемонстрировать... а из-за чего так может быть? как можно решить проблему?
     
  6. Dotrox

    Dotrox Команда форума

    Регистрация:
    27 ноя 2012
    Сообщения:
    3.198
    Симпатии:
    1.306
    Из-за того, что код срабатывает раньше завершения инициализации DOM.
    Вариантов решения два: запускать код после инициализации DOM, либо слушать не на конкретном элементе, а на document (этот вариант ещё и при динамической структуре страницы спасёт от проблем).

    Код:
    $(document).ready(function(){
        //первый вариант
    });
    
    $(document).on('click', '#element', function(){
        //второй вариант
    });
    
     
    AlexGood нравится это.
  7. AlexGood

    AlexGood

    Регистрация:
    28 ноя 2016
    Сообщения:
    254
    Симпатии:
    7
    попробую повторить тогда ваш второй вариант, раз он получается более оптимальный
     
  8. AlexGood

    AlexGood

    Регистрация:
    28 ноя 2016
    Сообщения:
    254
    Симпатии:
    7
    Вопрос еще по меню. Так то вроде все работает как надо.
    На разрешении меньше 1199 тут: http://testbcard.bootstrap.dtraduga.vh55.hosterby.com/discount_for_the_card.php# вверху нажимаем на "Выбрать город"
    Меню стягивает с собой 2 элемента: http://joxi.ru/zANV8EEsBYN49A
    В закрытом варианте все выглядит так: http://joxi.ru/RmzkWppI0o71q2
    Верхний потому что ml-auto у этого блока, а стрелка наверх - position: fixed; с соответствующими отступами.
    Вопрос: можно ли как-то этого избежать? Возможно что-то применить можно к самому меню?

    забыл написать .... на десктопе все работает, нужно переключиться на мобильный вариант в хроме
    http://joxi.ru/bmoVpZZsxBwaQr
     
    Последнее редактирование: 2 май 2018
  9. Dotrox

    Dotrox Команда форума

    Регистрация:
    27 ноя 2012
    Сообщения:
    3.198
    Симпатии:
    1.306
    Я не понимаю о чём речь. Я не вижу, чтоб при появлении меню что-либо съезжало.

    А ещё непонятно, зачем у ссылки на личный кабинет (.ic1) абсолютное позиционирование и высота 100%, из-за которой ссылка выползает за пределы шапки (это видно, если подсветить блок через инструменты разработчика).
    Абсолютное позиционирование используется только в исключительных случаях, а в адаптивной вёрстке оно особенно противопоказано без крайней необходимости.
     
    AlexGood нравится это.
  10. AlexGood

    AlexGood

    Регистрация:
    28 ноя 2016
    Сообщения:
    254
    Симпатии:
    7
    При открытом меню как раз таки все хорошо, а когда оно закрывается 2 блока убегает вслед за ним: http://prntscr.com/jcozej - попробовал схематично показать
    --- Добавлено, 2 май 2018 ---
    Рассматривал вариант с помощью JS решить этот вопрос, т.е. блоку личный кабинет задал id="area", в скрипте создал переменную и обратился к ней по этому ID: area = document.getElementById('area');
    Хотел чтобы при скрытом меню area было сдвинуто на 100% в обратную сторону а при открытом аналогично в другую, но по итогу какая-то ерунда получилось. Блок или не реагирует или совсем пропадает.
    Код:
    var icon = document.getElementById('select_city_new'),
        active = false,
        nav = document.getElementById('navigation_new'),
        area = document.getElementById('area');
    
    
     icon.addEventListener("click",activeMenu);
    
    function activeMenu(){
        if(active){
            nav.style.left = "100%";
            active = false;
            area.style.left = "0";
    
        }else{
            nav.style.left = "0";
            active = true;
            area.style.left = "100%";
        }
    }
     
    Последнее редактирование: 2 май 2018
  11. Dotrox

    Dotrox Команда форума

    Регистрация:
    27 ноя 2012
    Сообщения:
    3.198
    Симпатии:
    1.306
    Как оказалось, проблема есть только в Хроме (ну, или точнее, её нет в Мозилле, где я смотрел изначально).

    Так нельзя делать! js вообще не должен учавствовать в вёрстке. То есть, с выключенным js сайт должен выглядеть точно так же, как и с включённым, разве что не реагировать на взаимодействие пользователя с элементами, которые обрабатываются через js.
    Ну и в результате получилось, что на блоке #area висит "right: 50%", из-за чего этот блок заезжает на меню шапки и возвращается назад только при появлении меню.

    Вообще, у вас там сейчас какая-то жуткая фигня с js. Выкиньте весь код, который влияет на вёрстку и тогда я смогу посмотреть, что не так, ибо сейчас там всё ездит туда-сюда из-за js.


    И ещё одно: не добавляйте через js стили прямо на блоки - используйте классы! То есть, пусть js при активации какого-то элемента вешает на него определённый класс, а при деактивации - снимает. А все стили уже будут в этом классе.
     
    AlexGood нравится это.
  12. AlexGood

    AlexGood

    Регистрация:
    28 ноя 2016
    Сообщения:
    254
    Симпатии:
    7
    Полностью весь JS отключил
     
  13. Dotrox

    Dotrox Команда форума

    Регистрация:
    27 ноя 2012
    Сообщения:
    3.198
    Симпатии:
    1.306
    Как я уже говорил, научитесь понимать структуру страницы!

    Быстрый фикс - это повесить на блок .city_select - overflow: hidden. А вообще, суть в том, что меню городов в закрытом виде растягивает страницу вправо.
    Я не могу понять, зачем вы мобильное меню городов вообще завернули в тело страницы. Я сначало было подумал, что вы пытались сделать общее меню для десктопной и мобильной версии, но нет, они разные. А если они разные, то мобильную версию вообще можно разместить отдельный блоком в body и оно не будет влиять на другие элементы!
     
    AlexGood нравится это.
  14. AlexGood

    AlexGood

    Регистрация:
    28 ноя 2016
    Сообщения:
    254
    Симпатии:
    7
    Как вариант попробовать можно. Посмотрим что получится :Smile:
    - походу надо html и сss перечитать :Smile: - найти какой-нибудь нормальный источник и нормально освежить память)))
     
  15. AlexGood

    AlexGood

    Регистрация:
    28 ноя 2016
    Сообщения:
    254
    Симпатии:
    7
    по тому же меню вопрос http://testbcard.bootstrap.dtraduga.vh55.hosterby.com/discount_for_the_card.php# : на разрешениях от 360 до 991 при на нажатии "выбрать город" - меню открывается нормально поверх сайта, а именно начиная с разрешения 992 и выше содержимое страницы улетает под открывающееся меню - никак не могу понять из-за чего, хотя вроде разницы никакой нет
     
  16. Dotrox

    Dotrox Команда форума

    Регистрация:
    27 ноя 2012
    Сообщения:
    3.198
    Симпатии:
    1.306
    Разница коллосальная! Изменение поведения на разной ширине указывает на медиа квери, а через них могут любые стили быть изменены как угодно.

    В вашем случае проблема здесь: http://testbcard.bootstrap.dtraduga.vh55.hosterby.com/assets/css/adaptive.css блок, который начинается с
    Код:
    @media all and (max-width: 991px){
    Из-за того, что какие-то из этих стилей перестают действовать на ширени больше 991px и происходит описанное поведение.
     
    AlexGood нравится это.
  17. AlexGood

    AlexGood

    Регистрация:
    28 ноя 2016
    Сообщения:
    254
    Симпатии:
    7
    Вы имели ввиду вынести допустим в самый верх страницы отдельным блоком и при нужном разрешении просто его включать или как? и тогда как сказали оно не будет влиять ни кое образом ни на что?
     
  18. Dotrox

    Dotrox Команда форума

    Регистрация:
    27 ноя 2012
    Сообщения:
    3.198
    Симпатии:
    1.306
    Суть не в том вверх или вниз, суть в том, что оно должно быть прямым потомком body. При этом оно всё так же может выезжать из-за края экрана.
     
  19. Nickbur

    Nickbur

    Регистрация:
    9 май 2018
    Сообщения:
    9
    Симпатии:
    6
    AlexGood нравится это.
  20. Dotrox

    Dotrox Команда форума

    Регистрация:
    27 ноя 2012
    Сообщения:
    3.198
    Симпатии:
    1.306
    А зачем там такие селекторы:
    Код:
    [id='ischezayka']
    ?

    Скобочный вариант обычно используется для выбора по атрибутам, для которых нет других возможностей обращения через CSS, а в случае id - это просто усложнение кода.