Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   плавный скролл при нажатии на кнопки клавиатуры(вниз, вверх) (https://javascript.ru/forum/misc/71901-plavnyjj-skroll-pri-nazhatii-na-knopki-klaviatury-vniz-vverkh.html)

JohnJohn 20.12.2017 22:33

плавный скролл при нажатии на кнопки клавиатуры(вниз, вверх)
 
Добрый вечер, подскажите, а реально ли при нажатии на клаватуре кнопок вверх вниз, можно было попасть на нужный раздел страницы. Например, разделы:
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>


Заранее спасибо.

рони 20.12.2017 23:55

Цитата:

Сообщение от JohnJohn
реально ли

да

JohnJohn 21.12.2017 00:25

я представлял это так(например для кнопки вниз):

сделать функцию с анимацией и скролом:

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(элемент к которому нужен прокрут)
        }
    };


но нет

рони 21.12.2017 01:35

скролл по блокам с помощью стрелок ↑ ↓
 
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&uarr; &darr; </div>
<div id="d2" >2</div>
<div id="d3" >3</div>
<div id="d4" >4</div>

</body>

</html>

JohnJohn 21.12.2017 02:47

ты гений, спасибо! Перепишу потом на чистый джс, выложу сюда, мож кому пригодится.

рони 25.12.2017 18:45

Цитата:

Сообщение от JohnJohn
Перепишу потом на чистый джс

как успехи с js?

JohnJohn 26.12.2017 23:14

Добрый, признаюсь честно, не совсем понимаю, как работает вот этот отрезок кода, 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;
      }

рони 26.12.2017 23:27

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;
    }

рони 26.12.2017 23:30

Цитата:

Сообщение от рони
getBoundingClientRect().top}, 800), !1;

красное выкинуть забыть, осталось от прежнего

JohnJohn 27.12.2017 19:40

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);
                    }


Но, как сделать на чистом джс, не могу додуматься, если делать через цикл, тогда оно сразу же проходит по всему циклу и возвращает последний элемент, что значит скролится в самый низ.

рони 27.12.2017 19:49

Цитата:

Сообщение от JohnJohn
событие срабатывает на каждый индекс массива

только один элемент может быть всех ближе к верху окна, только предыдущему этого элемента (или следующему) будет скролл. в чём проблема?

рони 27.12.2017 20:03

Цитата:

Сообщение от JohnJohn
var a = $("div").index(b[0]);

b[0] это всегда разный элемент, тот который ближе к верху, это происходит в результате сортировки.

если и куда-то можно втиснуть цикл, то это заменить сортировку циклом. так будет быстрее даже за счёт break.

рони 27.12.2017 20:14

JohnJohn,
Задача №1. (по желанию)

<!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>
window.addEventListener("DOMContentLoaded", function() {

  var b = document.querySelectorAll("div");
  document.addEventListener("keydown", function(e) {
  for (var i=0; i < b.length; i++)  {
     //ваша задача остановить цикл на элементе который всех ближе к верху окна
  }

  alert(i + 1);
  });
});
  </script>

</head>

<body>
<div id="d1" >1&uarr; &darr; </div>
<div id="d2" >2</div>
<div id="d3" >3</div>
<div id="d4" >4</div>

</body>

</html>

JohnJohn 28.12.2017 02:29

<!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>
window.addEventListener("DOMContentLoaded", function() {

  var b = document.querySelectorAll("div");
  document.addEventListener("keydown", function(e) {
  for (var i=0; i < b.length; i++)  {
if (window.pageYOffset < (b[i].getBoundingClientRect().top + window.pageYOffset)) break;
     
  }

  alert(i);
  });
});
  </script>

</head>

<body>
<div id="d1" >1&uarr; &darr; </div>
<div id="d2" >2</div>
<div id="d3" >3</div>
<div id="d4" >4</div>

</body>

</html>

рони 28.12.2017 02:46

JohnJohn,
:dance:

рони 28.12.2017 02:48

JohnJohn,
только уберите лишнее из строки 25

JohnJohn 28.12.2017 03:06

не могу понять, что лишнее) break на 26 перенести?)

рони 28.12.2017 03:19

JohnJohn,
то что одинаково в сравнении, можно сократить, вычитанием из обоих частей сравнения.

рони 28.12.2017 03:35

JohnJohn,
5 < y + 5 == 0 < y

JohnJohn 28.12.2017 03:40

рони,
понял) ну как все напишу, там обязательно уберу, а так пусть будет, что бы людей не путать) спасибо


Часовой пояс GMT +3, время: 02:34.