JSFiddle - React, Tailwind, and code Playground
by zav19791979
HTML
<script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
<div id="s1">
Секция 1
<a href="#s2">Вниз</a>
</div>
<div id="s2">
Секция 2
<a href="#s1">Вверх</a>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Beatae, minima, quae. Nemo iste eveniet necessitatibus quas deleniti. Et deleniti nemo hic delectus minus quia, incidunt laudantium consequuntur, harum dolorem reiciendis.</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Beatae, minima, quae. Nemo iste eveniet necessitatibus quas deleniti. Et deleniti nemo hic delectus minus quia, incidunt laudantium consequuntur, harum dolorem reiciendis.</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Beatae, minima, quae. Nemo iste eveniet necessitatibus quas deleniti. Et deleniti nemo hic delectus minus quia, incidunt laudantium consequuntur, harum dolorem reiciendis.</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Beatae, minima, quae. Nemo iste eveniet necessitatibus quas deleniti. Et deleniti nemo hic delectus minus quia, incidunt laudantium consequuntur, harum dolorem reiciendis.</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Beatae, minima, quae. Nemo iste eveniet necessitatibus quas deleniti. Et deleniti nemo hic delectus minus quia, incidunt laudantium consequuntur, harum dolorem reiciendis.</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Beatae, minima, quae. Nemo iste eveniet necessitatibus quas deleniti. Et deleniti nemo hic delectus minus quia, incidunt laudantium consequuntur, harum dolorem reiciendis.</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Beatae, minima, quae. Nemo iste eveniet necessitatibus quas deleniti. Et deleniti nemo hic delectus minus quia, incidunt laudantium consequuntur, harum dolorem reiciendis.</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Beatae, minima, quae. Nemo iste...
CSS
body {
margin: 0;
padding: 0;
}
div {
width: 100%;
height: 300px;
padding-top: 10px;
padding-left: 20px;
box-sizing: border-box;
color: #ffffff;
}
#s1 {
background-color: #ff8080;
}
a {
display: block;
margin-top: 50px;
}
#s1 {
min-height: 100vh;
}
body {
background-color: #eee;
}
p {
color: #000;
}
JavaScript
var currentAnchor = 0;
var isAnimating = false;
function scrollUpDown(dir) {
var sections = $('#s1, #s2');
var currentScroll = $(document).scrollTop();
var nearestEl = null;
var defaultTop = 0;
sections.each(function(i, el) {
var el = $(el);
if (dir == 'down') {
if (currentScroll < el.offset().top) {
if (nearestEl != null && nearestEl.offset().top > el.offset().top) {
nearestEl = el;
} else if (nearestEl == null) {
nearestEl = el;
}
}
defaultTop = $(document).outerHeight(true);
}
if (dir == 'up') {
if (currentScroll > el.offset().top) {
if (nearestEl != null && nearestEl.offset().top < el.offset().top) {
nearestEl = el;
} else if (nearestEl == null) {
nearestEl = el;
}
}
var defaultTop = 0;
}
});
if (nearestEl != null) {
return(nearestEl.offset().top);
} else {
return(defaultTop);
}
}
$(function(){
$('body').on('mousewheel', function(e){
e.preventDefault();
e.stopPropagation();
if( isAnimating ) {
return false;
}
isAnimating = true;
currentAnchor = null; // сбрасываем метку перехода
if( e.originalEvent.wheelDelta >= 0) {
currentAnchor = scrollUpDown('up');
console.log('вверх');
} else {
var firstSectionHeight = $('#s1').outerHeight(); // высота первого блока
var documentScroll = $(document).scrollTop(); // общий скролл
if(documentScroll < firstSectionHeight) { // если мы еще не промотали первый блок, включаем нашу прокрутку
currentAnchor = scrollUpDown('down');
console.log('вниз')
}
}
if (currentAnchor) { // если прокрутка была не нужна, метки перехода нет и переход не производим
isAnimating = true;
$('html, body').animate({
scrollTop: currentAnchor
}, 500, 'swing', function() {
isAnimating = false;
});
} else {
isAnimating = false;
}
});
});