没有 jQuery 的平滑滚动锚链接

IT技术 javascript hyperlink anchor
2021-03-08 01:06:38

是否可以使用平滑滚动来锚定链接但没有 jQuery我正在创建一个新站点,但不想使用jQuery.

6个回答

扩展这个答案:https : //stackoverflow.com/a/8918062/3851798

定义好你的scrollTo 函数后,你可以在函数中传递你想要scrollTo 的元素。

function scrollTo(element, to, duration) {
    if (duration <= 0) return;
    var difference = to - element.scrollTop;
    var perTick = difference / duration * 10;

    setTimeout(function() {
        element.scrollTop = element.scrollTop + perTick;
        if (element.scrollTop === to) return;
        scrollTo(element, to, duration - 10);
    }, 10);
}

如果你有一个 id="footer" 的 div

<div id="footer" class="categories">…</div>

在您运行滚动的脚本中,您可以运行它,

elmnt = document.getElementById("footer");
scrollTo(document.body, elmnt.offsetTop, 600);

你有它。没有 jQuery 的平滑滚动。您实际上可以在浏览器的控制台上使用该代码并根据自己的喜好对其进行微调。

边缘为 document.body,chrome 为 document.documentElement。
2021-04-25 01:06:38
我不得不传入document.documentElement函数而不是document.body让它工作
2021-05-09 01:06:38

使用此处的函数:JavaScript animation并修改它以修改属性(不仅仅是样式的属性),您可以尝试以下操作:

演示: http : //jsfiddle.net/7TAa2/1/

就是说...

function animate(elem, style, unit, from, to, time, prop) {
  if (!elem) {
    return;
  }
  var start = new Date().getTime(),
    timer = setInterval(function() {
      var step = Math.min(1, (new Date().getTime() - start) / time);
      if (prop) {
        elem[style] = (from + step * (to - from)) + unit;
      } else {
        elem.style[style] = (from + step * (to - from)) + unit;
      }
      if (step === 1) {
        clearInterval(timer);
      }
    }, 25);
  if (prop) {
    elem[style] = from + unit;
  } else {
    elem.style[style] = from + unit;
  }
}

window.onload = function() {
  var target = document.getElementById("div5");
  animate(document.scrollingElement || document.documentElement, "scrollTop", "", 0, target.offsetTop, 2000, true);
};
div {
  height: 50px;
}
<div id="div1">asdf1</div>
<div id="div2">asdf2</div>
<div id="div3">asdf3</div>
<div id="div4">asdf4</div>
<div id="div5">asdf5</div>
<div id="div6">asdf6</div>
<div id="div7">asdf7</div>
<div id="div8">asdf8</div>
<div id="div9">asdf9</div>
<div id="div10">asdf10</div>
<div id="div10">asdf11</div>
<div id="div10">asdf12</div>
<div id="div10">asdf13</div>
<div id="div10">asdf14</div>
<div id="div10">asdf15</div>
<div id="div10">asdf16</div>
<div id="div10">asdf17</div>
<div id="div10">asdf18</div>
<div id="div10">asdf19</div>
<div id="div10">asdf20</div>

@mtness 它在 Firefox 中运行良好(代码,可能不是演示)。您需要更新要设置动画的元素,因为 Firefox 显然不喜欢更改scrollTopof document.body(进行了快速调试和 Google 搜索以解决此问题)。试试这个:jsfiddle.net/zpu16nen(我会更新这篇文章)
2021-04-20 01:06:38
对于尝试这样做的人:这是很棒的脚本,但不要指望有任何缓和或漂亮的补间。这是一种原始的阶梯式动画。
2021-05-17 01:06:38

实际上,有更轻量级和简单的方法来做到这一点:https : //codepen.io/ugg0t/pen/mqBBBY

function scrollTo(element) {
  window.scroll({
    behavior: 'smooth',
    left: 0,
    top: element.offsetTop
  });
}

document.getElementById("button").addEventListener('click', () => {
  scrollTo(document.getElementById("8"));
});
div {
  width: 100%;
  height: 200px;
  background-color: black;
}

div:nth-child(odd) {
  background-color: white;
}

button {
  position: absolute;
  left: 10px;
  top: 10px;
}
<div id="1"></div>
<div id="2"></div>
<div id="3"></div>
<div id="4"></div>
<div id="5"></div>
<div id="6"></div>
<div id="7"></div>
<div id="8"></div>
<div id="9"></div>
<div id="10"></div>
<button id="button">Button</button>

唯一的问题是,而不是element.offsetTop你应该使用element.getBoundingClientRect().top + window.scrollY
2021-04-21 01:06:38
这与简单地添加 相同scroll-behavior: smooth,在当前大多数浏览器中都运行良好,但 Safari 尚未采用。
2021-05-11 01:06:38
@zdolny 它现在适用于本机 Edge,但对于 IE,您将需要一个polyfill - github.com/iamdustan/smoothscroll
2021-05-14 01:06:38
@ekfuhrmann我不关心 IE,但它在 Safari 中工作吗?或者我也不应该关心 Safari 吗?
2021-05-14 01:06:38

用这个:

let element = document.getElementById("box");

element.scrollIntoView();
element.scrollIntoView(false);
element.scrollIntoView({block: "end"});
element.scrollIntoView({behavior: "instant", block: "end", inline: "nearest"});

演示https : //jsfiddle.net/anderpo/x8ucc5ak/1/

或多或少与scroll-behavior: smoothSafari 不支持(或 IE,但更重要的是现代 Safari)。
2021-04-25 01:06:38
尝试添加一些解释
2021-04-28 01:06:38
非常有趣的解决方案 (+1) 但目前不支持 IE 很糟糕!
2021-05-02 01:06:38

带有:target选择器的CSS3 转换可以在没有任何 JS hack 的情况下提供不错的结果。我只是在考虑是否要实现这一点,但没有 Jquery,它确实有点混乱。有关详细信息,请参阅此问题

为什么不包括最重要的一点?html { scroll-behavior: smooth; }- 如此简单且有效,如果您可以避开 IE 支持
2021-05-09 01:06:38
IE 支持是一回事,但它也不适用于现代 Safari。
2021-05-10 01:06:38