плавный скролл при нажатии на кнопки клавиатуры(вниз, вверх)
Добрый вечер, подскажите, а реально ли при нажатии на клаватуре кнопок вверх вниз, можно было попасть на нужный раздел страницы. Например, разделы:
1) О нас; 2) Наши практика; 3) Контакты; При нажатии на кнопку(стрелку) вниз плавно попадаем на раздел "Наши контакты" и т.д.
<body>
<div class="main">
<div class="about" style="height: 500px;">One</div>
<div class="practise" style="height: 400px;">Two</div>
<div class="contacts" style="height: 600px;">Three</div>
</div>
</body>
Заранее спасибо. |
Цитата:
|
я представлял это так(например для кнопки вниз):
сделать функцию с анимацией и скролом:
function animation(duration) {
var temp;
return function (sel) {
cancelAnimationFrame(temp);
var start = performance.now();
var from = window.pageYOffset || document.documentElement.scrollTop,
to = document.querySelector(sel).getBoundingClientRect().top;
requestAnimationFrame(function step(timestamp) {
var progress = (timestamp - start) / duration;
1 <= progress && (progress = 1);
window.scrollTo(0, from + to * progress | 0);
1 > progress && (temp = requestAnimationFrame(step))
})
}
}
var scrollPage = animation(500); после чего функцию
document.onkeydown = function (event) {
var event = event || window.event;
if (event.keyCode == 70 || event.keyCode == 70 || event.which == 70) {
//scrollPage(элемент к которому нужен прокрут)
}
};
но нет |
скролл по блокам с помощью стрелок ↑ ↓
JohnJohn,
кликнуть по примеру и нажать стрелку вниз или вверх.
<!DOCTYPE HTML>
<html>
<head>
<title>Untitled</title>
<meta charset="utf-8">
<style type="text/css">
*{
margin: 0;
padding: 0;
}
div{width:100%}
#d1{background:#00F;height:700px;border:1px solid}
#d2{background:#FF0;height:500px;border:1px solid}
#d3{background:#F0F;height:300px;border:1px solid}
#d4{background:#F00;height:600px;border:1px solid}
</style>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<script>
$(function() {
var b = $("div").get();
$(document).keyup(function(c) {
if (40 == c.keyCode || 38 == c.keyCode) {
b.sort(function(a, b) {
return Math.abs(a.getBoundingClientRect().top) - Math.abs(b.getBoundingClientRect().top);
});
var a = $("div").index(b[0]);
a = 40 == c.keyCode ? ++a : --a;
if (!(0 > a || a >= b.length)) {
$("body,html").stop().animate({scrollTop:"+=" + $("div")[a].getBoundingClientRect().top}, 800), !1;
}
}
});
});
</script>
</head>
<body>
<div id="d1" >1↑ ↓ </div>
<div id="d2" >2</div>
<div id="d3" >3</div>
<div id="d4" >4</div>
</body>
</html>
|
ты гений, спасибо! Перепишу потом на чистый джс, выложу сюда, мож кому пригодится.
|
Цитата:
|
Добрый, признаюсь честно, не совсем понимаю, как работает вот этот отрезок кода, index(b[0]) вернет 0? Сижу уже долго, не думается...
var a = $("div").index(b[0]);
a = 40 == c.keyCode ? ++a : --a;
if (!(0 > a || a >= b.length)) {
$("body,html").stop().animate({scrollTop:"+=" + $("div")[a].getBoundingClientRect().top}, 800), !1;
}
|
JohnJohn,
var a = $("div").index(b[0]);// условно a=2 третий блок ближе всего к верхней части окна
a = 40 == c.keyCode ? ++a : --a; если нажата стрелка вверх значит нужен индекс a = 1 второй блок
if (!(0 > a || a >= b.length)) { если блок таким индексом существует двигаемся к нему
$("body,html").stop().animate({scrollTop:"+=" + $("div")[a].getBoundingClientRect().top}, 800), !1;
}
|
Цитата:
|
var a = $("div").index(b[0]);
Я не могу разобраться с этой строчкой. Насколько я понимаю, событие срабатывает на каждый индекс массива из дивов, при этом, с каждым индексом выполняется эта часть кода
a = 40 == c.keyCode ? ++a : --a;
if (!(0 > a || a >= b.length)) {
$("body,html").stop().animate({
scrollTop: "+=" + $("div")[a].getBoundingClientRect().top
}, 800);
}
Но, как сделать на чистом джс, не могу додуматься, если делать через цикл, тогда оно сразу же проходит по всему циклу и возвращает последний элемент, что значит скролится в самый низ. |
| Часовой пояс GMT +3, время: 01:13. |