@silencer-spirit

Как скрывать меню в иконку при добавлении новых пунктов меню?

Подскажите, как можно с помощью JS/jQuery отслеживать navbar и если добавляются новые пункты в меню и оно не помещается в блок (переносится на другую строчку) скрывать это меню в бургер (или другую иконку).
  • Вопрос задан
  • 252 просмотра
Решения вопроса 1
ExcluZZ
@ExcluZZ
adm metrsaratova.ru
На этот вопрос возможно никто не даст ответа, потому что это просто надо сесть и написать за вас весь скрипт. Т.к. судя по самому вопросу вас детали не интересуют, вам нужно готовое решение какое-то.
1) если нужно готовое решение - надо гуглить
2) если вы действительно хотите написать скрипт действуете примерно так:
- узнаем ширину родительского контейнера меню
- узнаем ширину каждого пункта
- потом начинаем перебирать пункты и плюсовать, не забываем что под ваш "бургер", тоже надо место
- после определенного пункта всем остальным ставим display:none и вешаем "бургер"
- на бургер вешаем событие клика, на событие клика функцию которая будет сворачивать разворачивать ваши пункты
на все про все займет полчаса отсилы(вместе с ковырянием в доках) если вы более менее соображаете в JS/jQuery

но если вы сами не хотите писать, в интернете вариантов миллион, и тостер вообще тогда вам не нужен
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Ingvar_ko
Написал свое решение, но получилось много кода. Пошел за ответами в интернет и наткнулся на этот вопрос.
Оставлю код здесь, возможно это не худшее решение.
flexMenu('.navigation nav', {
        el: '.nav_item',
        quantity: 2,
        burger: '.burger .burger_menu',
        brackpoints: {
            1350: {
                quantity: 1
            },
            1200: {
                quantity: 0
            }
        }
    })

    function flexMenu(carrentTarget, option) {
        let brackpoints = option.brackpoints
        brackpoints['9999'] = { quantity: option.quantity }//брекпоинт поумолчанию
        let brackpoint_keys = []
        for (const key in brackpoints) {
            if (Object.hasOwnProperty.call(brackpoints, key)) {
                brackpoint_keys.push(key)
            }
        }
        brackpoint_keys.reverse()//По правилам заполнение брекпоинтов идет от большего к меньшему(так нагляднее), а в коде нужно наоборот


        let currentWidth = 0
        let oldValue = 0
        let win_width = window.innerWidth
        let quantity = 0
        render()//Вызов при загрузке страницы
        window.onresize = (e) => {
            win_width = e.target.innerWidth
            render()//Вызов при изменении ширины экрана - нужно для мобильных устройств так как они имеют поворот экрана 
        }
        function render() {
            for (const k of brackpoint_keys) {
                if (win_width <= k) {
                    currentWidth = k
                }
            }
            if (currentWidth && currentWidth != oldValue) {
                for (const key in brackpoints) {
                    if (Object.hasOwnProperty.call(brackpoints, key)) {
                        if (key == currentWidth) {
                            quantity = brackpoints[key].quantity;
                        }
                    }
                }

                let menu_items = _GET_MENU_ITEMS_()
                for (let i = 0; i < menu_items.length; i++) {
                    if (i < quantity) {
                        document.querySelector(`${carrentTarget}`).innerHTML += menu_items[i]
                    } else {
                        document.querySelector(`${option.burger}`).innerHTML += menu_items[i]
                    }
                }
                oldValue = currentWidth
            }
        }


        function _GET_MENU_ITEMS_() {//Забирает пункты из контейнера меню и из бургер-меню
            let menu_length = document.querySelectorAll(`${carrentTarget} ${option.el}`).length
            let burger_length = document.querySelectorAll(`${option.burger} ${option.el}`).length
            let html_menu_items = []
            for (let i = 1; i < menu_length + 1; i++) {
                html_menu_items.push(document.querySelector(`${carrentTarget} ${option.el}:nth-child(${i})`).outerHTML)
            }
            for (let i = 1; i < burger_length + 1; i++) {
                html_menu_items.push(document.querySelector(`${option.burger} ${option.el}:nth-child(${i})`).outerHTML)
            }
            document.querySelector(`${carrentTarget}`).innerHTML = ''
            document.querySelector(`${option.burger}`).innerHTML = ''
            return html_menu_items
        }


    }
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы