仿苹果手机通讯录字母固定在屏幕顶部的效果

时间:2021-12-09 17:16:31

一直在忙,很久没有来写博客了!下面分享一个仿苹果手机通讯字母固定在屏幕顶部的效果。


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=yes"/>
    <meta name="format-detection" content="telephone=no"/>
    <meta name="renderer" content="webkit">
    <meta name="keywords" content="">
    <meta name="description" content="">
    <title>仿苹果手机通讯录字母固定在屏幕顶部</title>
</head>
<style type="text/css">
    *{
        margin:0;
        padding:0;
        box-sizing: border-box;
        -webkit-box-sizing: border-box;
        -moz-box-sizing: border-box;
    }

    .container{
        margin: 0 auto;
        width:100%;
    }

    .container .nav{
        width:100%;
        height:60px;
        background:#66bb6a;
        border:3px solid #000000;
        position: relative;
    }

    .container .nav.bg{
        background:#00a0e9;
    }

    .container .nav.se{
        height:100px;
    }

    .container .nav.se2{
        height:200px;
    }

    .container .nav.nav-fixed{
        position: fixed;
        top:0;
    }

    .container .s-mg{
        height:100px;
    }

    .container .mg{
        height:500px;
    }
</style>
<body>
<div class="container">
    <div class="s-mg"></div>
    <div class="nav">1</div>
    <div class="mg"></div>
    <div class="nav bg">2</div>
    <div class="mg"></div>
    <div class="nav se">3</div>
    <div class="mg"></div>
    <div class="nav bg">4</div>
    <div class="mg"></div>
    <div class="nav se2">5</div>
    <div class="mg"></div>
    <div class="nav bg">6</div>
    <div class="mg"></div>
    <div class="mg"></div>
</div>

<script type="text/javascript" src="lib/jquery/jquery-1.11.0.min.js"></script>
<script type="text/javascript">
    ;(function(){
        var obj = {
            scrollTopArr : [],
            initScroll : $(window).scrollTop(),
            prevIndex : -1,
            nextIndex : 0,
            init : function(){
                return obj;
            },
            run : function(param){
                var defaultParam = {
                    el : ".nav",
                    cl : "nav-fixed"
                };
                var tempParam = $.extend(defaultParam,param);

                if(tempParam.el === ""){
                    alert('缺少参数');
                    return false;
                }else if(tempParam.cl === ""){
                    alert('缺少参数');
                    return false;
                }

                obj.getAllElement(tempParam);
                obj.initPosition(tempParam);
                obj.winRoll(tempParam);
            },
            getAllElement : function(param){
                $(param.el).each(function(){
                    var tempObj = {};
                    var targetHeight = $(this).height();
                    $(this).wrap('<div style="height:'+(targetHeight+'px')+'"></div>');

                    tempObj.height = targetHeight;
                    tempObj.distanceTop = $(this).offset().top;

                    obj.scrollTopArr.push(tempObj);
                });
            },
            initPosition : function(param){
                var h = '';
                var mg = '';
                var arrLen = obj.scrollTopArr.length;
                $.each(obj.scrollTopArr,function(i,e){
                    if(i-1 >= 0){
                        h = obj.scrollTopArr[i-1].height;
                    }else{
                        h = obj.scrollTopArr[i].height;
                    }

                    mg = (obj.initScroll+h) - e.distanceTop;

                    if(obj.initScroll < e.distanceTop){
                        obj.nextIndex = i;
                        if(i === 0){
                            return false;
                        }else{
                            if(mg <= h){
                                $(param.el+":eq("+(i-1)+")").css('top','-'+mg+'px');
                            }else{
                                $(param.el+":eq("+(i-1)+")").css('top','0');
                            }
                            $(param.el).removeClass(param.cl);
                            $(param.el+":eq("+(i-1)+")").addClass(param.cl);
                        }
                        return false;
                    }else{
                        obj.nextIndex = arrLen-1;
                        if(mg <= h){
                            $(param.el+":eq("+(i-1)+")").css('top','-'+mg+'px');
                        }else{
                            $(param.el+":eq("+(i-1)+")").css('top','0');
                        }
                        if(i === (obj.scrollTopArr.length-1)){
                            $(param.el).removeClass(param.cl);
                            $(param.el+":eq("+i+")").addClass(param.cl);
                        }
                    }
                });
            },
            winRoll : function(param){
                $(window).scroll(function() {
                    var st = $(this).scrollTop();
                    var h = '';
                    var mg = '';
                    if (obj.initScroll < st) {
                        $.each(obj.scrollTopArr,function(i,e){
                            if(i-1 >= 0){
                                h = obj.scrollTopArr[i-1].height;
                            }else{
                                h = obj.scrollTopArr[i].height;
                            }

                            mg = (st+h) - e.distanceTop;

                            if(mg <= h){
                                $(param.el + ":eq(" + (i - 1) + ")").css('top', '-' + mg + 'px');
                            }else{
                                $(param.el+":eq("+(i-1)+")").css('top','0');
                            }

                            if(st - e.distanceTop >= 0) {
                                if(i > obj.prevIndex){
                                    $(param.el).removeClass(param.cl);
                                    $(param.el+":eq("+i+")").addClass(param.cl);
                                    obj.prevIndex = i;
                                    obj.nextIndex = i;
                                }
                            }
                        });
                        obj.initScroll = st;
                    }

                    if (obj.initScroll > st) {
                        obj.prevIndex = -1;
                        $.each(obj.scrollTopArr,function(i,e){
                            if(i-1 >= 0){
                                h = obj.scrollTopArr[i-1].height;
                            }else{
                                h = obj.scrollTopArr[i].height;
                            }

                            mg = (st+h) - e.distanceTop;

                            if(mg <= h){
                                $(param.el+":eq("+(i-1)+")").css('top','-'+mg+'px');
                            }else{
                                $(param.el+":eq("+(i-1)+")").css('top','0');
                            }

                            if(e.distanceTop - st >= 0) {
                                if(i === obj.nextIndex){
                                    obj.nextIndex--;
                                    if(obj.nextIndex > -1){
                                        $(param.el).removeClass(param.cl);
                                        $(param.el+":eq("+obj.nextIndex+")").addClass(param.cl);
                                    }else if(obj.nextIndex === -1){
                                        $(param.el).removeClass(param.cl);
                                    }
                                }
                            }
                        });
                        obj.initScroll = st;
                    }
                });
            }
        };
        window.fixedNav = new obj.init();
    })();

    fixedNav.run({
        el : ".nav",
        cl : "nav-fixed"
    });
</script>
</body>
</html>

复制代码到HTML文件即可查看效果!仿苹果手机通讯录字母固定在屏幕顶部的效果