Навигационное меню для лендинга с плавным скроллом и подсветкой пункта активной секции. Меню реализовано с использованием библиотеки jQuery.
HTML КОД:
<nav>
<ul>
<li><a href="#section-1">Секция 1</a></li>
<li><a href="#section-2">Секция 2</a></li>
<li><a href="#section-3">Секция 3</a></li>
<li><a href="#section-4">Секция 4</a></li>
<li><a href="#section-5">Секция 5</a></li>
</ul>
</nav>
<header>Шапка</header>
<section id="section-1">Секция 1</section>
<section id="section-2">Секция 2</section>
<section id="section-3">Секция 3</section>
<section>Секция без пункта меню</section>
<section id="section-4">Секция 4</section>
<section id="section-5">Секция 5</section>
<footer>Подвал</footer>
CSS КОД:
В данном примере предусмотрена возможность выделять не только пункт меню видимой секции, но и ее саму, используя класс section.active
nav {
height: 80px;
position: fixed;
top: 0;
left: 0;
background: #337AB7;
width: 100%;
font-family: Verdana, sans-serif;
}
nav ul {
margin: 0;
padding: 0;
list-style: none;
display: flex;
flex-wrap: wrap;
align-items: center;
justify-content: center;
height: 80px;
}
nav ul li {
margin: 0 10px;
}
nav ul li a {
color: #BFE2FF;
display: inline-flex;
font-size: 18px;
text-transform: uppercase;
text-decoration: none;
font-weight: bold;
transition: all 0.3s ease;
border-bottom: 2px solid transparent;
}
nav ul li a:hover {
color: #FFF;
}
nav ul li a.active {
border-bottom: 2px solid #FFF;
padding-bottom: 6px;
color: #FFF;
}
section,
header,
footer {
background: #fff;
border-bottom: 4px solid #337AB7;
height: 600px;
display: flex;
flex-flow: column;
align-items: center;
justify-content: center;
font-size: 40px;
text-transform: uppercase;
color: #337AB7;
font-weight: bold;
font-family: Verdana, sans-serif;
}
section:nth-child(even) {
background: #BFE2FF;
}
section:first-child {
margin-top: 60px;
}
section.active {
/* Стиль для активной секции */
}
header,
footer {
height: 400px;
background: #337AB7;
color: #FFF;
}
jQuery КОД:
180 в данном коде - это произвольное значение, позволяющее переключиться на нижнюю секцию немного раньше, чем она дойдет до фиксированного меню.
let sections = $('section'),
nav = $('nav'),
nav_height = nav.outerHeight();
$(window).on('scroll', function () {
$('nav a').removeClass('active');
let cur_pos = $(this).scrollTop();
sections.each(function() {
let top = $(this).offset().top - nav_height - 180,
bottom = top + $(this).outerHeight();
if (cur_pos >= top && cur_pos <= bottom) {
nav.find('a').removeClass('active');
sections.removeClass('active');
$(this).addClass('active');
nav.find('a[href="#'+$(this).attr('id')+'"]').addClass('active');
}
});
});
nav.find('a').on('click', function () {
let $el = $(this),
id = $el.attr('href');
$('html, body').animate({
scrollTop: $(id).offset().top - nav_height
}, 600);
return false;
});
0 Комментарии