Сделать прилипающее меню к тулбару
У меня есть сайт, с шапкой в самом верху. Шапка прокручивается, под ней есть тулбар, который прилипает к верху окна. Так и должно быть. В тулбаре есть кнопка, которая выдвигает менюшку сбоку. Менюшка находится под тулбаром и должна прилипать к тулбару.
Несложными манипуляциями поставил margin-top, равный высоте тулбара, и слава тебе господи. Но это при прокрутке. А вот если пролистать страницу в самый верх, то получится, что менюшка наезжает на шапку, потом тулбар, потом оставшаяся часть меню. А мне надо, чтобы именно меню было сцеплено с тулбаром, да притом еще и прокручивалось, ибо длина превосходит размеры экрана.
@font-face {
font-family: 'Century Gothic';
font-weight: normal;
font-style: normal;
src: url('https://kristy98755.github.io/startpage/CenturyGothic.woff')format('woff');
}
@font-face {
font-family: 'Century Gothic';
font-weight: bold;
font-style: normal;
src: url('https://kristy98755.github.io/startpage/CenturyGothic-Bold.woff')format('woff');
}
@font-face {
font-family: 'Century Gothic';
font-weight: bold;
font-style: italic;
src: url('https://kristy98755.github.io/startpage/CenturyGothic-BoldItalic.woff')format('woff');
}
@font-face {
font-family: 'Century Gothic';
font-weight: normal;
font-style: italic;
src: url('https://kristy98755.github.io/startpage/CenturyGothic-Italic.woff')format('woff');
}
@font-face {
font-family: 'Palatino Linotype';
font-weight: normal;
font-style: normal;
src: url('https://kristy98755.github.io/startpage/PalatinoLinotype.woff')format('woff');
}
@font-face {
font-family: 'Palatino Linotype';
font-weight: bold;
font-style: normal;
src: url('https://kristy98755.github.io/startpage/PalatinoLinotypeBold.woff')format('woff');
}
a {
text-decoration: none;
color: #000;
}
body {
margin: 0;
font-family: 'Century Gothic';
}
iframe {
width: 100vw;
height: 90vh;
}
.zagolovok {
justify-content: center;
align-items: center;
padding-top: 20px;
padding-bottom: 20px;
text-align: center;
width: 100%;
background: url('https://kristy98755.github.io/startpage/repeatable.png');
height: auto;
white-space: nowrap;
position: relative;
background-repeat: repeat;
font-family: 'Palatino Linotype';
font-size: calc(2vw + 2vh + 5vmax);
font-weight: bold;
vertical-align: middle;
text-shadow: -2px -2px 0 #DDD, 2px -2px 0 #DDD, -2px 2px 0 #DDD, 2px 2px 0 #DDD;
overflow: hidden;
}
/* Стили для тулбара */
.toolbar {
position: sticky;
border-top: 2px solid black;
border-bottom: 1px solid black;
display: flex;
justify-content: space-between;
/* Добавлено для размещения элементов */
align-items: center;
/* Центрирование по вертикали */
text-align: center;
top: 0;
z-index: 10;
width: 100%;
background-color: #a7a71d;
padding: 3px;
box-sizing: border-box;
font-size: calc(3vw + 2vh + 1.2vmin);
}
.burger {
left: 0;
margin-left: 10px;
/* Отступ от левого края */
cursor: pointer;
width: 60px;
height: 50px;
background: transparent;
border: none;
position: relative;
z-index: 99;
}
.burger::before,
.burger::after {
content: '';
position: absolute;
display: block;
width: 100%;
height: 6px;
background: #000;
border-radius: 10px;
}
.burger::before {
top: 0;
box-shadow: 0 22px 0 #000;
transition: box-shadow .3s .15s, top .3s .15s, transform .3s;
}
.burger::after {
bottom: 0;
transition: bottom .3s .15s, transform .3s;
}
.burger.active::before {
top: 22px;
transform: rotate(45deg);
box-shadow: 0 6px 0 rgba(0, 0, 0, 0);
transition: box-shadow .15s, top .3s, transform .3s .15s;
}
.burger.active::after {
bottom: 22px;
transform: rotate(-45deg);
transition: bottom .3s, transform .3s .15s;
}
.hidden-items {
position: sticky;
/* Меню прилипает к верху окна при прокрутке */
top: 0;
margin-top: calc(3vw + 2vh + 1.2vmin + 22px);
/* Меню будет размещаться под тулбаром */
max-height: calc(100vh - (3vw + 2vh + 1.2vmin + 22px));
/* Ограничение по высоте до высоты окна */
overflow-y: auto;
/* Вертикальная прокрутка при переполнении */
left: 0;
position: fixed;
transform: translateX(-100%);
/* Перемещаем элемент за пределы экрана */
transition: transform 0.5s ease, opacity 0.5s ease;
/* Переходы для перемещения и прозрачности */
width: 100%;
font-size: calc(2vw + 2vh + 1vmin);
background: #d0d048;
text-decoration: none;
z-index: 8;
/* Чтобы элемент находился поверх других элементов */
}
.hidden-items.active {
transform: translateX(0);
/* Перемещаем элемент в видимую область */
}
.plitka {
color: black;
text-align: left;
font-size: calc(2vw + 2vh + 1vmin);
display: flex;
box-sizing: border-box;
cursor: pointer;
padding: 20px;
padding-left: 50px;
position: relative;
border-bottom: 2px solid black;
text-decoration: none;
}
.plitka-very-first {
color: black;
text-align: left;
font-size: calc(2vw + 2vh + 1vmin);
display: flex;
box-sizing: border-box;
cursor: pointer;
padding: 20px;
padding-left: 50px;
position: relative;
border-bottom: 2px solid black;
text-decoration: none;
margin-top: 70px;
}
.catalog {
/* Это просто триггер для нажатия */
}
.arrow {
position: relative;
cursor: pointer;
margin: auto 20px;
width: 66px;
height: 30px;
}
.arrow-left {
position: absolute;
background-color: transparent;
top: 10px;
left: 0;
width: 40px;
height: 10px;
display: block;
transform: rotate(35deg);
float: right;
border-radius: 2px;
}
.arrow-left:after {
content: "";
background-color: black;
width: 40px;
height: 10px;
display: block;
float: right;
border-radius: 6px 10px 10px 6px;
transition: all 0.5s cubic-bezier(0.25, 1.7, 0.35, 0.8);
z-index: -1;
}
.arrow-right {
position: absolute;
background-color: transparent;
top: 10px;
left: 26px;
width: 40px;
height: 10px;
display: block;
transform: rotate(-35deg);
float: right;
border-radius: 2px;
}
.arrow-right:after {
content: "";
background-color: black;
width: 40px;
height: 10px;
display: block;
float: right;
border-radius: 10px 6px 6px 10px;
transition: all 0.5s cubic-bezier(0.25, 1.7, 0.35, 0.8);
z-index: -1;
}
.open .arrow-left:after {
transform-origin: center center;
transform: rotate(-70deg);
}
.open .arrow-right:after {
transform-origin: center center;
transform: rotate(70deg);
}
.submenu1 {
display: flex;
transition: 0.5s ease-out;
max-height: 0;
flex-direction: column;
width: 100%;
position: relative;
background-color: #a7a71d;
z-index: 12;
border-bottom: 0;
max-height: 0;
overflow: hidden;
}
.submenu1.visible {
display: flex;
transition: 0.5s ease-out;
max-height: calc((2vw + 2vh + 1vmin + 40px + 3px) * 30);
flex-direction: column;
width: 100%;
position: relative;
background-color: #a7a71d;
z-index: 12;
border-bottom: 1px solid black;
}
.greencard {
width: 85vw;
cursor: pointer;
border-radius: 25px;
border: 3px ridge #AAA;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
transition: transform 0.2s;
overflow: hidden;
background-color: #fff;
margin: 20px auto;
}
.image-container {
position: relative;
}
.greencard img {
width: 100%;
display: block;
}
.greencard .info {
position: absolute;
bottom: 0;
left: 0;
right: 0;
height: 15%;
background: rgba(0, 0, 0, 0.7);
color: #fff;
transform: translateY(100%);
transition: transform 0.3s ease-in-out;
z-index: 1;
text-align: center;
font-size: calc(1vw + 1.5vh + 1vmin);
display: flex;
justify-content: center;
align-items: center;
}
.image-container:hover .info {
transform: translateY(0);
}
.greencard .caption {
text-align: center;
padding: 10px 0;
background: #d0d048;
font-size: calc(1vw + 1vh + 1vmin);
position: relative;
z-index: 2;
margin-bottom: 0;
}
.greencard:hover {
transform: scale(1.05);
}
.cards-grid {
display: flex;
flex-wrap: wrap;
justify-content: space-around;
}
.margins {
margin: 10px;
}
<div class="toolbar" align="center">
<button class="burger"></button>
<script>
document.addEventListener('DOMContentLoaded', () => {
const burger = document.querySelector('.burger');
const hiddenItems = document.querySelector('.hidden-items');
burger.addEventListener('click', () => {
burger.classList.toggle('active');
if (hiddenItems) { // Проверка на наличие элемента
hiddenItems.classList.toggle('active');
} else {
console.warn('Элемент с классом .hidden-items не найден');
}
});
});
</script>
<font style="display:block; position=absolute; margin-left:auto;margin-right:auto;">
ДВЕРИ</font>
<font style="width:70px;height:50px;"> </font>
</div>
<div class="hidden-items">
<div class="plitka"><a href="https://kristy98755.github.io/m.startpage">ГЛАВНАЯ</a></div>
<div class="plitka"><a href="#">ПОИСК</a></div>
<div class="plitka catalog active">
КАТАЛОГ
<div class="arrow">
<span class="arrow-left"></span>
<span class="arrow-right"></span>
</div>
<script>
document.addEventListener("DOMContentLoaded", function() {
document.querySelectorAll(".catalog").forEach(function(element) {
element.addEventListener("click", function() {
// Тогглируем класс "open" на стрелке
const arrow = this.querySelector(".arrow");
if (arrow) {
arrow.classList.toggle("open");
}
// Тогглируем видимость подменю
const subMenu = this.nextElementSibling; // Подразумевается, что .submenu1 идет сразу после .catalog
if (subMenu) {
subMenu.classList.toggle("visible");
}
});
});
});
</script>
</div>
<div class="submenu1">
<div class="plitka active"><a href="kristy98755.github.io/m.doors/index.html">Двери</a></div>
<div class="plitka"><a href="frames.html">Рамы</a></div>
<div class="plitka"><a href="staircase.html">Лестницы</a></div>
<div class="plitka"><a href="tables.html">Столы</a></div>
<div class="plitka"><a href="lavochki.html">Лавки</a></div>
<div class="plitka"><a href="chairs.html">Стулья</a></div>
<div class="plitka catalog">Погонаж
<div class="arrow">
<span class="arrow-left"></span>
<span class="arrow-right"></span>
</div>
</div>
<div class="submenu1" style="background-color: #777700">
<div class="plitka" style="border-top:1px solid black;"><a href="blockhouse.html">Блок-хаус</a></div>
<div class="plitka"><a href="lining.html">Вагонка</a></div>
<div class="plitka"><a href="floorboard.html">Половая доска</a></div>
<div class="plitka"><a href="baseboard.html">Плинтус</a></div>
<div class="plitka"><a href="doorjamb.html">Наличник</a></div>
<div class="plitka"><a href="imitation-timber.html">Имитация бруса</a></div>
<div class="plitka"><a href="planken.html">Планкен</a></div>
<div class="plitka"><a href="shields-40-mm.html">Щиты 40 мм</a></div>
</div>
<div class="plitka catalog">Для бань и саун
<div class="arrow">
<span class="arrow-left"></span>
<span class="arrow-right"></span>
</div>
</div>
<div class="submenu1" style="background-color: #777700">
<div class="plitka" style="border-top:1px solid black;"><a href="ladles.html">Ковши</a></div>
<div class="plitka"><a href="traps.html">Трапы</a></div>
<div class="plitka"><a href="lamps.html">Светильники</a></div>
<div class="plitka"><a href="deckchairs.html">Шезлонги</a></div>
<div class="plitka"><a href="salt.html">Гималайская соль<a></div>
<div class="plitka"><a href="headrests.html">Подголовники</a></div>
<div class="plitka"><a href="mugs.html">Кружки</a></div>
<div class="plitka"><a href="dousing-buckets.html">Вёдра-обливайки</a></div>
</div>
</div>
<div class="plitka"><a href="address.html">АДРЕС</a></div>
<div class="plitka"><a href="contacts.html">КОНТАКТЫ</a></div>
</div>
Превью есть на kristy98755.github.io/m.doors , смотреть только в мобильной версии, на пк код другой (переадресация)
Ответы (1 шт):
Зачем вам margin-top
и position: fixed
? Для размещения элемента с position: sticky
, когда его родителя начинают прокручивать, есть свойство top
:
.hidden-items {
position: sticky;
/* Меню прилипает к верху окна при прокрутке */
top: calc(3vw + 2vh + 1.2vmin + 22px);
/* Весь остальной код без изменений, но без position: fixed и margin-top */
}