点击导航滚动条滚动到相应位置jQuery与js方法

代码块

    /* CSS */
    <style>
        * {margin: 0;padding: 0;box-sizing: border-box;}
        body {font-size: 12px;line-height: 1.7;}
        li {list-style: none;}
        #content {width: 100%;padding: 20px;}
        #content h1 {color: #0088bb;}
        #content .item {padding: 20px;margin-bottom: 20px;border: 1px dotted #0088bb;height:800px;width: 100%;}
        #content .item h2 {font-size: 16px;font-weight: bold;border-bottom: 2px solid #0088bb;margin-bottom: 10px;}
        #content .item li {display: inline;margin-right: 10px;}
        #content .item li a img {width: 230px;height: 230px;border: none;}

        #menu{position:fixed;right:0;top:200px;border:1px solid #0088bb;background-color: #fff;}
        #menu ul li a {
            display: block;
            font-size: 14px;
            font-weight: bold;
            color: #333;
            width: 80px;
            height: 50px;
            line-height: 50px;
            text-decoration: none;
            text-align: center;
        }
        #menu ul li a:hover,#menu ul li a.current {color: #fff;background: #0088bb;} 
    </style>
    <!-- HTML -->
    <div id="menu">
        <ul class="ul_menu">
            <li><a flag="item1" href="#" class="current">1F </a></li>
            <li><a flag="item2" href="#">2F </a></li>
            <li><a flag="item3"  href="#">3F </a></li>
            <li><a flag="item4" href="#">4F </a></li>
            <li><a flag="item5" href="#">5F </a></li>
        </ul>
    </div>
    <div id="content">
        <h1>测试</h1>

        <div id="item1" class="item">
            <h2>1F </h2>
            <ul> <li><a href="#"><img src="" alt=""/></a></li> </ul>
        </div>
        <div id="item2" class="item">
            <h2>2F </h2>
            <ul> <li><a href="#"><img src="" alt=""/></a></li> </ul>
        </div>
        <div id="item3" class="item">
            <h2>3F </h2>
            <ul> <li><a href="#"><img src="" alt=""/></a></li> </ul>
        </div>
        <div id="item4" class="item">
            <h2>4F </h2>
            <ul> <li><a href="#"><img src="" alt=""/></a></li> </ul>
        </div>
        <div id="item5" class="item">
            <h2>5F </h2>
            <ul> <li><a href="#"><img src="" alt=""/></a></li> </ul>
        </div>
    </div>

jquery/js方法取其一

若使用jquery要引入jquery.js文件

    <script>
        $(function(){
            $(window).scroll(function(){
                var scrollTop = $(document).scrollTop();
                var oItem = $("#content").find(".item");
                var oName = "";
                $.each(oItem,function(){
                    var oneItem = $(this);
                    var offsetTop = oneItem.offset().top;
                    if(offsetTop-scrollTop < 200){
                        oName = oneItem.attr("id");
                    }
                });
                if(oName != $(".current").attr("href")){
                    $(".current").removeClass("current");
                    $(".ul_menu").find("[flag="+ oName +"]").addClass("current");
                }
            });

            $(".ul_menu li a").click(function(){
                var oA = $(this);
                var index = oA.parent().index();
                var h = $(".item").eq(index).offset().top + 'px';
                if(oA.attr("class") != "current"){
                    $('html,body').animate({scrollTop:h},300);
                }
            });
        });
    </script>

或者纯javascript不需要引入jquery.js

    <script>
        var timer = null;

        var oItem = getClassname("item");
        var oUl = getClassname("ul_menu")[0];
        var oA = oUl.getElementsByTagName("a");
        var oTop = [];
        for (var i = 0; i < oItem.length; i++) {
            oTop[oTop.length] = oItem[i].offsetTop;
        }

        window.onscroll = function(){
            var oName;
            var scrollTop = getScrollTop();
            for (var i = 0; i < oTop.length; i++) {
                if(oTop[i]-scrollTop<200){ 
                    oName = "item"+ (i+1);
                }
            }
            var oCur = getClassname("current")[0];
            if(oName != oCur.getAttribute("flag")){
                removeClass(oCur,"current");
                for (var i = 0; i < oA.length; i++) {
                    if(oA[i].getAttribute("flag") == oName){
                        addClass(oA[i],"current");
                    }
                }
            }
        }

        window.onload = function(){
            for (var i = 0; i < oA.length; i++) {
                oA[i].index = i;
                oA[i].onclick = function(){
                    if(!hasClass(this,"current")){
                        var oCur = getClassname("current")[0];
                        removeClass(oCur,"current");
                        addClass(oA[this.index],"current");
                        move(oA[this.index],oTop[this.index]);
                    }
                }
            }
        }

        // 滚动条运动
        function move(obj,iTarget){

            var iSpeed = 0;     //速度
            var iCur = 0;       //当前值

            clearInterval(timer);
            timer = setInterval(function(){
                var onOff = true;       //关闭定时器开关

                iCur = parseInt(getScrollTop());        //获取滚动条值当前值
                if(iCur > iTarget){
                    iSpeed = Math.floor((iTarget - iCur)/4);
                }else{
                    iSpeed = Math.ceil((iTarget - iCur)/4);
                }

                if(iCur != iTarget){
                    onOff = false;
                }else{
                    onOff = true;
                }

                //运动
                var tt = iCur + iSpeed;
                window.scrollTo(tt,tt);
                if(onOff){
                    clearInterval(timer);
                }

            },30);
        }

        // 获取滚动条距离顶部距离
        function getScrollTop(){
            return document.documentElement.scrollTop || window.pageYOffset || document.body.scrollTop;
        }

        // 获取含有classname的节点
        function getClassname(classnames){
            var oDiv;
            var oBj = [];
            if(document.getElementsByClassName){
                oBj = document.getElementsByClassName(classnames);
            }else{
                oDiv = document.getElementsByTagName("*");
                var oLen = oDiv.length;
                var oClass;
                for (var i = 0; i < oLen; i++) {
                    oClass = oDiv[i].className;
                    if(oClass.indexOf(classnames) != -1){
                        oBj[oBj.length] = oDiv[i];
                    }
                }
            }
            return oBj;
        }

        //判断某个节点是否含有class
        function hasClass(elements,cName){  
            return !!elements.className.match(new RegExp( "(\\s|^)" + cName + "(\\s|$)") );
        }

        // 添加class
        function addClass(elements,cName){
            if( !hasClass( elements,cName ) ){ 
                elements.className += " " + cName; 
            };
        }

        // 移除class
        function removeClass(elements,cName){
            if( hasClass( elements,cName ) ){ 
                // replace方法是替换 
                elements.className = elements.className.replace( new RegExp( "(\\s|^)" + cName + "(\\s|$)" )," " ); 
            }
        }

    </script>

完整案例https://pan.baidu.com/s/1dFDLwdV
效果:
这里写图片描述

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值