zoukankan      html  css  js  c++  java
  • 固定菜单页面滚动效果

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

    此效果可以应用在一些内容比较长的单页设计,本文将介绍使用JjQuery和css来实现这一效果,demo中分别有菜单居左、居右及底部效果,点击demo看效果:

    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{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:  
    5px 10px rgba(0, 0, 0, 0.2);-moz-box-shadow: 5px 10px rgba(0, 0, 0, 0.2); 
    box-shadow: 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; 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: 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(); 
        ... 
    }); 
  • 相关阅读:
    Kubernetes实战(第二版)----第1章 Kubernetes简介
    Kubernetes应用程序开发认证(CKAD)学习指南-第3章 配置
    Kubernetes应用程序开发认证(CKAD)学习指南-第2章 核心概念
    Kubernetes应用程序开发认证(CKAD)学习指南-第1章 考试详情和考试资源
    Stream Processing with Apache Flink中文版-- 第11章 接下来学什么
    Stream Processing with Apache Flink中文版-- 第10章 操作Flink和流式应用程序
    Stream Processing with Apache Flink中文版-- 第8章 与外部系统的读写交互
    Stream Processing with Apache Flink中文版-- 第7章 有状态操作符和应用程序
    Stream Processing with Apache Flink中文版-- 第6章 基于时间和窗口的操作符
    Stream Processing with Apache Flink中文版--第5章 DataStream API
  • 原文地址:https://www.cnblogs.com/axl234/p/4167212.html
Copyright © 2011-2022 走看看