jQuery scrollFix滚动定位插件
当用户向上或向下滚动页面到一定位置时,目标元素开始固定定位(position:fixed),当回滚到原位置时目标元素恢复到原状态,可以定制触发滚动相对屏幕位置和触发滚动方向,兼容IE6
【插件参数】
$(".target_element").scrollFix(["top"|"bottom"|length(可以为负,表示相对bottom),["top"|"bottom"]]);
第一个参数:可选,默认为"top",当目标元素到了屏幕相对的位置时开始触发固定,可以填一个数值,如100,-200,负值表示相对于屏幕下方
第一个参数:可选,默认为"top",表示触发固定的滚动方向,"top"表示从上向下滚动时触发,"bottom"表示从下向上滚动时触发
【下载插件】scrollFix(jb51.net).rar
<scripttype="text/javascript"src="jquery-1.7.2.min.js"></script>
<scripttype="text/javascript"src="scrollFix.js"></script>
<p><spanstyle="color:#808000;">【代码示例】</span></p>
<divclass="d">
<divclass="demo"style="background:#ff6000;">$("#a").scrollFix(-200);
<div>滚动到距离下面200px时开始固定,默认从上到下触发</div>
</div>
</div>
<divclass="d">
<divclass="demo"style="background:#82BF00;">$("#b").scrollFix(200,"bottom");
<div>滚动到距离上面200px时开始固定,指定"bottom"从下到上触发</div>
</div>
</div>
<divclass="d">
<divclass="demo"style="background:#0C9CAE;">$("#c").scrollFix("top","top");
<div>滚动到距离上面0时开始固定,指定"top"从上到下触发</div>
</div>
</div>
<divclass="d">
<divclass="demo"style="background:#478FCE;">$("#d").scrollFix("bottom","top");
<div>滚动到距离下面0时开始固定,指定"bottom"从下到上触发</div>
</div>
</div>
实现代码:
<scripttype="text/javascript">//<![CDATA[
window.onload=function(){
$(".demo:eq(0)").scrollFix(-200);
$(".demo:eq(1)").scrollFix(200,"bottom");
$(".demo:eq(2)").scrollFix("top","top");
$(".demo:eq(3)").scrollFix("bottom","bottom");
}
//]]></script>
核心代码:
;(function($){
jQuery.fn.scrollFix=function(height,dir){
height=height||0;
height=height=="top"?0:height;
returnthis.each(function(){
if(height=="bottom"){
height=document.documentElement.clientHeight-this.scrollHeight;
}elseif(height<0){
height=document.documentElement.clientHeight-this.scrollHeight+height;
}
varthat=$(this),
oldHeight=false,
p,r,l=that.offset().left;
dir=dir=="bottom"?dir:"top";//默认滚动方向向下
if(window.XMLHttpRequest){//非ie6用fixed
functiongetHeight(){//>=0表示上面的滚动高度大于等于目标高度
return(document.documentElement.scrollTop||document.body.scrollTop)+height-that.offset().top;
}
$(window).scroll(function(){
if(oldHeight===false){
if((getHeight()>=0&&dir=="top")||(getHeight()<=0&&dir=="bottom")){
oldHeight=that.offset().top-height;
that.css({
position:"fixed",
top:height,
left:l
});
}
}else{
if(dir=="top"&&(document.documentElement.scrollTop||document.body.scrollTop)<oldHeight){
that.css({
position:"static"
});
oldHeight=false;
}elseif(dir=="bottom"&&(document.documentElement.scrollTop||document.body.scrollTop)>oldHeight){
that.css({
position:"static"
});
oldHeight=false;
}
}
});
}else{//forie6
$(window).scroll(function(){
if(oldHeight===false){//恢复前只执行一次,减少reflow
if((getHeight()>=0&&dir=="top")||(getHeight()<=0&&dir=="bottom")){
oldHeight=that.offset().top-height;
r=document.createElement("span");
p=that[0].parentNode;
p.replaceChild(r,that[0]);
document.body.appendChild(that[0]);
that[0].style.position="absolute";
}
}elseif((dir=="top"&&(document.documentElement.scrollTop||document.body.scrollTop)<oldHeight)||(dir=="bottom"&&(document.documentElement.scrollTop||document.body.scrollTop)>oldHeight)){//结束
that[0].style.position="static";
p.replaceChild(that[0],r);
r=null;
oldHeight=false;
}else{//滚动
that.css({
left:l,
top:height+document.documentElement.scrollTop
})
}
});
}
});
};
})(jQuery);