Несколько методов перехода HTML в указанную позицию на странице

HTML

предисловие

Иногда нам хочется прочитать какой-нибудь замечательный контент на странице, но из-за того, что страница слишком длинная, пользователям приходится прокручивать страницу самостоятельно, что очень хлопотно найти 😭, легко потерять интерес к продолжению чтения. Этот опыт очень плохой, поэтому мы можем найти способ 💡 нажать на определенный текст или картинку, чтобы перейти в указанную позицию на странице, которую удобно читать пользователям.

1. Чистая HTML-реализация

1. Используйте идентификатор в качестве отмеченного якоря

Тегом здесь в качестве якоря может быть любой элемент.

  <a href="#aa">跳转到 id 为 aa 标记的锚点</a>
  <p>-------------分隔线-------------</p>
  <div id="aa">a</div>

2. Используйте свойство имени тегов как точка привязки

Здесь меткой в ​​качестве якоря может быть только тег.

  <a href="#bb" >跳转到 name 为 bb 的 a 标签锚点</a>
  <p>-------------分隔线-------------</p>
  <a name="bb">name 为 bb 的 a 标签的锚点</a>
  <div id="abb">bbb</div>

Примечание. Когда «атрибут имени тега в качестве привязки» и «привязка, помеченная идентификатором» появляются одновременно (то есть, когда имя является привязкой, а идентификатор — привязкой с тем же именем), последний будет использоваться в качестве якоря.

2. js-реализация

1. Использование прокрутки()

window.scrollToПрокрутите до координаты в документе. Может обеспечить скользящий эффект, хотите узнать большеscrollTo()может видетьMDNвведение в .

Без лишних слов, посмотрите на код ниже👇

"html часть":

  <a id="linkc">平滑滚动到 c</a>
  <p>-------------分隔线-------------</p>
  <div id="cc">c</div>

"js-часть":

  var linkc = document.querySelector('#linkc')
  var cc = document.querySelector('#cc')

  function to(toEl) {
    // toEl 为指定跳转到该位置的DOM节点
    let bridge = toEl;
    let body = document.body;
    let height = 0;
    
    // 计算该 DOM 节点到 body 顶部距离
    do {
      height += bridge.offsetTop;
      bridge = bridge.offsetParent;
    } while (bridge !== body)
    
    // 滚动到指定位置
    window.scrollTo({
      top: height,
      behavior: 'smooth'
    })
  }

  linkc.addEventListener('click', function () {
    to(cc)
  });

2. Использование scrollIntoView()

Element.scrollIntoView()Метод прокручивает текущий элемент в видимую область окна браузера. хочу узнать большеscrollIntoView()может видетьMDNвведение в .

Код прямо под👇

"html часть":

  <a onclick="goTo()">利用 scrollIntoView 跳转到 d</a>
  <p>-------------分隔线-------------</p>
  <div id="dd">ddd</div>

"js-часть":

  var dd = document.querySelector('#dd')

  function goTo(){
    dd.scrollIntoView()
  }

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

Следующий код составлен для удобства просмотра эффекта.

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    div {
      width: 600px;
      height: 300px;
      background-color: pink;
    }
  </style>
</head>
<body>
  <a href="#aa">跳转到以 id 为 aa 标记的锚点 a</a>
  <p>-------------分隔线-------------</p>
  <a name="aa">hhh</a>
  <div id="aa">aa</div>
  <a href="#bb" >跳转到 name 为 bb 的 a 标签锚点</a>
  <p>-------------分隔线-------------</p>
  <a name="bb">name 为 bb 的 a 标签的锚点</a>
  <p>-------------分隔线-------------</p>
  <div>bb</div>
  <a id="linkc">平滑滚动到 c</a>
  <p>-------------分隔线-------------</p>
  <div id="cc">cc</div>
  <a onclick="goTo()">利用 scrollIntoView 跳转到 d</a>
  <p>-------------分隔线-------------</p>
  <div id="dd">dd</div>
  <p>-------------分隔线-------------</p>
  <div></div>
</body>
<script>
  var cc = document.querySelector('#cc')
  var linkc = document.querySelector('#linkc')

  function to(toEl) {
    //ele为指定跳转到该位置的DOM节点
    let bridge = toEl;
    let body = document.body;
    let height = 0;
    do {
      height += bridge.offsetTop;
      bridge = bridge.offsetParent;
    } while (bridge !== body)

    console.log(height)
    window.scrollTo({
      top: height,
      behavior: 'smooth'
    })
  }

  linkc.addEventListener('click', function () {
    to(cc)
  });

</script>
<script>
  var dd = document.querySelector('#dd')

  function goTo(){
    dd.scrollIntoView()
  }
</script>
</html>

Изображение эффекта: