@boga-net

Как избавиться от резкого скачка контента, при фиксировании меню при скролле?

Всем привет. Меню при скролле выезжает сверху и фиксируется. Я осуществляю это добавлением менюшке класса, у которого задаются position: fixed. Но из-за того, что меню выходит из общего потока, на его месте образуется пустота (высотой в это меню) и таким образом весь последующий контент резко подскакивает вверх, заполняя пустое пространство общего потока. Как грамотно от этого избавиться ?

https://codepen.io/Span4ev/pen/jKoNqw - немного поскроллить

Конечно, можно продублировать меню и показывать второе при скролле, но этот вариант мне не нравится, т.к. при изменении меню, надо будет менять сразу два.
Ну и совсем по-простому - сделать какой-то элемент, высотой в меню и шириной 100% и во время скролла "показывать" пустой элемент, чтобы он заполнил пустое пространство, а когда не нужно - скрывать ? Или же нужно что-то изменить в стилях и скрипте ?
Сделать плавность поднятия основного контента невозможно, потому что тут нечего анимировать

А вообще, какой подход является приемлемым и встречающимся на практике ? Пустой элемент ?

И вопрос к профи: Для мобильного меню вы переделывается общие стили или тоже дублируете основное меню, и прописываете стили отдельно для мобильных экранов ?

И нормально ли, ради красоты делать 3 меню: основное, мобильное и показывающееся при скролле ? Насколько это тупо и непрофессионально ? И тот же вопрос про 2 меню: мобильное и основное

.fixed-menu-start
			width: 100%
			position: fixed
			top: -200px
			left: 0
			background: $white
			z-index: 100
			box-shadow: 0 3px 10px rgba($darkGray, .1)
			transition: top $trans

			&.fixed-menu-end
				top: 0


// Меню
		$(window).on('scroll', function() {

			let scr = $(this).scrollTop();

			if (scr >= 200) {
				$('.header-menu-bg').addClass('fixed-menu-start');
			}
			if (scr < 200) {
				$('.header-menu-bg').removeClass('fixed-menu-start');
			}

			if (scr >= 300) {
				$('.header-menu-bg').addClass('fixed-menu-end');
			}
			if (scr < 300) {
				$('.header-menu-bg').removeClass('fixed-menu-end');
			}

		});


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

Спасибо
  • Вопрос задан
  • 1008 просмотров
Решения вопроса 3
LenovoId
@LenovoId
svg, css,js
если добавить для body в тот момент когда меню фиксируется отступ равный высоте меню - тогда скачка не будет ...
и кстати я не увидел скачка в 4х браузерах
Ответ написан
ya-vitaliy
@ya-vitaliy
Верстаю... + wordpress и пробую Laravel
Я больше склоняюсь к варианту добавления padding-top к body (о котором уже сказал Максим Ленский), но как вариант можете сделать clone() и уже фиксировать его, а потом удалять. Это больше подойдет в том случаи если вам нужно не только зафиксировать, но как-то интересно показать или показать в несколько другом виде.
Ответ написан
sadieff
@sadieff
Нажимаю клавиши в нужной последовательности
Я делаю так:
<div class="menu-wrap">
    <div class="menu">
    <div>
</div>

Само меню menu делаешь фиксированным, а обертке menu-wrap задаешь высоту.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы