jquery 固定菜单页面滚动效果

在一个单页面设置一个主菜单,当页面滚动时主菜单位置固定在页面窗口中不动,或左或右,或上或下。当单击菜单项时,页面滚动到菜单对应的内容区,当页面滚动到预定内容位置时,对应的菜单项变为当前选中样式。

HTML

本例html来自本站文章:ScrollTo:平滑滚动到页面指定位置中的DEMO,我们在页面中的#main内放置一个主菜单ul.nav,并对应每个菜单项的内容区,我们会发现内容区的id对应菜单项的class,接下来你会发现它的作用。

 代码如下 复制代码

<div id="main">  
      <ul class="nav">
           <li><a class="pro">产品展示</a></li>
           <li><a class="news">新闻中心</a></li>
           <li><a class="ser">服务支持</a></li>
           <li><a class="con">联系我们</a></li>
           <li><a class="job">人才招聘</a></li>
    </ul>
     <div id="pro" class="box">
        <h3>产品展示</h3>
        ...
     </div>
     <div id="news" class="box">
        <h3>新闻中心</h3>
        ...
     </div>
     <div id="ser" class="box">
        <h3>服务支持</h3>
        ...
     </div>
     <div id="con" class="box">
        <h3>联系我们</h3>
        ...
     </div>
     <div id="job" class="box">
        <h3>人才招聘</h3>
        ...
     </div>
</div>

CSS

使用CSS固定菜单,以及设置菜单样式,和内容区。

 代码如下 复制代码

