javascript 动态数据下的锚点错位问题解决方法

所属分类: 网络编程 / JavaScript 阅读数: 835
收藏 0 赞 0 分享
复制代码 代码如下:

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
  <title>用 Javascript 实现锚点(Anchor)间平滑跳转</title>
  <script language="javascript">
  // 说明 :用 Javascript 实现锚点(Anchor)间平滑跳转
  
  // 转换为数字
  function intval(v)
  {  
  v = parseInt(v);  
  return isNaN(v) ? 0 : v;
  } 
  // 获取元素信息
  function getPos(e)
  {  
  var l = 0;  
  var t = 0;  
  var w = intval(e.style.width);  
  var h = intval(e.style.height);  
  var wb = e.offsetWidth;  
  var hb = e.offsetHeight;  
  while (e.offsetParent)
  {    
   l += e.offsetLeft + (e.currentStyle?intval(e.currentStyle.borderLeftWidth):0);    
   t += e.offsetTop + (e.currentStyle?intval(e.currentStyle.borderTopWidth):0);    
   e = e.offsetParent;  
   }  
   l += e.offsetLeft + (e.currentStyle?intval(e.currentStyle.borderLeftWidth):0);  
   t += e.offsetTop + (e.currentStyle?intval(e.currentStyle.borderTopWidth):0);  
   return {x:l, y:t, w:w, h:h, wb:wb, hb:hb}; } 
   // 获取滚动条信息
   function getScroll() 
   {  
   var t, l, w, h;     
   if (document.documentElement && document.documentElement.scrollTop)
   {    
   t = document.documentElement.scrollTop;    
   l = document.documentElement.scrollLeft;    
   w = document.documentElement.scrollWidth;    
   h = document.documentElement.scrollHeight;  
   }
   else if (document.body)
   {    
   t = document.body.scrollTop;    
   l = document.body.scrollLeft;    
   w = document.body.scrollWidth;    
   h = document.body.scrollHeight;  
   }  
   return { t: t, l: l, w: w, h: h };
   } 
   // 锚点(Anchor)间平滑跳转
   function scroller(el, duration)
   {  
   if(typeof el != 'object')
   {
   el = document.getElementById(el);
   }   
   if(!el) return;   
   var z = this;  
   z.el = el;  
   z.p = getPos(el);  
   z.s = getScroll();  
   z.clear = function()
   {
   window.clearInterval(z.timer);z.timer=null
   };  
   z.t=(new Date).getTime();   
   z.step = function()
   {    
   var t = (new Date).getTime();    
   var p = (t - z.t) / duration;    
   if (t >= duration + z.t)
   {      
   z.clear();      
   window.setTimeout(function(){z.scroll(z.p.y, z.p.x)},13);     }
   else {      
   st = ((-Math.cos(p*Math.PI)/2) + 0.5) * (z.p.y-z.s.t) + z.s.t;      
   sl = ((-Math.cos(p*Math.PI)/2) + 0.5) * (z.p.x-z.s.l) + z.s.l;      
   z.scroll(st, sl);    
   }  
   };  
   z.scroll = function (t, l){window.scrollTo(l, t-20)};  
   z.timer = window.setInterval(function(){z.step();},13);
   }
  </script>
  <style type="text/css">
  div.test
  {  
  width:400px;   margin:5px auto;   border:1px solid #ccc;
  }
  div.test strong
  {   font-size:16px;   background:#fff;   border-bottom:1px solid #aaa;   margin:0;   display:block;   padding:5px 0;   text-decoration:underline;   color:#059B9A;   cursor:pointer; } div.test p {   height:400px;   background:#f1f1f1;   margin:0;
  }
   </style>
</head>
<body>
  <form id="form1" runat="server">
  <div class="test">  
  <a name="header_1" id="header_1"></a>  
  <strong onclick="javascript:scroller('header_4', 800);">header_1 --> header_4</strong><p></p>
  </div> 
  <div class="test">  
  <a name="header_2" id="header_2"></a>  
  <strong onclick="javascript:scroller('header_5', 800);">header_2 --> header_5</strong><p></p>
  </div> 
  <div class="test">  
  <a name="header_3" id="header_3"></a>  
  <strong onclick="javascript:scroller('header_6', 800);">header_3 --> header_6</strong><p></p>
  </div> 
  <div class="test">  
  <a name="header_4" id="header_4"></a>  
  <strong onclick="javascript:scroller('header_7', 800);">header_4 --> header_7</strong><p></p>
  </div> 
  <div class="test">  
  <a name="header_5" id="header_5"></a>  
  <strong onclick="javascript:scroller('header_3', 800);">header_5 --> header_3</strong><p></p>
  </div> 
  <div class="test">  
  <a name="header_6" id="header_6"></a>  
  <strong onclick="javascript:scroller('header_2', 800);">header_6 --> header_2</strong><p></p>
  </div> 
  <div class="test">  
  <a name="header_7" id="header_7"></a>  
  <strong onclick="javascript:scroller('header_1', 800);">header_7 --> header_1</strong><p></p>
  </div>
  </form>
</body>
</html>
更多精彩内容其他人还在看

Angular使用Md5加密的解决方法

这篇文章主要介绍了Angular使用Md5加密的解决方法,需要的朋友可以参考下
收藏 0 赞 0 分享

详解JS构造函数中this和return

本文通过实例代码给大家介绍了JS构造函数中this和return,需要的朋友参考下吧
收藏 0 赞 0 分享

ES6中Array.find()和findIndex()函数的用法详解

ES6为Array增加了find(),findIndex函数。find()函数用来查找目标元素,找到就返回该元素,找不到返回undefined,而findIndex()函数也是查找目标元素,找到就返回元素的位置,找不到就返回-1。下面通过实例详解,需要的朋友参考下吧
收藏 0 赞 0 分享

JS闭包的几种常见形式实例详解

本文通过实例代码给大家详细介绍了js闭包的几种常见形式,代码简单易懂,非常不错,具有参考借鉴价值,需要的朋友参考下
收藏 0 赞 0 分享

ES6中Array.copyWithin()函数的用法实例详解

ES6为Array增加了copyWithin函数,用于操作当前数组自身,用来把某些个位置的元素复制并覆盖到其他位置上去。下面重点给大家介绍ES6中Array.copyWithin()函数的用法,需要的朋友参考下
收藏 0 赞 0 分享

Javascript 严格模式use strict详解

严格模式:由ECMA-262规范定义的JavaScript标准,对javascrip的限制更强。这篇文章主要介绍了Javascript 严格模式use strict详解 ,需要的朋友可以参考下
收藏 0 赞 0 分享

引入JavaScript时alert弹出框显示中文乱码问题

今天在HTML中引入JavaScript文件运行时,alert弹出的提示框中文显示为乱码,怎么解决此问题呢?下面小编给大家带来了引入JavaScript时alert弹出框显示中文乱码问题的解决方法,一起看看吧
收藏 0 赞 0 分享

AngularJs 延时器、计时器实例代码

这篇文章主要介绍了AngularJs 延时器、计时器实例代码,需要的朋友可以参考下
收藏 0 赞 0 分享

JS分页的实现(同步与异步)

这篇文章主要介绍了JS分页的实现(同步与异步),需要的朋友可以参考下
收藏 0 赞 0 分享

Angularjs自定义指令实现分页插件(DEMO)

由于最近的一个项目使用的是angularjs1.0的版本,涉及到分页查询数据的功能,后来自己就用自定义指令实现了该功能,下面小编把实例demo分享到脚本之家平台,需要的朋友参考下
收藏 0 赞 0 分享
查看更多