用 JavaScript 实现变速回到顶部

May 18th, 2009 Add Comment

一般网页的下方都会放置一个置顶按钮, 尤其是页面底部没有导航的网页, 这样可以帮助访客重新找到导航或者重温一遍广告 (想得真美). 随着近几年来 JavaScript 的应用日渐广泛, 滑动效果无处不在, 于是我也跟跟风, 将置顶功能做成了滑动效果. 后来为了更贴合物理特征, 改造做成了减速的滑动效果.

首先说一下原理吧. 我们会获取滚动条到页面顶部的距离, 然后上移一定的距离; 再获取滚动条到页面顶部的距离, 上移一定的距离 (比上一次小一点); ...

JavaScript 代码:

/**
 * 回到页面顶部
 * @param acceleration 加速度
 * @param time 时间间隔 (毫秒)
 **/
function goTop(acceleration, time) {
	acceleration = acceleration || 0.1;
	time = time || 16;
 
	var x1 = 0;
	var y1 = 0;
	var x2 = 0;
	var y2 = 0;
	var x3 = 0;
	var y3 = 0;
 
	if (document.documentElement) {
		x1 = document.documentElement.scrollLeft || 0;
		y1 = document.documentElement.scrollTop || 0;
	}
	if (document.body) {
		x2 = document.body.scrollLeft || 0;
		y2 = document.body.scrollTop || 0;
	}
	var x3 = window.scrollX || 0;
	var y3 = window.scrollY || 0;
 
	// 滚动条到页面顶部的水平距离
	var x = Math.max(x1, Math.max(x2, x3));
	// 滚动条到页面顶部的垂直距离
	var y = Math.max(y1, Math.max(y2, y3));
 
	// 滚动距离 = 目前距离 / 速度, 因为距离原来越小, 速度是大于 1 的数, 所以滚动距离会越来越小
	var speed = 1 + acceleration;
	window.scrollTo(Math.floor(x / speed), Math.floor(y / speed));
 
	// 如果距离不为零, 继续调用迭代本函数
	if(x > 0 || y > 0) {
		var invokeFunction = "goTop(" + acceleration + ", " + time + ")";
		window.setTimeout(invokeFunction, time);
	}
}

document.documentElement.scrollTop, document.body.scrollTop, window.scrollY 其实都是一样的, 但它们只在某些浏览器中起作用. 至于那哪个在哪些浏览器起作用可以自己调试一下.

HTML 代码:

