Web頁面的定位,據我所知,有三種:一、錨點定位;二、通過js的window.scroll(x,y)或window.scrollTo(x,y);三、通過js的window.scrollBy(x,y)。
錨點定位,缺點: 定位不准確,而且有兼容性問題。
所以,大多數情況下用第二種或第三種方法。
注:以下兩種方法的代碼均可以直接使用,不依賴於任何第三方庫或框架。
下面分析下第二種方法的實現原理:
核心:window對象的兩個屬性:scrollTop, offsetTop。
看下這兩個屬性的區別:

該圖片引自:http://blog.csdn.net/fswan/article/details/17238933
scrollTop: 對象的最頂部到對象在當前窗口顯示的局限內的頂邊的間隔(對象被卷去的高度)。
document.body.scrollTop:網頁被卷去的高。
offsetTop:當前對象到其上級層頂部的間隔。
/* 此段代碼是從NEJ框架的源碼中抽取出來,並經過稍加修改得到的 */ /*注: NEJ框架 是網易公司的前端基礎框架,作者:蔡劍飛,網易前端資深工程師,網易前端專家委員會主任*/
_$offset = (function(){
var _isRoot = function(_element){
return _element==document.body||
_element==document.documentElement;
};
return function(_from,_to){
_from = document.getElementById(_from);
if (!_from){
return null;
}
_to = document.getElementById (_to)||null;
var _node = _from,
_result = {x:0,y:0},
_isroot,_delta,_border;
_$getStyle = function(_element,_name){
_element = _p._$get(_element);
return !_element ? '' :
_h.__getStyleValue(
_element,_name
);
};
while(!!_node&&_node!=_to){
_isroot = _isRoot(_node)||_node==_from;
_delta = _isroot?0:_node.scrollLeft;
_border = parseInt(_p._$getStyle(_node,'borderLeftWidth'))||0;
_result.x += _node.offsetLeft+_border-_delta;
_delta = _isroot?0:_node.scrollTop;
_border = parseInt(_p._$getStyle(_node,'borderTopWidth'))||0;
_result.y += _node.offsetTop+_border-_delta;
_node = _node.offsetParent;
}
return _result;
};
})();
|
第三種方法:

代碼
/* 此段代碼是 我同學從網上找來的,如果作者看到這篇文章,請聯系我,我會把作者的博客地址 加在這里。 */
function elementPosition(obj) {
var curleft = 0, curtop = 0;
if (obj.offsetParent) {
curleft = obj.offsetLeft;
curtop = obj.offsetTop;
while (obj = obj.offsetParent) {
curleft += obj.offsetLeft;
curtop += obj.offsetTop;
}
}
return { x: curleft, y: curtop };
}
function ScrollToControl(id){
var elem = document.getElementById(id);
var scrollPos = elementPosition(elem).y;
scrollPos = scrollPos - document.documentElement.scrollTop;
var remainder = scrollPos % 50;
var repeatTimes = (scrollPos - remainder) / 50;
ScrollSmoothly(scrollPos,repeatTimes);
window.scrollBy(0,remainder);
}
var repeatCount = 0;
var cTimeout;
var timeoutIntervals = new Array();
var timeoutIntervalSpeed;
function ScrollSmoothly(scrollPos,repeatTimes){
if(repeatCount < repeatTimes){
window.scrollBy(0,50);
}
else{
repeatCount = 0;
clearTimeout(cTimeout);
return;
}
repeatCount++;
cTimeout = setTimeout("ScrollSmoothly('" + scrollPos + "','"+ repeatTimes +"')",25);
}
|
ps: 運行 window.scroll(0,0); 即可實現返回頁首的功能。