Почему scrollTo с начало срабатывает, а потом кидает обратно

window.onload = function() {
  let y = document.querySelectorAll(".wrapper div")[12].offsetTop;
  let x = document.querySelectorAll(".wrapper div")[12].offsetLeft;
  window.scroll({
    top: y,
    left:x,
  })

};
body {
  margin: 0;
  padding: 0;
  -webkit-perspective: 100px;
          perspective: 100px;
  -webkit-transition: all 0.5s ease;
  -o-transition: all 0.5s ease;
  transition: all 0.5s ease; }
  body .wrapper {
    display: grid;
    grid-template-columns: 44% 44% 44% 44% 44%;
    grid-template-rows: 44% 44% 44% 44% 44%;
    grid-gap: 0; }
    body .wrapper div.about {
      background-color: aliceblue; }
    body .wrapper div.bower {
      background-color: darkgreen; }
    body .wrapper div.contact {
      background-color: crimson; }
    body .wrapper div.extra {
      background-color: chocolate; }
    body .wrapper div.main {
      background-color: chartreuse; }
    body .wrapper div.portfolio {
      background-color: brown; }
    body .wrapper div.service {
      background-color: blueviolet; }
    body .wrapper div.stub1 {
      background-color: blue; }
    body .wrapper div.stub2 {
      background-color: aqua; }
    body .wrapper div iframe {
      overflow: hidden; }
<body>
<div class="wrapper">
    <div class="main">1
    </div>
    <div class="about">1
    </div>
    <div class="portfolio">1
    </div>
    <div class="main">1
    </div>
    <div class="about">1
    </div>
    <div class="service">1
    </div>
    <div class="bower">1
    </div>
    <div class="contact">1
    </div>
    <div class="service">1
    </div>
    <div class="bower">1
    </div>
    <div class="extra">1
    </div>
    <div class="stub1">1
    </div>
    <div class="stub2">1
    </div>
    <div class="extra">1
    </div>
    <div class="stub1">1
    </div>
    <div class="main">1
    </div>
    <div class="about">1
    </div>
    <div class="portfolio">1
    </div>
    <div class="main">1
    </div>
    <div class="about">1
    </div>
    <div class="service">1
    </div>
    <div class="bower">1
    </div>
    <div class="contact">1
    </div>
    <div class="service">1
    </div>
    <div class="bower">2
    </div>
</div>
</body>

работает тут, и в FireFox, но в хром не работает


Ответы (1 шт):

Автор решения: Pavel Grishaev

Хром, если закэшировал позицию скрола, в следующий раз будет к ней возвращаться. Он это делает, чтобы не терять место просмотра на больших страницах при навигации назад-вперёд. Этот возврат к месту в документе (скрол) срабатывает после события onload. Получается, что вы сначала скролите скриптом, а потом браузер скролит после вас к тому месту, которое помнит ранее. Убедиться в этом можно так (скопируйте в страницу и запустите):

<html>
<head>
    <script>
        window.onload = function() {
            console.log('page loaded');
          let y = document.querySelectorAll(".wrapper div")[12].offsetTop;
          let x = document.querySelectorAll(".wrapper div")[12].offsetLeft;
          window.scroll({
            top: y,
            left:x,
          });
          console.log('we make scrolling to elem');
        };
        window.addEventListener('scroll',()=>{
            console.log('page scrolled');
        });
    </script>
    <style>
        body {
          margin: 0;
          padding: 0;
          -webkit-perspective: 100px;
                  perspective: 100px;
          -webkit-transition: all 0.5s ease;
          -o-transition: all 0.5s ease;
          transition: all 0.5s ease; }
          body .wrapper {
            display: grid;
            grid-template-columns: 44% 44% 44% 44% 44%;
            grid-template-rows: 44% 44% 44% 44% 44%;
            grid-gap: 0; }
            body .wrapper div.about {
              background-color: aliceblue; }
            body .wrapper div.bower {
              background-color: darkgreen; }
            body .wrapper div.contact {
              background-color: crimson; }
            body .wrapper div.extra {
              background-color: chocolate; }
            body .wrapper div.main {
              background-color: chartreuse; }
            body .wrapper div.portfolio {
              background-color: brown; }
            body .wrapper div.service {
              background-color: blueviolet; }
            body .wrapper div.stub1 {
              background-color: blue; }
            body .wrapper div.stub2 {
              background-color: aqua; }
            body .wrapper div iframe {
              overflow: hidden; }
    </style>
</head>
<body>
    <div class="wrapper">
        <div class="main">1
        </div>
        <div class="about">1
        </div>
        <div class="portfolio">1
        </div>
        <div class="main">1
        </div>
        <div class="about">1
        </div>
        <div class="service">1
        </div>
        <div class="bower">1
        </div>
        <div class="contact">1
        </div>
        <div class="service">1
        </div>
        <div class="bower">1
        </div>
        <div class="extra">1
        </div>
        <div class="stub1">1
        </div>
        <div class="stub2">1
        </div>
        <div class="extra">1
        </div>
        <div class="stub1">1
        </div>
        <div class="main">1
        </div>
        <div class="about">1
        </div>
        <div class="portfolio">1
        </div>
        <div class="main">1
        </div>
        <div class="about">1
        </div>
        <div class="service">1
        </div>
        <div class="bower">1
        </div>
        <div class="contact">1
        </div>
        <div class="service">1
        </div>
        <div class="bower">2
        </div>
    </div>
</body>
</html>

Соответственно попробуйте сделать таймер в onload, а не скролить сразу:

window.onload = ()=>{
    let y = document.querySelectorAll(".wrapper div")[12].offsetTop;
    let x = document.querySelectorAll(".wrapper div")[12].offsetLeft;
    setTimeout(()=>{
        window.scroll({
            top: y,
            left:x,
        });
    }, 1000 );
};
→ Ссылка