利用jQuery srollTop()函数实现类似锚点的定位效果-兼容chrome,firefox,IE,safari

如题。

         在网页开发的过程中,锚点可以实现页面快速定位。

         《1》

         常见的情况,是同一个页面内导航和锚点的配合,但是跳转时是直接切换,效果生硬。

         《2》

          不同页面间的跳转,涉及到跳转后定位到设定的页面的锚点,可以使用URL传参实现。具体实现方法如下:

          在导航栏中设定好跳转到的页面的链接,”#“后面就是我们在A.html中预先定义好的锚点的"name"属性。注意,涉及到锚点兼容性的问题,所以,锚点的命名应该是"id"与”name“都定义,且值相同:                  

<a href="A.html#anchor"></a>
          《3》       

          在实际情况中,我遇到更多的情况是如下图所示的页面结构:

          在父级页面A.html中存在导航条,页面内嵌套了一个iframe。当用户点击导航栏中的导航按钮时,会改变iframe的src属性同时刷新iframe的内页,定位到在内页中已经预先定好的锚点位置中去。

          一开始,我使用锚点来实现这个功能,在chrome、safari及各个国内的套壳浏览器中均可以实现这个功能。但是到了firefox及IE下面,这个功能就失效了。通过分析,在firefox中,firefox禁止在iframe中进行锚点的切换。网上有解决这个问题的js现成代码,基本的思想是获取锚点距离显示器顶部高度,通过Jquery的scrollTo方法滑动到对应的位置上去。参考的链接:http://blog.csdn.net/zlxzlxzlxzlxzlx/article/details/8504571

          经过这篇文章以及高手同学的教导,我们可以通过js来模拟锚点穿越iframe到达内页,从而躲避开IE和firefox对锚点的兼容问题,同时实现更加流畅的页面滚动切换效果。

         

         父级页面中一个导航条导航菜单结构:

         

<a class="brand" href="javascript:void(0)"  target="carMainBox" οnclick="getAndFocus('audi')"><!--audi-->
   <div class="audi"></div>
   <p>奥迪</p>
</a>
         其中函数getAndFocus('audi')就是控制穿越到iframe内部的切换函数,其中最主要是穿越iframe,获取到锚点的高度,使用scrollTo函数模拟,函数如下:

<script> 
function getAndFocus(brand){
       //获取父级页面中iframe的子页
	var iframeBox = document.getElementById("carMainBox").contentWindow;
        //获取子页面中的类名为‘sbrand’第一个锚点位置
	var point = iframeBox.document.getElementsByClassName("s"+brand);
        //如果子页中没有定义这个品牌的锚点
	if(point[0] == null )
	     alert("您所选择的品牌暂无活动车型,敬请期待!");
       //如果子页定义了这个锚点
	else{    //变换导航条选中样式
		 var ul = document.getElementById("left-nav");
		 var newLiSelected = document.getElementById(brand);
		 var OldLiSelected = document.getElementsByClassName("c-selected");
		 if(OldLiSelected[0]){
			 OldLiSelected[0].className = "c-unselected";
		 }
		 newLiSelected.className = "c-selected";
		 for(var i=0;i<=point.length;i++){
			 if(point[i].style.display =="block"){
	     		       var height = $(point[i]).offset().top+800;//关键点,获取所预先定义的元素的offset,再加上iframe距离顶部的高度
	     		       $.scrollTo(height, 300);//jquery函数,scrollTo(高度,速度)。这样子就可以实现跨越iframe完美实现锚点了。
			       return true;
			 }
			 if(i==point.length-1){
				 alert("您所选择的品牌暂无该价位的车型");
			 }
		 }
	     }
   }
</script>
        这样子操作的好处,就是基本兼容主流的浏览器。但是,这个方法有又引出了一个兼容性的问题,即IE不支持getElementsByClassName()这个方法。这个容易操作。我们可以通过JS来模拟这个函数,当然也可以使用jquery的类名选择器:

        在需要使用到这个方法的页面添加如下js函数:

//解决getElementById在IE下失效的函数
 function getElementsByClassName(classname){  
                    var d=document;  
                    var e=d.getElementsByTagName('*');  
                    var c=new RegExp('\\b'+classname+'\\b');  
                    var r=[];  
                      
                    for(var i=0,l=e.length;i<l;i++){  
                        var cn=e[i].className;  
                        if(c.test(cn)){  
                            r.push(e[i]);  
                        }  
                    }  
                    return r;  
     }//如果是IE浏览器  
    if(typeof document.getElementsByClassName !='function'){  
         document.getElementsByClassName=getElementsByClassName;  
     }//如果浏览器本身支持该方法,则默认使用原方法  
         添加了这些之后就能够完全支持使用js模拟锚点效果,穿透iframe。且这种方法完美支持各种主流浏览器。这是实现之后页面的效果:

        http://gd.qq.com/zt2013/gyh_shouye/index.htm
         
         srollTo函数作用很多,在页面切换之后,一般都会回复初始状态,我们可以使用srcollTo来返回到原始的位置,且效果非常棒。


         

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值