Создание меню для гамбургеров в виде сетки (без javascript)

#html #css #grid #responsive #hamburger-menu

#HTML #css #сетка #адаптивный #гамбургер-меню

Вопрос:

Прежде всего, я француз, поэтому извините, если я допускаю некоторые ошибки при объяснении моей проблемы, поскольку мой английский не идеален. Я также веб-дизайнер, а не чистый разработчик, вот почему я прошу здесь о помощи (и потому, что я не нашел идеального ответа на свою проблему в Интернете).).

Мне нужно создать меню для гамбургеров для мобильных / планшетных устройств, используя макет сетки.

Как бы я хотел, чтобы оно выглядело при нажатии
https://i.stack.imgur.com/Xh5sV.png

Я бы хотел, чтобы меню выглядело так, как при нажатии (на основе устройства шириной 320 пикселей). Если не нажимать, #menu-ul скрывается (-767 пикселей), и вместо этого вы можете видеть содержимое страницы.

Мой код на данный момент выглядит следующим образом :

 body {
display: grid; 
}

#back-top {
position: fixed;
bottom: 40px;
right: 14px;
z-index: 9995;
width: 35px; 
height: 35px;
text-align: center;
font-size: 45px;
font-family: 'Agency FB', arial;
line-height: 32px;
background: #22cfb5;
color: #fff;
cursor: pointer;
border-radius: 50%;
transform: rotate(-90deg);
-o-transition:background-color .5s;
-ms-transition:background-color .5s;
-moz-transition:background-color .5s;
-webkit-transition:background-color .5s;
 transition:background-color .5s;
text-decoration: none;
}

#back-top:hover {
background: #4c4bbf;
}

header {
position: sticky;
top: 0;
z-index: 9999;
}

#navcontainer {
background-color: #4c4bbf;
}

.menu span {
display: block;
width: 19px;
height: 2px;
margin-bottom: 3px;
position: relative;
background: #ffffff; 
z-index: 1;
transform-origin: 4px 0px;
transition: transform 0.5s 
cubic-bezier(0.77, 0.2, 0.05, 1.0), background 0.5s 
cubic-bezier(0.77, 0.2, 0.05, 1.0), opacity 0.55s ease;
transition-property: transform, background, opacity;
transition-duration: 0.5s, 0.5s, 0.55s;
transition-timing-function:
cubic-bezier(0.77, 0.2, 0.05, 1),
cubic-bezier(0.77, 0.2, 0.05, 1),
ease;
transition-delay: 0s, 0s, 0s;
}

.menu input {
display: block;
width: 19px;
height: 13px; 
position: absolute;
cursor: pointer;
opacity: 0;
z-index: 2;
}

.menu input:checked~span {
opacity: 1;
transform: rotate(-45deg) translate(-2px, -1px);
}

.menu input:checked~span:nth-last-child(3) {
opacity: 0;
transform: rotate(0deg) scale(0.2, 0.2);
}

.menu input:checked~span:nth-last-child(2) {
transform: rotate(45deg) translate(-2px, -1px);
}

@media (max-width: 767px) {
body {
  grid-template-columns: repeat(6, 1fr);
  grid-template-rows: 4.375rem 60.625rem 33.75rem 102.6875rem 103.75rem 
  74.375rem 11.1875rem;
  gap: 0px 20px;
}

header {
  grid-column: 1 / span 6;
  grid-row: 1 / span 1; 
} 

#navcontainer {
  display: grid;
  grid-template-columns: repeat(6, 1fr);
  grid-template-rows: 4.375rem;
  column-gap: 10px;
  place-items: center;
}

.logo {
  grid-column: 1 / span 5; 
}

.menu {
  grid-column: 6 / span 1;
}

#menu-ul {
  background: linear-gradient(-30deg,#6633ff,#6666ff);
  z-index: 9998;
  grid-column: 1 / span 6; 
  grid-row: 1 / span 7;
  position: absolute;
  width: 100%;
  left: -767px;
  display: grid;
  grid-template-columns: repeat(6, 1fr);
  grid-template-rows: 4.375rem 60.625rem 33.75rem 102.6875rem 103.75rem 74.375rem 11.1875rem;
  gap: 0px 20px;
  transition: transform .3s ease-in-out;
}

