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


Posted in Javascript onDecember 24, 2008
<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>
Javascript 相关文章推荐
一些常用的Javascript函数
Dec 22 Javascript
checkbox全选/取消全选以及checkbox遍历jQuery实现代码
Dec 02 Javascript
JS+DIV实现鼠标划过切换层效果的实例代码
Nov 26 Javascript
js实现点击按钮后给Div图层设置随机背景颜色的方法
May 06 Javascript
全面解析Bootstrap表单使用方法(表单按钮)
Nov 24 Javascript
AngularJS入门心得之directive和controller通信过程
Jan 25 Javascript
JavaScript的React Web库的理念剖析及基础上手指南
May 10 Javascript
jQuery对checkbox 复选框的全选全不选反选的操作
Aug 09 Javascript
vue绑定的点击事件阻止冒泡的实例
Feb 08 Javascript
vue实现直播间点赞飘心效果的示例代码
Sep 20 Javascript
原生JS实现顶部导航栏显示按钮+搜索框功能
Dec 25 Javascript
prettier自动格式化去换行的实现代码
Aug 25 Javascript
javascript 网页跳转的方法
Dec 24 #Javascript
javascript prototype,executing,context,closure
Dec 24 #Javascript
JavaScript 事件参考手册
Dec 24 #Javascript
javascript XML数据显示为HTML一例
Dec 23 #Javascript
window.location和document.location的区别分析
Dec 23 #Javascript
javascript 硬盘序列号+其它硬件信息
Dec 23 #Javascript
js 解决“options为空或不是对象”
Dec 22 #Javascript
You might like
PHP开发微信支付的代码分享
2014/05/25 PHP
php实现源代码加密的方法
2015/07/11 PHP
PHP设置images目录不充许http访问的方法
2016/11/01 PHP
Laravel接收前端ajax传来的数据的实例代码
2017/07/20 PHP
yii2.0整合阿里云oss删除单个文件的方法
2017/09/19 PHP
TP5.0框架实现无限极回复功能的方法分析
2019/05/04 PHP
PHP创建对象的六种方式实例总结
2019/06/27 PHP
YUI 读码日记之 YAHOO.util.Dom - Part.1
2008/03/22 Javascript
jQuery学习笔记之jQuery的动画
2010/12/22 Javascript
js中将具有数字属性名的对象转换为数组
2011/03/06 Javascript
5种处理js跨域问题方法汇总
2014/12/04 Javascript
bootstrap-wysiwyg结合ajax实现图片上传实时刷新功能
2016/05/27 Javascript
jquery mobile界面数据刷新的实现方法
2016/05/28 Javascript
jQuery扩展实现text提示还能输入多少字节的方法
2016/11/28 Javascript
ES6中Generator与异步操作实例分析
2017/03/31 Javascript
从源码看angular/material2 中 dialog模块的实现方法
2017/10/18 Javascript
vue配置多页面的实现方法
2018/05/22 Javascript
Vue 获取数组键名的方法
2018/06/21 Javascript
100行代码实现一个vue分页组功能
2018/11/06 Javascript
jquery 验证用户名是否重复代码实例
2019/05/14 jQuery
vuex+axios+element-ui实现页面请求loading操作示例
2020/02/02 Javascript
[46:20]CHAOS vs Alliacne 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
从零学python系列之数据处理编程实例(一)
2014/05/22 Python
python基于socket实现网络广播的方法
2015/04/29 Python
Python实现模拟时钟代码推荐
2015/11/08 Python
浅谈pytorch grad_fn以及权重梯度不更新的问题
2019/08/20 Python
HTML5 video进入全屏和退出全屏的实现方法
2020/07/28 HTML / CSS
Nike比利时官网:Nike.com (BE)
2019/02/07 全球购物
物业经理求职自我评价
2013/09/22 职场文书
计算机大学生的自我评价
2013/10/15 职场文书
企业贷款委托书格式
2014/09/12 职场文书
企业与个人合作经营协议书
2014/11/01 职场文书
学校通报表扬范文
2015/05/04 职场文书
公司人事管理制度
2015/08/05 职场文书
基于HTML十秒做出淘宝页面
2021/10/24 HTML / CSS
使用Docker容器部署rocketmq单机的全过程
2022/04/03 Servers