Я борюсь со странным поведением Chrome, когда страница загружается, она прыгает в нижнюю часть страницы, а затем сразу же возвращается наверх.
Воспроизводимый в
- Chrome 84.0.4147.135 (официальная сборка)
- Хром 80.0.3987.162
Условия
- В URL-адресе '#bottom' должен быть фрагмент, ссылающийся на элемент в самом низу страницы.
- Javascript также попытается прокрутить страницу в самом низу, используя html.scrollTop.
Когда оба условия верны, возникает проблема. Страница прыгает вниз (там красный div - он мигает красным), а затем сразу же возвращается вверх (снова становится белым).
Когда есть только фрагмент '#bottom' без javascript или только javascript без фрагмента '#bottom', все работает как положено - страница красная, когда она прокручивается в самом низу. Только когда используются оба механизма, он не работает.
Ожидаемое поведение
- Javscript scrollTop модификаций прыгает вниз - страница остается красной (работает)
- Ссылка на фрагмент прыгает вниз - страница остается красной (работает)
- И модификация scrollTop, и ссылка на фрагмент прыгают вниз - страница остается красной (не работает)
Текущее поведение:
- Страница прыгает вниз — становится ненадолго красной — а затем снова прыгает вверх и остается белой
Примечание. Похоже, что Chrome просто восстанавливает исходную позицию прокрутки. Когда вы начинаете снизу и нажимаете CTRL+R, он остается внизу. Когда вы начинаете сверху и нажимаете CTRL + R, он остается сверху, а ненадолго прыгает в самый низ страницы.
Упрощенный код:
<!DOCTYPE html>
<html>
<body>
<!-- Just a button that makes sure there is '#bottom' fragment in URL, resets scrolling and reloads page -->
<a href="javascript:location='#bottom';document.documentElement.scrollTop=0;location.reload();" style="position: fixed;">
CLICK TO TEST
<div><small>Keep clicking and if you see RED BACKGROUND FLASH you can reproduce the problem.</small></div>
</a>
<!-- Two big divs with distinct colors so we can see color flash when it jumps -->
<div id="top" style="background: white; height: 10000px;"></div>
<div style="height: 500vh; background-color: red;"></div>
<!-- bottom target referenced by '#bottom' above -->
<div id="bottom">BOTTOM ANCHOR</div>
<script type="text/javascript">
document.documentElement.scrollTop = document.documentElement.scrollHeight;
</script>
</body>
</html>
Я не мог использовать встроенный предварительный просмотр, потому что ему нужен URL-адрес с фрагментом. Вы можете временно просмотреть его в реальном времени здесь.
Изменить: наблюдение - вся проблема заключается в том, что Chrome пытается сохранить старую позицию scrollTop, несмотря на то, что Javascript меняет ее на новую.