#javascript #css #анимация #css_animation
Хочу переделать менюшку, что бы она появлялась через расширение контента. То есть при нажатии на кнопку менюшка начинает расширяться и в результате открывается полностью. Ну и при повторном нажатии, сворачивалась. Расширение и сужение по вертикали. То есть через изменение высоты. При этом, если во время пока панель раскрывается кликнуть ещё раз, что бы она с этого места и начала обратно скрываться. И в другую сторону. function showHide() { var menu = document.getElementById("myMenu"); menu.classList.toggle("hide"); } .container { display: flex; flex-direction: column; background: pink; align-items: center; } #myMenu a { margin: 2px; padding: 1px; } .hide { display: none; }что-то там ещё
что-то там ещё
что-то там ещё
Ответы
Ответ 1
Если я Вас правильно понял, то что-то в этом роде(при анимации max-height лучше указывать какую-нибудь реальную цифру, если вы напишите max-height развернутому элементу слишком большой, то в момент разворота будет наблюдаться рывок) function showHide() { var menu = document.getElementById("myMenu"); menu.classList.toggle("hide"); } .container { display: flex; flex-direction: column; background: pink; align-items: center; } #myMenu { max-height: 0; overflow: hidden; transition: max-height 1.5s ease; } #myMenu a { margin: 2px; padding: 1px; } #myMenu.hide { max-height: 300px; } спрятать / показатьчто-то там ещё
что-то там ещё
что-то там ещё
Ответ 2
document.getElementById("myMenu").addEventListener('click', function() { document.getElementById("myMenu").classList.toggle("showMenu"); }) * { margin: 0; padding: 0; } html, body { width: 100%; height: 100%; background: #606060; } #wrap { position: relative; width: 200px; height: 350px; background: orange; } #myMenu { width: 100%; height: 50px; background: grey; position: absolute; top: calc(50% - 25px); transition: top .5s, height .5s; } #myMenu.showMenu { width: 100%; height: 100%; background: grey; position: absolute; top: 0; transition: top .5s, height .5s; }Вариант со списком пунктов const menu = document.getElementsByClassName("menu"); document.getElementsByTagName("span")[0].addEventListener('click', function() { document.getElementById("myMenu").classList.toggle("showMenu"); document.getElementsByTagName("span")[0].classList.toggle("spanActive"); for (var i = 0; i < menu.length; i++) { menu[i].classList.toggle("menuActive"); } }) * { margin: 0; padding: 0; } html, body { width: 100%; height: 100%; background: #606060; } #wrap { position: relative; width: 200px; height: 350px; background: orange; } #myMenu { overflow: hidden; width: 100%; height: 50px; background: grey; position: absolute; top: calc(50% - 25px); transition: top .5s, height .5s; } #myMenu.showMenu { width: 100%; height: 100%; background: grey; position: absolute; top: 0; transition: top .5s, height .5s; } span { cursor: pointer; display: block; color: white; background: black; height: 50px; font-size: 20px; text-align: center; line-height: 2.2; transition: background .5s, color .5s; } span.spanActive { cursor: pointer; display: block; color: black; background: white; height: 50px; font-size: 20px; text-align: center; line-height: 2.2; transition: background .5s, color .5s; } .menu { width: 100%; height: 30px; background: black; color: white; text-align: center; line-height: 2.2; margin-top: 3px; transform: translateX(-100%); transition: transform .2s; } .menu.menuActive { width: 100%; height: 30px; background: black; color: white; text-align: center; line-height: 2.2; margin-top: 3px; transform: translateX(0); transition: transform 1s; }myMenumyMenuОтвет 3
Решил задачу, на основе решения @slowBro . Основная идея эта transition max-height, для корректной работы сначала вычисляется реальный вертикальный размер блока, так как для transition нужно знать начальные и конечные значения. var menu = document.getElementById("myMenu"); function showHide() { menu.classList.toggle("show"); } function prepairMenuToShowHide() { /* показываем меню что бы вычислить его размер */ menu.style.display = "block"; menu.style.maxHeight = "5000px"; var height = menu.clientHeight; /* теперь прячем обратно */ menu.style.maxHeight = ""; menu.style.overflow = "hidden"; /* добавляем стиль с максимальной высотой, но не к элементу напрямую а в таблицу стилей */ var rule = document.createElement("style"); rule.innerHTML = `#myMenu.show { max-height: ${height}px;}`; document.head.appendChild(rule); /* добавляем класс транзиции к меню, если его сразу добавить работа будет не как ожидается*/ /* setTimeout это хак, без него работать будет некорректно */ setTimeout(`menu.classList.add("menuTransition")`, 0); } prepairMenuToShowHide(); .container { display: flex; flex-direction: column; background: pink; align-items: center; } #myMenu { display: none; max-height: 0; } .menuTransition { transition: max-height 0.5s ease; } #myMenu a { margin: 2px; padding: 1px; }что-то там ещё
что-то там ещё
что-то там ещё
Комментариев нет:
Отправить комментарий