Поведение ScrollToOptions: «гладкое» не работает в Chrome и Edge v81+

После тестирования в BrowserStack я пришел к выводу, что использование scrollTo() с опционным параметром behavior: smooth не работает в Chrome и Edge, начиная с версии 81. Версия 80 Edge и Chrome работала должным образом. Согласно MDN, он должен работать без звездочки. (в отличие от сафари)

В популярных ответах, таких как этот, использование behavior: smooth является рекомендуемым способом включения плавной прокрутки в вашем веб-приложении.

Вот небольшая воспроизводимая:

<html>
<button onclick = "goToAnchor('b')">Scroll to B</button>
<div id = "a" style = "height: 1000px; background-color: blue;">Blue</div>
<div id = "b" style = "height: 1000px; background-color: red;">Red</div>
<div id = "c" style = "height: 1000px; background-color: green;">Green</div>

</html>

<script>
  function goToAnchor(anchor) {
    let rect = document.getElementById(anchor).getBoundingClientRect();
    window.scrollTo({
      left: rect.left + window.pageXOffset,
      top: rect.top + window.pageYOffset,
      behavior: 'smooth',
    });
  }
</script>

Ожидаемое поведение будет заключаться в том, что окно браузера плавно интерполирует вид до красного div. Он делает это правильно во всех версиях Firefox, которые я тестировал. Во всех версиях Chrome, начиная с v81, и во всех версиях Edge, начиная с v81, похоже, используется поведение behavior: auto, то есть он переходит к div, а не плавно интерполирует представление.

В версии 80 Edge и Chrome он ведет себя точно так же, как Firefox, а это означает, что эта ошибка (?) должна была появиться в версии 81 — возможно, в общей кодовой базе Chromium?

Я считаю очень маловероятным, что я первый, кто обнаружил эту проблему, поскольку она не работала с апреля, и поэтому я должен сделать вывод, что я делаю что-то не так. Может ли кто-нибудь указать на ошибку в коде? Или API Chrome и Edge действительно не работают? Скрыто ли поведение за флагом функции, как в Safari?

Работает в моем Chrome 87.0.4280.66 и Edge 87.0.664.60

mplungjan 14.12.2020 12:25

На какой платформе? Я пробовал это через BrowserStack в Win10, Win7 и Mac, но не работал ни в одном из этих случаев.

Emanuel Strömgren 14.12.2020 12:26

Выиграй 10 для меня... Плавно

mplungjan 14.12.2020 12:27

Интересный. Может ли это быть как-то связано с предпочтениями пользователя?

Emanuel Strömgren 14.12.2020 12:28

W10 x64, Chrome 87.0.4280.88, Edge 87.0.664.60 — оба переходят без анимации к красному div (FF83 работает)

Andreas 14.12.2020 12:30
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
5
1 575
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я пытаюсь провести тест с MS Edge версии 87.0.664.60 и Google Chrome версии 87.0.4280.88.

С моей стороны код отлично работает в обоих браузерах.

Вот результат моего теста: (выше — MS Edge, а ниже — браузер Google Chrome)

Вы делаете этот тест, используя BrowserStack. Возможно, проблема связана с BrowserStack.

Я предлагаю вам попробовать сделать тест, используя настоящие браузеры. Это может помочь вам найти причину проблемы.

Да, я думаю, вы можете быть правы, по крайней мере частично. Я думаю, что это как-то связано с удаленными подключениями. Проблема была обнаружена во время проверки функций дизайнером моего текущего проекта. Затем он был протестирован несколькими разработчиками, которые сообщили об одной и той же проблеме, хотя следует отметить, что изначально у меня не было этой проблемы, когда я разрабатывал эту функцию некоторое время назад. Теперь я понимаю, что я был в офисе, когда разрабатывал его изначально, но теперь я подключен через RDP вместе со всеми другими разработчиками. Может ли это быть ошибкой, связанной с Covid-19? :П

Emanuel Strömgren 16.12.2020 10:07
Ответ принят как подходящий

Я считаю, что нашел виновника, и, что интересно, кажется, что это Firefox, который является лишним.

В этой ветке StackOverflow об обнаружении соединений RDP текущий топ-ответ гласит:

Вы можете использовать следующий медиа-запрос:

@media screen and (prefers-reduced-motion: reduce) { . . . }

Часть prefers-reduced-motion интересная. В моем тестировании кажется, что это также изменяет вызовы scrollTo() с scroll-behavior: 'smooth' для перехода, а не для интерполяции.

Я сделал дополнение к примеру кода вопроса, чтобы продемонстрировать эту функцию:

<html>
  <button onclick = "goToAnchor('b')">Scroll to B</button>
  <p class = "reduced-motion">Reduced motion is enabled.</p>
  <div id = "a" style = "height: 1000px; background-color: blue;">Blue</div>
  <div id = "b" style = "height: 1000px; background-color: red;">Red</div>
  <div id = "c" style = "height: 1000px; background-color: green;">Green</div>
</html>
<style>
  .reduced-motion {
    display: none;
  }
  @media (prefers-reduced-motion) {
    .reduced-motion {
      display: inline;
    }
  }
</style>
<script>
  function goToAnchor(anchor) {
    let rect = document.getElementById(anchor).getBoundingClientRect();
    window.scrollTo({
      left: rect.left + window.pageXOffset,
      top: rect.top + window.pageYOffset,
      behavior: 'smooth',
    });
  }
</script>

Теперь он скажет: «Уменьшение движения включено». рядом с кнопкой в ​​зависимости от вашей ОС и конфигурации браузера. В этом случае вызов scrollTo будет просто переходить, а не интерполировать.

Короче говоря, проблема в том, что управление удаленным рабочим столом BrowserStack также включает этот флаг.

Включение «Простота доступа > Показать анимацию» в Windows устранило эту проблему.

Etienne Martin 20.01.2021 21:21

Другие вопросы по теме