ul {
  grid-column: 2 / span 4;
  grid-row: 1 / span 3;
  list-style-type: none;
  -webkit-font-smoothing: antialiased;
  display: grid;
  grid-template-columns: repeat(6, 1fr);
  grid-template-rows: 4.375rem 4.375rem 4.375rem 4.375rem 4.375rem 4.375rem 
  4.375rem;
  place-items: center;
}

.menu input:checked~#menu-ul {
  transform: translateX(767px);
}

.a-menu1 {
  grid-column: 2 / span 4;
  grid-row: 1 / span 3;
}

.a-menu2 {
  grid-column: 2 / span 4;
  grid-row: 2 / span 3;
}

.a-menu3 {
  grid-column: 2 / span 4;
  grid-row: 3 / span 3;
}

.a-menu4 {
  grid-column: 2 / span 4;
  grid-row: 4 / span 3;
}

#linkedin-menu {
  height: 28px;
  width: 28px;
  grid-column: 1 / span 3;
  grid-row: 6  / span 2;
}

#insta-menu {
  height: 28px;
  width: 28px;
  grid-column: 4 / span 3;
  grid-row: 6  / span 2;
}
}  
 <body>
<a href="#" id="back-top" title="Back top">></a>
<header>
    <nav role="navigation" id="navcontainer">
        <div class="logo">
            <img src="../logo_249.png">
        </div>
        <div class="menu">
            <input type="checkbox"/>
            <span></span>
            <span></span>
            <span></span>
        </div>
    </nav>
</header>

<div id="menu-ul">
    <ul>
        <a class="a-menu1" href="#bienvenue"><li>À propos</li></a>
        <a class="a-menu2" href="#services"><li>Mes services</li></a>
        <a class="a-menu3" href="#projets"><li>Mes projets</li></a>
        <a class="a-menu4" href="#contact"><li>Contact</li></a>
        <img src="img/linkedin-white.png" id="linkedin-menu">
        <img src="img/insta-white.png" id="insta-menu">
    </ul>
</div> 
<!--   all the remaining content of the page, hidden by the menu ul list when clicked -->
</body>  

Имея этот код, у меня много проблем: прежде всего, мне практически не удается переключать #menu-ul при нажатии на мой флажок / меню для бургеров.

Во второй раз я уже пытался поместить весь свой #menu-ul в .menu, и оттуда переключение работает, но у меня странные результаты (#menu-ul, появляющийся над частью навигации / заголовка, и из-за этого интервал, превращающийся в крест, становится нарушенным).

Наконец, я также хотел бы, чтобы перекрестный щелчок по меню моих анкоров (за исключением Instagram / LinkedIn, который будет target: _blank) заставил мой #menu-ul вернуться в скрытое / выключенное положение.canva.

Может ли кто-нибудь помочь мне с этим, более того, объясните мне, чтобы у меня больше не возникало трудностей в будущем? Спасибо, и если вам нужна дополнительная информация, я могу предоставить вам это 🙂

Комментарии:

1. Вот решение, созданное animadio framework только на css: codepen.io/animadio/pen/rRvxRe

2. Привет, я быстро проверю, поможет ли это мне создать то, что мне нужно, и свяжусь с вами, чтобы сообщить, помогло ли это мне или все еще нужна помощь после, спасибо 🙂

3. Мне наконец удалось (почти) получить желаемые результаты, добавив в уравнение немного JS.

Ответ №1:

Вам нужен такой вывод?Если да, то дайте мне знать, я правильно обработаю ваш код.

Комментарии:

1. Привет, мне нужно такое поведение в меню: меню, когда не нажимается -> i.stack.imgur.com/9Rh9X.png / при нажатии —> i.stack.imgur.com/Xh5sV.png . Я думаю, что это как-то связано с тем, что мой #menu-ul не находится в том же div, что и ввод, который его переключает. В принципе, мне нужно, чтобы мои материалы находились под макетом сетки, навигатор находился в фиксированном положении, а #menu-ul занимал 100% высоты, чтобы закрывать страницу при нажатии на меню 🙂

2. Большое спасибо, не могу дождаться, чтобы увидеть ваше решение, если у вас есть какие-то ключи для меня, чтобы понять, как сделать это самостоятельно в будущем, это было бы очень любезно с вашей стороны 🙂

3. Привет, с тех пор я все еще ищу помощи, у вас было время взглянуть на мой код и объяснить мне, в чем проблема? 🙂