jquery跟随屏幕滚动代码

王朝学院·作者佚名  2016-04-29
窄屏简体版  字體: 小  |  中  |  大  |  超大  

我们在很多网站看到,当我们滚动网页时,网页内的广告或某个小区域并不会消失,而是浮动在屏幕的某个地方,特别是一些局域广告。那么这是怎么实现的呢?本文将引用乌徒帮的跟随屏幕滚动代码,对此效果做详解。

一、原始代码

下面是乌徒帮的跟随屏幕滚动代码,它的作用域为网页两侧的边栏,以及双击屏幕后的右侧隐藏栏。

var $catalogueOffsetTop = $('aside#catalogue').offset().top;

var $archiveOffestTop = $('aside#archive').offset().top;

var $archiveOffestLeft = $('aside#archive').offset().left;

$(window).bind('scroll resize',function(){

// #right-area的跟随屏幕滚动效果

if($('#right-area').height() <= $(window).height()){

$('#right-area').stop(true,true).animate({'top': $(document).scrollTop() + 'px'},800);

}else if($('#right-area').height() > $(window).height() && $('#right-area').height() < $(document).height()){

// 这段范围内是最关键的,允许滑动

if(($(document).scrollTop() + $(window).height()) <= $('#right-area').height()){

$('#right-area').stop(true,true).CSS('top','0');

}else if(($(document).scrollTop() + $(window).height()) < $(document).height()){

$right_top = $(document).scrollTop() + $(window).height() - $('#right-area').height();

$('#right-area').stop(true,true).animate({'top': $right_top + 'px'},800);

}else{

$right_top = $(document).height() - $('#right-area').height();

$('#right-area').stop(true,true).css({'top': $right_top + 'px'});

//alert($(document).scrollTop() + $(window).height() - $(document).height());

}

}else if($('#right-area').height() >= $(document).height()){

$('#right-area').height($(document).height()).stop(true,true).css({'overflow':'hidden','overflow-y':'scroll'});

}

if($(document).scrollLeft() == 0){ // 只有在屏幕处于左侧的时候才进行下面的跟随滚动,同时需要注意下面的if($(window).width() > 1024),是为了防止在小屏幕下还发生这种变化

// aside#catalogue的上下滑动

if($('aside#catalogue').outerHeight() < $(window).height()){

if($(document).scrollTop() <= $catalogueOffsetTop){

$('aside#catalogue').css({'position':'static','top':$catalogueOffsetTop});

if($(window).width() > 1024)$('#main').css({'padding-left':'0'});

}else{

$('aside#catalogue').css({'position':'fixed','top':'0'});

if($(window).width() > 1024)$('#main').css({'padding-left':$('aside#catalogue').outerWidth() + 5 + 'px'});

}

}else if($('aside#catalogue').height() >= $(window).height() && $('aside#catalogue').outerHeight() < ($('footer').offset().top - $catalogueOffsetTop)){

if(($(document).scrollTop() + $(window).height()) <= ($('aside#catalogue').outerHeight() + $catalogueOffsetTop)){

$('aside#catalogue').css({'position':'static','top':$catalogueOffsetTop});

if($(window).width() > 1024)$('#main').css({'padding-left':'0'});

}else if(($(document).scrollTop() + $(window).height()) < $('footer').offset().top){

$catalogue_top = $(window).height() - $('aside#catalogue').outerHeight() - 20;

$('aside#catalogue').css({'position':'fixed','top': $catalogue_top + 'px'});

if($(window).width() > 1024)$('#main').css({'padding-left':$('aside#catalogue').outerWidth() + 5 + 'px'});

}else{

$catalogue_top = $(window).height() - $('aside#catalogue').outerHeight() - 20 - ($(document).height() - $('footer').offset().top);

$('aside#catalogue').css({'position':'fixed','top':$catalogue_top + 'px'});

if($(window).width() > 1024)$('#main').css({'padding-left':$('aside#catalogue').outerWidth() + 5 + 'px'});

}

}

// aside#archive的上下滑动

if($('aside#archive').outerHeight() < $(window).height()){

if($(document).scrollTop() <= $archiveOffestTop){

$('aside#archive').css({'position':'static','top':$archiveOffestTop,'left':$archiveOffestLeft + 'px'});

}else{

$('aside#archive').css({'position':'fixed','top':'0','left':$archiveOffestLeft + 'px'});

}

}else if($('aside#archive').height() >= $(window).height() && $('aside#archive').outerHeight() < ($('footer').offset().top - $archiveOffestTop)){

if(($(document).scrollTop() + $(window).height()) <= ($('aside#archive').outerHeight() + $archiveOffestTop)){

$('aside#archive').css({'position':'static','top':$archiveOffestTop,'left':$archiveOffestLeft + 'px'});

}else if(($(document).scrollTop() + $(window).height()) < $('footer').offset().top){

$catalogue_top = $(window).height() - $('aside#archive').outerHeight();

$('aside#archive').css({'position':'fixed','top': $catalogue_top + 'px','left':$archiveOffestLeft + 'px'});

}else{

$catalogue_top = $(window).height() - $('aside#archive').outerHeight() - ($(document).height() - $('footer').offset().top);

$('aside#archive').css({'position':'fixed','top':$catalogue_top + 'px','left':$archiveOffestLeft + 'px'});

}

}

}else{ // 如果屏幕不处于左侧,就让这两个跟随归位

$('aside#catalogue').css({'position':'static','top':$catalogueOffsetTop});

$('#main').css({'padding-left':'0'});

$('aside#archive').css({'position':'static','top':$archiveOffestTop,'left':$archiveOffestLeft + 'px'});

}

}).scroll().resize();

网络上有很多相关的代码,更有7行代码解决此问题的方法,甚至还有通用性的插件来实现此效果。然而它们都太过普遍化,对于不同的网站,特殊性不同,在一些细节上要做更多的考虑。

二、选择用什么方式跟随屏幕滚动

方案有三种:

1、使用position:absolute;然后对top值进行动态赋值;

2、使用position:fixed;然后对top值进行动态赋值;

3、对padding-top或margin-top进行动态赋值;

前两种都是用到了postion对元素的位置进行安排,和float一样,position将元素从正常的文本流中拖出来。而padding或margin的方法则是控制元素的边距来实现。到底哪一种好呢?

使用position:absolute;会出现滚动时发生抖动(火狐中不会) ,使用padding-top时会让有背景的元素看上去难看,也会发生抖动,使用position:fixed不支持IE6,使用margin-top没有尝试过,应该会发生抖动。本段代码选择的是position:fixed,唯一不发生抖动的方案,但是在IE6下不会有该效果。

三、要考虑的情况

之所以要将本站的代码拿出来讲解,是因为网上的代码没有具体分析,很多问题都没有考虑到。

1、要跟随的元素的高度和屏幕的高度进行比较

网上所有的代码考虑的是该区域的高度小于窗口高度的情况,因此代码很简单。当区域高度等于和大于窗口高度时,我们又会有新的考虑。

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航