平滑滚动而不使用jQuery [英] Smooth scroll without the use of jQuery

查看:85
本文介绍了平滑滚动而不使用jQuery的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在编写一个页面,我只想使用原始JavaScript代码进行UI,而不受任何插件或框架的干扰。

现在我挣扎着找到一种不用jQuery即可顺利滚动页面的方法。 解决方案

试试这个平滑滚动演示或算法例如:


  1. 使用 self.pageYOffset

  2. 获取元素的位置,直到您想要滚动到的位置: element.offsetTop

  3. 使用 window.scrollTo

来循环滚动到该位置,




另见其他受欢迎的答案对此>




安德鲁约翰逊的原始代码:

  function currentYPosition(){
// Firefox,Chrome,Opera,Safari
if(self.pageYOffset)return self.pageYOffset;
// Internet Explorer 6 - 标准模式
if(document.documentElement&& document.documentElement.scrollTop)
return document.documentElement.scrollTop;
// Internet Explorer 6,7和8
if(document.body.scrollTop)return document.body.scrollTop;
返回0;
}


函数elmYPosition(eID){
var elm = document.getElementById(eID);
var y = elm.offsetTop;
var node = elm;
while(node.offsetParent&& node.offsetParent!= document.body){
node = node.offsetParent;
y + = node.offsetTop;
}返回y;
}


function smoothScroll(eID){
var startY = currentYPosition();
var stopY = elmYPosition(eID);
var distance = stopY> startY? stopY - startY:startY - stopY;
if(distance< 100){
scrollTo(0,stopY);返回;
}
var speed = Math.round(distance / 100);
if(speed> = 20)speed = 20;
var step = Math.round(distance / 25);
var leapY = stopY> startY? startY + step:startY - step;
var timer = 0;
if(stopY> startY){
for(var i = startY; i< stopY; i + = step){
setTimeout(window.scrollTo(0,+ leapY +) ,计时器*速度);
leapY + = step;如果(leapY> stopY)leapY = stopY;计时器++;
} return;
}
for(var i = startY; i> stopY; i- = step){
setTimeout(window.scrollTo(0,+ leapY +),timer * speed) ;
leapY - = step;如果(leapY

$ / code $ / pre

$ hr

相关链接:


I'm coding up a page where I only want to use raw JavaScript code for UI without any interference of plugins or frameworks.

And now I'm struggling with finding a way to scroll over the page smoothly without jQuery.

解决方案

Try this smooth scrolling demo, or an algorithm like:

  1. Get the current top location using self.pageYOffset
  2. Get the position of element till where you want to scroll to: element.offsetTop
  3. Do a for loop to reach there, which will be quite fast or use a timer to do smooth scroll till that position using window.scrollTo


See also the other popular answer to this question.


Andrew Johnson's original code:

function currentYPosition() {
    // Firefox, Chrome, Opera, Safari
    if (self.pageYOffset) return self.pageYOffset;
    // Internet Explorer 6 - standards mode
    if (document.documentElement && document.documentElement.scrollTop)
        return document.documentElement.scrollTop;
    // Internet Explorer 6, 7 and 8
    if (document.body.scrollTop) return document.body.scrollTop;
    return 0;
}


function elmYPosition(eID) {
    var elm = document.getElementById(eID);
    var y = elm.offsetTop;
    var node = elm;
    while (node.offsetParent && node.offsetParent != document.body) {
        node = node.offsetParent;
        y += node.offsetTop;
    } return y;
}


function smoothScroll(eID) {
    var startY = currentYPosition();
    var stopY = elmYPosition(eID);
    var distance = stopY > startY ? stopY - startY : startY - stopY;
    if (distance < 100) {
        scrollTo(0, stopY); return;
    }
    var speed = Math.round(distance / 100);
    if (speed >= 20) speed = 20;
    var step = Math.round(distance / 25);
    var leapY = stopY > startY ? startY + step : startY - step;
    var timer = 0;
    if (stopY > startY) {
        for ( var i=startY; i<stopY; i+=step ) {
            setTimeout("window.scrollTo(0, "+leapY+")", timer * speed);
            leapY += step; if (leapY > stopY) leapY = stopY; timer++;
        } return;
    }
    for ( var i=startY; i>stopY; i-=step ) {
        setTimeout("window.scrollTo(0, "+leapY+")", timer * speed);
        leapY -= step; if (leapY < stopY) leapY = stopY; timer++;
    }
}


Related links:

这篇关于平滑滚动而不使用jQuery的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