用 Javascript 实现锚点(Anchor)间平滑跳转

作者: Cody Lindley     来源: ThickBox     时间: 2007-02-06 22:01:48
摘要: 锚点(Anchor)相信很多人都不陌生,它方便访问者在页面的不同位置快速跳转,直接找到自己感兴趣的内容,如果说 RSS 是整个网站的摘要,那锚点就是一个页面的摘要,通常一个页面内容很多的时候,都会用锚点来定位。

但是锚点也有个问题,通常点击锚点后,页面会立即跳到目标位置,而本文介绍的方法,实现了锚点(Anchor)间平滑跳转,效果非常不错。
归类: Javascript,

关键词: 平滑, 锚点, Anchor, 跳转, 滚动, javascript,


锚点(Anchor)相信很多人都不陌生,它方便访问者在页面的不同位置快速跳转,直接找到自己感兴趣的内容,如果说 RSS 是整个网站的摘要,那锚点就是一个页面的摘要,通常一个页面内容很多的时候,都会用锚点来定位。

但是锚点也有个问题,通常点击锚点后,页面会立即跳到目标位置,而本文介绍的方法,实现了锚点(Anchor)间平滑跳转,效果非常不错。


--------------------------------------------------------------
点此浏览示例文件
--------------------------------------------------------------


Javascript:
  1.  
  2. <script type="text/javascript">
  3.  
  4. // 说明 :用 Javascript 实现锚点(Anchor)间平滑跳转
  5. // 来源 :ThickBox 2.1
  6. // 整理 :Yanfu Xie [xieyanfu@yahoo.com.cn]
  7. // 网址 :http://www.codebit.cn
  8. // 日期 :07.01.17
  9.  
  10. // 转换为数字
  11. function intval(v)
  12. {
  13. v = parseInt(v);
  14. return isNaN(v) ? 0 : v;
  15. }
  16.  
  17. // 获取元素信息
  18. function getPos(e)
  19. {
  20. var l = 0;
  21. var t = 0;
  22. var w = intval(e.style.width);
  23. var h = intval(e.style.height);
  24. var wb = e.offsetWidth;
  25. var hb = e.offsetHeight;
  26. while (e.offsetParent){
  27. l += e.offsetLeft + (e.currentStyle?intval(e.currentStyle.borderLeftWidth):0);
  28. t += e.offsetTop + (e.currentStyle?intval(e.currentStyle.borderTopWidth):0);
  29. e = e.offsetParent;
  30. }
  31. l += e.offsetLeft + (e.currentStyle?intval(e.currentStyle.borderLeftWidth):0);
  32. t += e.offsetTop + (e.currentStyle?intval(e.currentStyle.borderTopWidth):0);
  33. return {x:l, y:t, w:w, h:h, wb:wb, hb:hb};
  34. }
  35.  
  36. // 获取滚动条信息
  37. function getScroll()
  38. {
  39. var t, l, w, h;
  40. if (document.documentElement && document.documentElement.scrollTop) {
  41. t = document.documentElement.scrollTop;
  42. l = document.documentElement.scrollLeft;
  43. w = document.documentElement.scrollWidth;
  44. h = document.documentElement.scrollHeight;
  45. } else if (document.body) {
  46. t = document.body.scrollTop;
  47. l = document.body.scrollLeft;
  48. w = document.body.scrollWidth;
  49. h = document.body.scrollHeight;
  50. }
  51. return { t: t, l: l, w: w, h: h };
  52. }
  53.  
  54. // 锚点(Anchor)间平滑跳转
  55. function scroller(el, duration)
  56. {
  57. if(typeof el != 'object') { el = document.getElementById(el); }
  58.  
  59. if(!el) return;
  60.  
  61. var z = this;
  62. z.el = el;
  63. z.p = getPos(el);
  64. z.s = getScroll();
  65. z.clear = function(){window.clearInterval(z.timer);z.timer=null};
  66. z.t=(new Date).getTime();
  67.  
  68. z.step = function(){
  69. var t = (new Date).getTime();
  70. var p = (t - z.t) / duration;
  71. if (t >= duration + z.t) {
  72. z.clear();
  73. window.setTimeout(function(){z.scroll(z.p.y, z.p.x)},13);
  74. } else {
  75. st = ((-Math.cos(p*Math.PI)/2) + 0.5) * (z.p.y-z.s.t) + z.s.t;
  76. sl = ((-Math.cos(p*Math.PI)/2) + 0.5) * (z.p.x-z.s.l) + z.s.l;
  77. z.scroll(st, sl);
  78. }
  79. };
  80. z.scroll = function (t, l){window.scrollTo(l, t)};
  81. z.timer = window.setInterval(function(){z.step();},13);
  82. }
  83.  
  84. </script>
  85.  



调用方式:
Code:

scroller(el, duration)

el : 目标锚点 ID
duration : 持续时间,以毫秒为单位,越小越快




HTML:
  1.  
  2. <style type="text/css">
  3. div.test {
  4. width:400px;
  5. margin:5px auto;
  6. border:1px solid #ccc;
  7. }
  8. div.test strong {
  9. font-size:16px;
  10. background:#fff;
  11. border-bottom:1px solid #aaa;
  12. margin:0;
  13. display:block;
  14. padding:5px 0;
  15. text-decoration:underline;
  16. color:#059B9A;
  17. cursor:pointer;
  18. }
  19. div.test p {
  20. height:400px;
  21. background:#f1f1f1;
  22. margin:0;
  23. }
  24.  
  25. </style>
  26.  
  27. <div class="test">
  28. <a name="header_1" id="header_1"></a>
  29. <strong onclick="javascript:scroller('header_4', 800);">header_1 --> header_4</strong>
  30. <p></p>
  31. </div>
  32.  
  33. <div class="test">
  34. <a name="header_2" id="header_2"></a>
  35. <strong onclick="javascript:scroller('header_5', 800);">header_2 --> header_5</strong>
  36. <p></p>
  37. </div>
  38.  
  39. <div class="test">
  40. <a name="header_3" id="header_3"></a>
  41. <strong onclick="javascript:scroller('header_6', 800);">header_3 --> header_6</strong>
  42. <p></p>
  43. </div>
  44.  
  45. <div class="test">
  46. <a name="header_4" id="header_4"></a>
  47. <strong onclick="javascript:scroller('header_7', 800);">header_4 --> header_7</strong>
  48. <p></p>
  49. </div>
  50.  
  51. <div class="test">
  52. <a name="header_5" id="header_5"></a>
  53. <strong onclick="javascript:scroller('header_3', 800);">header_5 --> header_3</strong>
  54. <p></p>
  55. </div>
  56.  
  57. <div class="test">
  58. <a name="header_6" id="header_6"></a>
  59. <strong onclick="javascript:scroller('header_2', 800);">header_6 --> header_2</strong>
  60. <p></p>
  61. </div>
  62.  
  63. <div class="test">
  64. <a name="header_7" id="header_7"></a>
  65. <strong onclick="javascript:scroller('header_1', 800);">header_7 --> header_1</strong>
  66. <p></p>
  67. </div>
  68.  



推荐链接:(联系 QQ :326801485)