web常见特效——floor电梯导航

floor电梯导航

平时在pc端浏览一些电商网页,就会发现有这麽一样功能:

  • 当页面滚动到某一块区域,侧导航栏会让对应的那部分高亮显示,
  • 在点击侧导航的某个区域,页面也会自动滚动到这区域

就如下图所示
在这里插入图片描述
那么这个功能使用原生js如何去写,思路是怎么样的
思路:

  1. 当页面滚动到指定位置就不会在滚动,当页面小于设置的指定位置,就能继续滚动
  2. 当鼠标点击侧导航栏中元素,页面会滚动到该元素对应的那部分区域
  3. 当页面滚动到侧导航中设定好的区域,侧导航就会高亮某个元素

HTML代码
主要有两部分,导航栏和floor区域

 <div class="subnav">
       <ul>
           <li><a href="javascript:;">手机</a></li>
           <li><a href="javascript:;">电脑</a></li>
           <li><a href="javascript:;">平板</a></li>
           <li><a href="javascript:;">笔记本</a></li>
       </ul>
   </div>
   <div class="floor">
       <div class="shouji">
           <h1>
               我是手机区域
           </h1>
       </div>
       <div class="diannao">
           <h1>
               我是电脑区域
           </h1>
       </div>
       <div class="pingban">
           <h1>
               我是平板区域
           </h1>
       </div>
       <div class="bijiben">
           <h1>
               我是笔记本区域
           </h1>
       </div>
   </div>

CSS代码

<style>
       * {
           margin: 0;
           padding: 0;
       }

       body {
           position: relative;
       }

       .floor {
           width: 1200px;
           margin: auto;
       }

       .floor div {

           height: 500px;
           border: 1px solid #ccc;
           margin-bottom: 10px;
       }

       h1 {
           text-align: center;
       }

       .subnav {
           position: absolute;
           top: 800px;
           left: 50%;
           margin-left: 650px;
       }

       .subnav ul li {
           list-style: none;
           width: 70px;
           height: 70px;
           border: 1px solid #ccc;
           text-align: center;
           line-height: 70px;

       }

       footer {
           width: 1200px;
           margin: auto;
           height: 500px;
           background-color: #ccc;
           border: 1px solid #ccc;
           margin-bottom: 10px;
       }
   </style>

javascript代码

 <script>
        var subnav = document.querySelector('.subnav');
        var li = document.querySelectorAll('.subnav li');
        var floor = document.querySelector('.floor');
        var diannao = document.querySelector('.diannao');

        //1.如果页面滚动到电脑区域就让subnav固定到当前位置,否则就还是相对定位
        var diannaoTop = diannao.offsetTop;
        var subnavTop = subnav.offsetTop - diannaoTop
        document.onscroll = function () {
            if (window.pageYOffset >= diannaoTop) {
                subnav.style.position = 'fixed';
                //此时侧导航的top值就是没滚动前该元素offsetTop-滚到目标位置的offsetTop值
                subnav.style.top = subnavTop + 'px';
            } else {
                subnav.style.position = 'absolute';
                subnav.style.top = '800px'
            }
            console.log(flag);
            if (flag) {
                //3.頁面滚动到数组中指定区域,让对应的侧导航显示
                list.forEach((item, index) => {
                    if (window.pageYOffset >= item) {
                        for (var i = 0; i < li.length; i++) {
                            li[i].style.backgroundColor = ''
                        }
                        li[index].style.backgroundColor = 'pink'
                    }
                })
            }

        }
        var list = [floor.children[0].offsetTop, floor.children[1].offsetTop, floor.children[2].offsetTop, floor.children[3].offsetTop]
        //2.在li中点谁谁高亮,并且要滚动到相应的位置
        var flag = true
        for (var i = 0; i < li.length; i++) {
            li[i].setAttribute('data-index', i);

            li[i].onclick = function () {
                //在点击时候页面肯定会滚动,所以上面的滚动事件会影响到元素背景显示,这时候就需要在点击之后停止页面滚动的监听,滚动结束在开启
                flag = false;
                for (var i = 0; i < li.length; i++) {
                    li[i].style.backgroundColor = ''
                }
                this.style.backgroundColor = 'pink';
                //获取当前点击的li索引
                var index = this.getAttribute('data-index');
                //滚动的距离应该是对应数组中的位置
                animate(window, list[index], function () {
                    //动画滚动完成,让flag变为true,可以继续监听页面滚动事件了
                    flag = true;
                })

            }
        }
		//封装一个函数,主要是实现页面可以滚动
        function animate(obj, target, callback) {
            clearInterval(obj.timer);
            obj.timer = setInterval(() => {
                var tept = (target - obj.pageYOffset) / 10;
                tept = tept > 0 ? Math.ceil(tept) : Math.floor(tept);
                if (window.pageYOffset == target) {
                    clearInterval(obj.timer);
                    callback && callback()
                }
                console.log(tept);
                window.scroll(0, window.pageYOffset + tept)
            }, 30)
        }
    </script>
  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
