jquery stickup 效果

单个导航固定

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>stickup</title>
    <script type="text/javascript" src="http://apps.bdimg.com/libs/jquery/1.9.1/jquery.min.js"></script>
    <style>
        #header {
            background-color: red;
            height: 80px;
            line-height: 80px;
            text-align: center;
        }
        #nav {
            margin-top: 20px;
            height: 40px;
            background: blue;
        }
        #content {
            min-height: 800px;
            background: #ccc;
            padding: 10px;
            /*形成独立的块级格式化上下文,内部布局仅在内部产生影响*/
            overflow: hidden;  
        }
        #content .aside {
            float: left;
            width: 100px;
            min-height: 400px;
            background:green;
        }
        #content .main {
            background: #fff;
            padding-left: 20px;
            min-height: 800px;
            /*形成独立的块级格式化上下文,内部布局仅在内部产生影响*/
            overflow: hidden; 
        }
        #footer {
            background: #333;
        }
    </style>
</head>
<body>
    <div id="header">header</div>
    <div id="nav">nav</div>
    <div id="content">
        <div class="aside">aside</div>
        <div class="main">main</div>
    </div>
    <div id="footer">footer</div>


    <script>
        var nav = $('#nav'),
            navH = nav.height(),
            navW = nav.width();
            //.offset()方法允许我们检索一个元素相对于文档(document)的当前位置。
            offsetTop = nav.offset().top,  
            offsetLeft = nav.offset().left;
        
        //把目标元素克隆一个用于占位,否则目标元素Position变为fix后脱离文档流,导致页面跳动
        var navClone = nav.clone()
                                  .css({visibility: 'hidden', display: 'none'})
                                  .insertBefore(nav);

        $(window).on('scroll', function(){
            var scrollTop = $(this).scrollTop();
            if(scrollTop >= offsetTop){
                if(!isFixed()){  //如果没被固定
                    setFixed();  //执行固定
                }
            } else {
                if(isFixed()){
                    unsetFixed();
                }
            }
        });

        //判断固定
        function isFixed(){
            //返回nav标签的数据存储上的data-fixed属性
            return nav.data('data-fixed');  
        }
        //设置固定
        function setFixed(){
            /*在nav标签的数据存储上保存属性data-fixed值true。
              如<div id='nav' data-fixed='true'>;
              同时设置固定时的css*/
            nav.data('data-fixed', true).css({
                'position': 'fixed',
                'top': 0,
                'left': offsetLeft,
                'width': navW,
                'margin': 0,
                'z-index': 100
            });
            navClone.show();  //展示克隆的nav
        }
        //取消固定
        function unsetFixed(){
            //重点注意.removeAttr('style') 对应setFixed函数中的css样式
            nav.data('data-fixed', false).removeAttr('style');  
            navClone.hide();
        }

        /*
        方法核心:
        1.克隆一个nav导航条,用于占位
        2.将原导航条用于固定定位,固定定位时展示出用于占位的克隆导航条
        3.取消固定时,隐藏用于占位的克隆导航条
        */
    </script>
</body>
</html>

多个导航固定

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Stickup</title>
    <script type="text/javascript" src="http://apps.bdimg.com/libs/jquery/1.9.1/jquery.min.js"></script>
    <style>
        .wrap {
            width: 900px;
            margin: 0 auto;
        }

        #header .wrap {
            height: 50px;
            line-height: 50px;
            background: red;
        }
        .nav {
            height: 30px;
            line-height: 30px;
            border: 1px solid;
            background: yellow;
        }

        .ct {
            margin-top: 20px;
            overflow: hidden;
        }
        .ct:after {
            display: block;
            content: '';
            clear: both;
        }
        .aside {
            float: left;
            width: 200px;
            height: 400px;
            background: pink;
            padding-top: 5px;
        }
        .aside2 {
            background: yellow;
        }
        .aside3 {
            background: red;
        }
        .main {
            overflow: hidden;
            float: right;
            width: 680px;
            height: 400px;
            padding-top: 5px;
            background: blue;
        }
        .footer {
            background: green;
            margin-top:20px;
        }
    </style>
</head>
<body>
    <div id="header">
        <div class="wrap">header</div>
    </div>

    <div id="content">
        <div class="wrap">
            <div class="ct">
                <div class="nav">nav1</div>
                <div class="aside aside1">aside1</div>
                <div class="main">main1</div>
            </div>
            <div class="ct">
                <div class="nav">nav2</div>
                <div class="aside aside2">aside2</div>
                <div class="main">main2</div>
            </div>
            <div class="ct">
                <div class="nav">nav3</div>
                <div class="aside aside3">aside3</div>
                <div class="main">main3</div>
            </div>
            <div class="ct">
                <div class="nav">nav4</div>
                <div class="aside aside4">aside4</div>
                <div class="main">main4</div>
            </div>
        </div>
    </div>
    
    <div class="footer wrap">footer</div>


    <script>
        /*
        对上例stickup-jquery.html 做个 each 遍历循环即可实现对多个 nav 应用 stickup 效果
        代码只是实现功能,但比较丑陋,初学者可以模仿。
        可以使用 stick-plugin.html 里面的插件来实现效果
        */
        $('.nav').each(function(){  //显式遍历class为nav的html元素
            var $cur = $(this),
                curH = $cur.height(),
                curW = $cur.width(),
                offsetTop = $cur.offset().top,
                offsetLeft = $cur.offset().left;

            var $curClone = $cur.clone()
                                .css({visibility:'hidden', display: 'none'})
                                .insertBefore($cur);
            
            $(window).on('scroll', function(){
                var scrollTop = $(this).scrollTop();
                if(scrollTop >= offsetTop){
                    if(!isFixed()){
                        setFixed();
                    }
                } else {
                    if(isFixed()){
                        unsetFixed();
                    }
                }
            });

            function isFixed(){
                return $cur.data('data-fixed');  //返回$cur上数据存储的值:true or false
            }

            function setFixed(){
                $cur.data('data-fixed', true)
                    .css({
                        'position': 'fixed',
                        'top': 0,
                        'left': offsetLeft,
                        'width': curW,
                        'margin': 0,
                        'z-index': 1000
                    });
                $curClone.show();
            }

            function unsetFixed(){
                $cur.data('data-fixed', false)
                    .removeAttr('style');
                $curClone.hide();
            }
        });
    </script>
</body>
</html>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 第5章 菜单、按钮及导航 一、下拉菜单 小伙伴们注意,在Bootstrap框架中的下拉菜单组件是一个独立的组件,根...
    凛0_0阅读 5,261评论 0 66
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 14,455评论 4 61
  • 01 再看王家卫的《花样年华》时,脑海中冒出了这样一个问题:如果当初勇敢一点,你会不会跟我走? 电影的故事情节,其...
    怀左同学阅读 6,641评论 59 225
  • 躲在我心里头 从没有走掉的那个人 二十年后,突然又回来了 大声的对我说:你喜欢我! 我一时间竟然不知所措 好像我又...
    金陵小白阅读 198评论 0 0
  • 当我和阿弟跪在那个土包前点燃那一大叠红的鲜艳的冥币时,我突然想起来在福州混日子时看过的电影,想起寻梦环游记里...
    文帝风尘阅读 436评论 0 4

友情链接更多精彩内容