.nav{width:160px; position:fixed; margin-left:-170px; top:20%; z-index:1999; 
background:#f0f0f0; border: 1px solid #ccc;-webkit-border-radius: 6px;
-moz-border-radius: 6px;border-radius: 6px;-webkit-box-shadow: 
0 5px 10px rgba(0, 0, 0, 0.2);-moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);}
.nav li{height:36px; line-height:36px; border-bottom:1px solid #d3d3d3; 
text-align:center; cursor:pointer}
.nav li:last-child{border-bottom:none}
.nav li a{display:block; width:98%; height:34px;font-size:16px;}
.nav li a:hover{background:#f9f9f9; text-decoration:none}
.nav li a.cur{background:#ffc}
.box{height:600px; margin: 0 10px}

上面的代码使用position:fixed将菜单位置固定在内容区的左侧:demo1
jQuery

本例基于jQuery,所以老惯例,先载入jquery库,然后写代码:

 代码如下 复制代码

$(function(){
    $(".nav li a").click(function() {
        var el = $(this).attr('class');
         $('html, body').animate({
             scrollTop: $("#"+el).offset().top
         }, 300);
        //切换菜单样式
        $(this).addClass("cur").parent().siblings().find("a").removeClass("cur");
     });
});

当单击菜单项时,使用jQuery自定义动画函数animate(),将页面对应的区域(id对应了菜单项的class),滚动到浏览器顶端,并且将菜单项的样式切换为当前选中状态。

如果你喜欢用不同的滚动效果,请参照本站文章:jQuery Easing 动画效果扩展。

其实到这里,已经实现了固定菜单,和点击菜单滚动到指定内容位置的效果,但是有一点,当我们不点击菜单,而是滚动页面时,页面到达了菜单项对应的位置,我们需要菜单项也做出对应的反应,将对应的菜单项设置为当前选中项,这样就可以告诉用户,您正在浏览的对应的是页面哪个节点的内容。

我们先获取内容区每个菜单对应的节点与页面顶部的偏移量,然后当页面滚动scroll时,获取页面滚动条的便宜距离scroH,然后将这两个值比较,设置对应的菜单项为选中状态。

 代码如下 复制代码

$(function(){
    ...
    var pro_top = $("#pro").offset().top; //距页顶偏移量
    var news_top = $("#news").offset().top;
    var ser_top = $("#ser").offset().top;
    var con_top = $("#con").offset().top;
    var job_top = $("#job").offset().top;
 
    $(window).scroll(function(){//滚动页面
        var scroH = $(this).scrollTop(); //滚动条位置
        if(scroH>=job_top){
            set_cur(".job");//设置状态
        }else if(scroH>=con_top){
            set_cur(".con");
        }else if(scroH>=ser_top){
            set_cur(".ser");
        }else if(scroH>=news_top){
            set_cur(".news");
        }else if(scroH>=pro_top){
            set_cur(".pro");
        }
    });
    ...
});

自定义函数set_cur()用于设置当前菜单状态:

 代码如下 复制代码

function set_cur(n){
    if($(".nav a").hasClass("cur")){
        $(".nav a").removeClass("cur");
    }
    $(".nav a"+n).addClass("cur");
}

好了,现在滚动页面切换样式也实现了,但是还有一个问题,当浏览器窗口大小变化时,菜单位置也应该一起变化,浏览器窗口宽度大于内容区和主菜单宽度时,保持主菜单一直依靠在内容区左侧。

 代码如下 复制代码

$(window).resize(function(){//窗口大小变化
  navpos();
});
//根据宽度设置样式
function navpos(){
    var offset = $("#main").offset().left;
    var nav_w = $(".nav").outerWidth();
    var left = offset-nav_w;
    
    if(left>10){
        $(".nav").css("margin-left","-170px");
    }else{
        $(".nav").css("margin-left",-(160+left)+"px");
    }
}

当然,我们也可以在页面加载完成时也调用navpos(),初始化菜单位置。

 代码如下 复制代码

$(function(){
    navpos();
    ...
});

最后,还剩一个问题,我们知道老掉牙的IE6不支持position:fixed,这样在ie6下菜单不会固定滚动。解决办法是有的,可以通过css或者javascript来处理兼容性的问题

jquery 固定菜单页面滚动效果源码下载:http://file.111cn.net/upload/2013/10/pageScroll.rar

时间: 2024-11-10 12:01:23

jquery 固定菜单页面滚动效果的相关文章

jquery防百度百科/淘宝/页面滚动效果

例1 ,防百度百科页面滚动效果    代码如下 复制代码 <!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <title>jquery防百度百科页面滚动效果</title> <link rel="stylesheet" type="text/css" href="css/main.css" /&

jQuery实现div浮动层跟随页面滚动效果

 这篇文章主要介绍了jQuery实现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"

jQuery实现div浮动层跟随页面滚动效果_javascript技巧

复制代码 代码如下: <!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=&qu

解决js页面滚动效果scrollTop在FireFox与Chrome浏览器间的兼容问题的方法_javascript技巧

最近在做博客的目录功能,发现一个在现代浏览器间的一个bug,或是称之为差异,即页面滚动值(scrollTop)的获取与设定. 在此之前先说一下关于页面元素的坐标获取,这张图的经典性不必再提.  实现滚动到某位置功能 一个最主要的功能就是实现点击标题页面滚动,因为我们要滚动到页面某个标题,所以需要计算出滚动这个元素的具体绝对位置,而常用的offsetTop是获取到当前元素与之最近的决定其定位的元素的偏移量,此处不适用. 此处应使用浏览器原生提供的 getBoundingClientRect 接口,

jQuery实现微博信息滚动效果

效果如下 HTML 我们以新浪微博信息滚动为背景,html中包含了多条微博图文信息,结构如下:  代码如下 复制代码 <div id="con">       <ul>         <li> <a href="#" class="face"><img src="/1197161814/ 50/1290146312/1" /></a>          

jQuery模拟新浪微博首页滚动效果的方法

 这篇文章主要介绍了jQuery模拟新浪微博首页滚动效果的方法,实例分析了jQuery使用animate.css等方法实现滚动特效的技巧,具有一定参考借鉴价值,需要的朋友可以参考下     本文实例讲述了jQuery模拟新浪微博首页滚动效果的方法.分享给大家供大家参考.具体实现方法如下:   代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR

jquery实现图片水平滚动效果代码分享_jquery

本文实例讲述了jquery实现图片水平滚动效果,分享给大家供大家参考.具体如下: 运行效果图:-------------------查看效果------------------- 小提示:浏览器中如果不能正常运行,可以尝试切换浏览模式. 为大家分享的jquery实现图片水平滚动效果代码如下 <HEAD> <META content="text/html; charset=gb2312" http-equiv="Content-Type"> &

JS实现超精简的链接列表在固定区域内滚动效果代码_javascript技巧

本文实例讲述了JS实现超精简的链接列表在固定区域内滚动效果代码.分享给大家供大家参考,具体如下: 这款超精简版的链接列表文字滚动代码,可在指定的区域内滚动,当然,区域大小可以自己设置的. 运行效果截图如下: 在线演示地址如下: http://demo.jb51.net/js/2015/js-link-list-scroll-style-codes/ 具体代码如下: <html> <HEAD> <TITLE>文字链接列表滚动</TITLE> <META

jQuery模拟新浪微博首页滚动效果的方法_jquery

本文实例讲述了jQuery模拟新浪微博首页滚动效果的方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: <!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/xh