<!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="Content-Type" content="text/html; charset=gb2312"> <title>效果流畅动感基于jquery库的JS特效下拉菜单_酷站代码 www.5icool.org</title> <link href="css/smartmenu.css" type="text/css" rel="stylesheet" /> <link type="text/css" rel="stylesheet" href="css/shCore.css"/> <link type="text/css" rel="stylesheet" href="css/shThemeDefault.css"/> <script type="text/javascript" src="js/jquery-1.3.2.min.js"></script> <script type="text/javascript" src="js/smartmenu-min.js"></script> <script type="text/javascript" src="js/shCore.js"></script> <script type="text/javascript" src="js/shBrushJScript.js"></script> <script type="text/javascript" src="js/shBrushXml.js"></script> <script type="text/javascript"> jQuery(window).ready(function(){ jQuery("#navigation").Smartmenu({animationDuration: 350}); }); SyntaxHighlighter.all(); </script> <style type="text/css"> body { background : #333; } #wrap { margin : 50px auto 0px auto; width : 750px; } #description { margin-top: 80px; } #description ul { margin: 0px; padding: 0px; list-style: none; } h2 { font-family: helvetica, arial; font-size: 15pt; color: #888; } pre { font-size: 8pt; } </style> </head> <body> <div id="wrap"> <div id="navigation" class="smartmenu"> <ul> <li> <a href="http://www.5icool.org/">JavaScript</a> <ul> <li> <a href="http://www.5icool.org/">Navigation</a> </li> <li> <a href="http://www.5icool.org/">Shopping Carts</a> </li> <li> <a href="http://www.5icool.org/">Forms</a> </li> <li> <a href="http://www.5icool.org/">News Tickers</a> </li> <li> <a href="http://www.5icool.org/">Ratings and Charts</a> </li> <li> <a href="http://www.5icool.org/">Media</a> </li> </ul> </li> <li> <a href="http://www.5icool.org/">Wordpress</a> <ul> <li> <a href="http://www.5icool.org/">Blog & Magazines</a> </li> <li> <a href="http://www.5icool.org/">Creative</a> </li> <li> <a href="http://www.5icool.org/">Corporate</a> </li> <li> <a href="http://www.5icool.org/">Retail</a> </li> </ul> </li> <li> <a href="">Site Template</a> <ul> <li> <a href="http://www.5icool.org/">Creative</a> </li> <li> <a href="http://www.5icool.org/">Technology</a> </li> </ul> </li> <li> <a href="">PSD Templates</a> <ul> <li> <a href="http://www.5icool.org/">Nonprofit</a> </li> <li> <a href="http://www.5icool.org/">Entertainment</a> </li> <li> <a href="http://www.5icool.org/">Personal</a> </li> <li> <a href="http://www.5icool.org/">Miscellaneous</a> </li> </ul> </li> <li> <a href="">Video</a> </li> <li> <a href="">PHP Scripts</a> <ul> <li> <a href="http://www.5icool.org/">Project Management Tools</a> </li> <li> <a href="http://www.5icool.org/">Image & Media</a> </li> <li> <a href="http://www.5icool.org/">Uploaders</a> </li> <li> <a href="http://www.5icool.org/">Calendars</a> </li> </ul> </li> </ul> </div> <div id="description"> <ul> <li> <h2>All the JavaScript you need to write</h2> <pre class="brush: javascript;"> $(window).ready(function(){ jQuery("#navigation").Smartmenu(); }); </pre> </li> <li> <h2>All the HTML you need</h2> <pre class="brush: xml"> <div id="navigation" class="smartmenu"> <ul> <li> <a href="">JavaScript</a> <ul> <li> <a href="">Navigation</a> </li> <li> <a href="">Shopping Carts</a> </li> <li> <a href="">Forms</a> </li> <li> <a href="">News Tickers</a> </li> <li> <a href="">Ratings and Charts</a> </li> <li> <a href="">Media</a> </li> </ul> </li> <li> <a href="">Wordpress</a> <ul> <li> <a href="">Blog & Magazines</a> </li> <li> <a href="">Creative</a> </li> <li> <a href="">Corporate</a> </li> <li> <a href="">Retail</a> </li> </ul> </li> <li> <a href="">Site Template</a> <ul> <li> <a href="">Creative</a> </li> <li> <a href="">Technology</a> </li> </ul> </li> </ul> </div> </pre> </li> </ul> </div> </div> <p align="center"><a href="http://www.5icool.org/a/201011/700.html" target="_blank"><strong>效果流畅动感基于jquery库的JS特效下拉菜单</strong></a> <a href="http://www.5icool.org/a/201011/700.html" target="_blank">[源码下载][使用帮助]</a></p> <p align="center" style="font-size:12px;">代码整理:<a href="http://www.5icool.org/" target="_blank">酷站代码</a>,转载请注明出处。 本代码仅限于学习交流,请勿用于商业用途! </p> </body> </html>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值