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


Posted in Javascript onSeptember 08, 2009

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

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

<script type="text/javascript"> 
// 说明 :用 Javascript 实现锚点(Anchor)间平滑跳转 
// 来源 :ThickBox 2.1 
// 整理 :Yanfu Xie [xieyanfu@yahoo.com.cn] 
// 日期 :07.01.17 
// 转换为数字 
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)}; 
z.timer = window.setInterval(function(){z.step();},13); 
} 
</script>

调用方式:

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

HTML:
<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> 
<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>

测试代码:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="content-type" content="text/html; charset=gb2312" /> 
<meta name="keywords" content="平滑, 锚点, Anchor, 跳转, 滚动, javascript, " /> 
<meta name="description" content="锚点(Anchor)相信很多人都不陌生,它方便访问者在页面的不同位置快速跳转,直接找到自己感兴趣的内容,如果说 RSS 是整个网站的摘要,那锚点就是一个页面的摘要,通常一个页面内容很多的时候,都会用锚点来定位。" /> 
<title>用 Javascript 实现锚点(Anchor)间平滑跳转 - 平滑, 锚点, Anchor, 跳转, 滚动, javascript, </title> <link rel="stylesheet" href="/admin/tpl/default/css/pub_example.css" type="text/css" /> 
</head> 
<body> 
<div class="ad"> 
</div> 
<br /> 
<div id="example"> 
    <h3 id="example_title">用 Javascript 实现锚点(Anchor)间平滑跳转</h3> 
    <div id="example_main"> 

<!--************************************* 实例代码开始 *************************************--> 
<script type="text/javascript"> 
// 说明 :用 Javascript 实现锚点(Anchor)间平滑跳转 
// 来源 :ThickBox 2.1 
// 整理 :Yanfu Xie [xieyanfu@yahoo.com.cn] 
// 日期 :07.01.17 
// 转换为数字 
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)}; 
    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> 
<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> 
<!--************************************* 实例代码结束 *************************************--> 

    </div> 
    <div id="back"><a href="https://3water.com">返回 首页</a></div> 
</div> 
<br /> 
<div class="ad"> 
</div> 
</body> 
</html>
Javascript 相关文章推荐
检测jQuery.js是否已加载的判断代码
May 20 Javascript
javascript验证上传文件的类型限制必须为某些格式
Nov 14 Javascript
8个超实用的jQuery功能代码分享
Jan 08 Javascript
JS for循环中i++ 和 ++i的区别介绍
Jul 20 Javascript
javascript构造函数以及原型对象的理解
Jan 13 Javascript
node.js实现登录注册页面
Apr 08 Javascript
javascript 跨域问题以及解决办法
Jul 17 Javascript
JavaScript 通过Ajax 动态加载CheckBox复选框
Aug 31 Javascript
微信小程序富文本渲染引擎的详解
Sep 30 Javascript
JavaScript中关于base64的一些事
May 06 Javascript
解决vue单页面修改样式无法覆盖问题
Aug 05 Javascript
前端开发之便利店收银系统代码
Dec 27 Javascript
用 Javascript 验证表单(form)中的单选(radio)值
Sep 08 #Javascript
用 Javascript 验证表单(form)中多选框(checkbox)值
Sep 08 #Javascript
Javascript String.replace的妙用
Sep 08 #Javascript
Javascript 检测、添加、移除样式(className)函数代码
Sep 08 #Javascript
javascript 流畅动画实现原理
Sep 08 #Javascript
javascript 定义初始化数组函数
Sep 07 #Javascript
javascript十个最常用的自定义函数(中文版)
Sep 07 #Javascript
You might like
PHP 图片上传代码
2011/09/13 PHP
php正则表达匹配中文问题分析小结
2012/03/25 PHP
PHP实现数字补零功能的2个函数介绍
2014/05/12 PHP
php获取用户浏览器版本的方法
2015/01/03 PHP
php生成带logo二维码方法小结
2016/04/08 PHP
CentOS下搭建PHP环境与WordPress博客程序的全流程总结
2016/05/07 PHP
php使用Jpgraph创建折线图效果示例
2017/02/15 PHP
PHP新特性详解之命名空间、性状与生成器
2017/07/18 PHP
ASP Json Parser修正版
2009/12/06 Javascript
Javascript 面向对象(二)封装代码
2012/05/23 Javascript
通过jQuery源码学习javascript(一)
2012/12/27 Javascript
node.js下when.js 的异步编程实践
2014/12/03 Javascript
javascript验证邮件地址和MX记录的方法
2015/06/16 Javascript
深入解析JavaScript中的arguments对象
2016/06/12 Javascript
JS实现全屏的四种写法
2016/12/30 Javascript
Node.JS中事件轮询(Event Loop)的解析
2017/02/25 Javascript
浅谈js-FCC算法Friendly Date Ranges(详解)
2017/04/10 Javascript
JS ES6中setTimeout函数的执行上下文示例
2017/04/27 Javascript
js封装成插件_Canvas统计图插件编写实例
2017/09/12 Javascript
基于vue.js 2.x的虚拟滚动条的示例代码
2018/01/23 Javascript
基于Three.js实现360度全景图片
2018/12/30 Javascript
浅谈express.js框架中间件(middleware)
2019/04/07 Javascript
ES6 Generator函数的应用实例分析
2019/06/26 Javascript
python如何在终端里面显示一张图片
2016/08/17 Python
windows下安装Python的XlsxWriter模块方法
2018/05/03 Python
python3 写一个WAV音频文件播放器的代码
2019/09/27 Python
python中删除某个元素的方法解析
2019/11/05 Python
Python变量及数据类型用法原理汇总
2020/08/06 Python
英国领先的狗和宠物美容专家:Christies Direct
2017/04/03 全球购物
反腐倡廉演讲稿
2014/05/22 职场文书
关于运动会广播稿300字
2014/10/05 职场文书
工作证明书
2015/06/15 职场文书
自信主题班会
2015/08/14 职场文书
2016个人先进事迹材料范文
2016/03/01 职场文书
纯html+css实现Element loading效果
2021/08/02 HTML / CSS
在js中修改html body的样式
2021/11/11 Javascript