<a href="#" onclick="goTop();return false;">TOP</a>
声明: 本文采用 BY-NC-SA 协议进行授权. 转载请注明转自: 用 JavaScript 实现变速回到顶部

  1. http://1.gravatar.com/avatar/d34b5f3daf8e188249a9c605614dbad0?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    这个,有个特点很有意思,它必须到顶部之后你才能有其他动作,中途想让它停下来那是不可能的 :razz:

    问个小白问题,有没有办法可以想停的时候就让它停止向上呢

  2. http://1.gravatar.com/avatar/d34b5f3daf8e188249a9c605614dbad0?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    @mg12

    囧,我看的就是这篇文章~~我还想要个回到底部的 :lol:

    最好是再自由落体回到底部 :mrgreen:

    ;-)

  3. http://0.gravatar.com/avatar/490cf262668eebb0f0f1a50d9d48d702?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G
  4. http://0.gravatar.com/avatar/cab963ed5a8f34ea97a0769184715808?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    @whisperer
    汗死…… 你很懒,建议你直接去那个http://ishawn.net网站扒JS代码最简单 :twisted:

  5. http://1.gravatar.com/avatar/d34b5f3daf8e188249a9c605614dbad0?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    @Calcifer
    我没搜到啊 可能搜索词不对,你给我个搜索链接吧 :lol:

  6. http://0.gravatar.com/avatar/cab963ed5a8f34ea97a0769184715808?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    @whisperer
    这个效果网上有现成的…… 带图标的,还能上下左右呢,你还真的要我在这贴代码? 自己搜搜吧,不难的

  7. http://1.gravatar.com/avatar/d34b5f3daf8e188249a9c605614dbad0?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    @Calcifer
    :sad:

    超级想做个像http://ishawn.net/的那样的,太帅了

    不会啊 :roll:

  8. http://0.gravatar.com/avatar/cab963ed5a8f34ea97a0769184715808?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    @whisperer
    Google了下,网上一大堆关于向下滚屏的,关键字“js 向下滚屏” 你自己DIY吧

  9. http://1.gravatar.com/avatar/d34b5f3daf8e188249a9c605614dbad0?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    我想做个回到底部的...谁能告诉我改怎么写.... :roll:

  10. http://0.gravatar.com/avatar/490cf262668eebb0f0f1a50d9d48d702?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    @me
    哈哈~ 越来越讲究了. 下次我优化一下.

    @MakLu
    如果 JavaScript 被禁用就会用 HTML 的锚点链接功能. 这个只为了效果.

    @keiv
    Which home button? I don't know what do you talking about.

  11. http://0.gravatar.com/avatar/c18f279144ceb21ee9dee45afdd86d85?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    why not use home button? :shock:
    Sorry for my mistake

  12. http://0.gravatar.com/avatar/08b2885195fe50c89b8fd7ea25b8dad6?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    确实很滑很好玩,但是 …… 有啥意义呢?
    为啥不用html的锚点连接呢?

  13. http://0.gravatar.com/avatar/853a6f8b3b4be1b2e292938e5b70e9de?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    不错唉。。。大家都借用了哦。。。测试不错。。

  14. http://0.gravatar.com/avatar/2dca225a0145e9a1f54bc6b9d699608a?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    不是很好。用阻尼原理会更ok些~

  15. http://0.gravatar.com/avatar/65c73fc52bec71c1ee1d0c660e15396e?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    喜欢点 top,一下子就回到上面了,好玩~

  16. http://0.gravatar.com/avatar/490cf262668eebb0f0f1a50d9d48d702?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    @chisdy
    呵呵, 但我的博客是用 jQuery 实现的. 各有各的好处吧.

    @shine
    我是用 HTML 敲的.

    @Alex
    不能通过 ID 定位, 应该可以适用所有主题. 如果不行, 证明那个主题有 JS 脚本错误.

  17. http://1.gravatar.com/avatar/bb3664adbe5be014683bfa0c1d5c1b56?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    不错不错的说

  18. http://1.gravatar.com/avatar/1ec4717231e96f16618449f9ebb32c5c?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    大晚上的 都睡了

  19. http://0.gravatar.com/avatar/e375178112a735a1cd5ff6d4b27885d5?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    博客收藏了,以后经常来看看你...hehe

  20. http://0.gravatar.com/avatar/e375178112a735a1cd5ff6d4b27885d5?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    谢谢博主 我找到了我需要的东西...

  21. http://0.gravatar.com/avatar/60a27f1b87afcbe5359820fa7d590b62?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    @吖Bee
    其实我也不晓得到底是不是jQuery了,我只看到里是一大推我看不懂的代码,然后直接把文件加载就OK了。。

  22. http://1.gravatar.com/avatar/b2a4a8583709521e13d79f8519b07954?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    @Alex
    他的好像不是用jQuery实现的~代码很多...

  23. http://0.gravatar.com/avatar/01f28411e2fa84047b82ed0556551e75?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    感谢博主的教程,终于搞定了。贵站已做连接。希望博主也给小站也连接上~~谢谢

  24. http://1.gravatar.com/avatar/f99ca9e4ee049517827bcd389cfb45ec?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    不错的文章。

  25. http://0.gravatar.com/avatar/8406d089bc81b664a2610b8d214c1428?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    不错不错的说~~~

  26. http://0.gravatar.com/avatar/60a27f1b87afcbe5359820fa7d590b62?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    我的博客现在用着笑傲人生提供的滑动JS文件,但在文章里面配合Mail to Commenter插件使用就有问题,一般都不是平滑移动而是跳转一下然后在平滑移动。。这个文章提供的代码能不能通过ID来进行定位的??
    PS:JS方面我不是很熟悉。。。

  27. http://1.gravatar.com/avatar/7bc5fce5add04db5805f7631fe2782b5?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    你好朋友,请问,我设置好了LINKS页面
    但是我想像你这样,http://www.neoease.com/links/
    分类名称排列的,要如何设置?

  28. http://1.gravatar.com/avatar/71981550e606563e4f569c420b2276cf?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    @welee
    我也是用Jquery去实现的,代码多得惨了,而且为了这点效果,加载Jquery太不值得了。
    这代码不错,简洁,看着就舒服。

  29. http://0.gravatar.com/avatar/490cf262668eebb0f0f1a50d9d48d702?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    @wlsy
    谢谢更正, 我更新下.

  30. http://0.gravatar.com/avatar/6b97fb6c82177c86e7ab2fd4e2da29d1?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    稍微正更下,这个不是滑动门哈。滑动门一般指应用到一个图像在另一个图像上的滑动,比较常见的是例子就是导航栏的圆角。

  31. http://0.gravatar.com/avatar/490cf262668eebb0f0f1a50d9d48d702?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    @Rui
    我的没减速, 我的 jQuery 实现的, 懒得改. 不过我发布的主题是减速置顶的.

    @Xiao3
    那你做个锚呗.

    @Jutoy , @拆組達人
    (- -!) 有这么好玩吗?

    @bolo
    我奶奶不会上网, 其他家的我管不着了.

    @Rui
    呵呵~ 我这里没减速, 到 http://demo.neoease.com 去看看吧.

  32. http://1.gravatar.com/avatar/bb05acb5b9b70b8886b356d190d3bb4a?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    @joel
    当然没有禁用,我好好禁用这些干嘛。。。
    其他人的INOVE没问题,就这里没有减速了。。。

  33. http://0.gravatar.com/avatar/6f6612e7a9c4a07411398b0674945358?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    终于搞明白了,但像inove这样一开始就这么快会不会吓倒老人家呢 :razz:

  34. http://1.gravatar.com/avatar/1ec4717231e96f16618449f9ebb32c5c?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    呵呵,抢地板!

  35. http://1.gravatar.com/avatar/d2c9d46de15aa63232114222c723d92f?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G
  36. http://0.gravatar.com/avatar/ee96af3312681bc85af88ec9ebb2d835?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    呵呵,挺好玩的說,剛剛也玩了幾次說!

  37. http://1.gravatar.com/avatar/78b0fd25b4aadfa50d9dde0ba2cc5d50?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    可以通过JavaScript做出描点间滑动的动态效果,mg12的这个模板我喜欢就是返回顶部那个效果,每次来都玩几次才走……囧…

  38. http://0.gravatar.com/avatar/274ff83bdc69442eb8e6d6038c38073a?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    google chrome 可以用。

  39. http://0.gravatar.com/avatar/06df4a7981e3e2d7639e7597da8723ee?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    请问下,我要是想做一个按钮,在一片文章比较长的时候实现回到页面中部的,改怎么实现?

  40. http://0.gravatar.com/avatar/4c99f519d8e5f05a1218201c1b146fee?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    这里每天都这么热闹。。。完全抢不上家具。。。

  41. http://0.gravatar.com/avatar/28cde55d9f5a12309b40e97e81da5866?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    @Rui
    没换,是不是你的浏览器没有完全载入或禁用了js?

  42. http://1.gravatar.com/avatar/bb05acb5b9b70b8886b356d190d3bb4a?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    mg把自己的换成不减速的了?

  43. http://1.gravatar.com/avatar/70a2291293cd289ae0573b6cdb7d791e?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    扒了你很多东西..特地跑来道谢...希望MG继续努力...让俺们有更多可以扒的东西哈..

  44. http://1.gravatar.com/avatar/70a2291293cd289ae0573b6cdb7d791e?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    呵呵...来晚了...

  45. http://0.gravatar.com/avatar/28cde55d9f5a12309b40e97e81da5866?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    @bruce
    可以自行替换,网上搜来的

  46. http://0.gravatar.com/avatar/e5732183e01a3a98f1512857e7aefd57?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    我是用 JQuery 的方法来实现滑动效果,不过你的代码简洁许多。 :smile:

  47. http://1.gravatar.com/avatar/d696b09801d1974bd9710026cf3ab669?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    mg12大嘎:为什么我的表情插件上面的小头像跟你的不一样的? :?:

  48. http://0.gravatar.com/avatar/ecf8a2c8e8707ba90044725f499caa31?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    呵呵,抢地板!

  49. http://0.gravatar.com/avatar/28cde55d9f5a12309b40e97e81da5866?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    大晚上的 都睡了?

  50. http://0.gravatar.com/avatar/28cde55d9f5a12309b40e97e81da5866?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    抢沙发啦,hoho,还是头一次哦 :grin:

Comment pages
  1. Loading...