美文网首页
mui侧面选项卡 带有跳动效果的

mui侧面选项卡 带有跳动效果的

作者: 加冰宝贝 | 来源:发表于2018-09-04 10:58 被阅读312次
<!DOCTYPE html>
<html>

    <head>
        <meta charset="utf-8">
        <title>Hello MUI</title>
        <meta name="viewport" content="width=device-width, initial-scale=1,maximum-scale=1,user-scalable=no">
        <meta name="apple-mobile-web-app-capable" content="yes">
        <meta name="apple-mobile-web-app-status-bar-style" content="black">

        <!--标准mui.css-->
        <link rel="stylesheet" href="../css/mui.min.css">
        <!--App自定义的css-->
        <link rel="stylesheet" type="text/css" href="../css/app.css" />
        <style>
            .mui-row.mui-fullscreen>[class*="mui-col-"] {
                height: 100%;
            }
            
            .mui-col-xs-3,
            .mui-col-xs-9 {
                overflow-y: auto;
                height: 100%;
            }
            
            .mui-segmented-control .mui-control-item {
                line-height: 50px;
                width: 100%;
            }
            
            .mui-control-content {
                display: block;
            }
            
            .mui-segmented-control.mui-segmented-control-inverted .mui-control-item.mui-active {
                background-color: #fff;
            }
        </style>
    </head>

    <body>
        <header class="mui-bar mui-bar-nav">
            <a class="mui-action-back mui-icon mui-icon-left-nav mui-pull-left"></a>
            <h1 class="mui-title">侧面选项卡-div模式</h1>
        </header>
        <div class="mui-content mui-row mui-fullscreen">
            <div class="mui-col-xs-3">
                <div id="segmentedControls" class="mui-segmented-control mui-segmented-control-inverted mui-segmented-control-vertical">
                </div>
            </div>
            <div id="segmentedControlContents" class="mui-col-xs-9" style="border-left: 1px solid #c8c7cc;">
            </div>
        </div>
        <script src="../js/mui.min.js"></script>
        <script>
            mui.init({
                swipeBack: true //启用右滑关闭功能
            });
            var controls = document.getElementById("segmentedControls");
            var contents = document.getElementById("segmentedControlContents");
            var html = [];
            var i = 1,
                j = 1,
                m = 16, //左侧选项卡数量+1
                n = 21; //每个选项卡列表数量+1
            for (; i < m; i++) {
                html.push('<a class="mui-control-item" data-index="' + (i - 1) + '" href="#content' + i + '">选项' + i + '</a>');
            }
            controls.innerHTML = html.join('');
            html = [];
            for (i = 1; i < m; i++) {
                html.push('<div id="content' + i + '" class="mui-control-content"><ul class="mui-table-view">');
                for (j = 1; j < n; j++) {
                    html.push('<li class="mui-table-view-cell">第' + i + '个选项卡子项-' + j + '</li>');
                }
                html.push('</ul></div>');
            }
            contents.innerHTML = html.join('');
            //默认选中第一个
            controls.querySelector('.mui-control-item').classList.add('mui-active');
//          contents.querySelector('.mui-control-content').classList.add('mui-active');
            (function() {
                var controlsElem = document.getElementById("segmentedControls");
                var contentsElem = document.getElementById("segmentedControlContents");
                var controlListElem = controlsElem.querySelectorAll('.mui-control-item');
                var contentListElem = contentsElem.querySelectorAll('.mui-control-content');
                var controlWrapperElem = controlsElem.parentNode;
                var controlWrapperHeight = controlWrapperElem.offsetHeight;
                var controlMaxScroll = controlWrapperElem.scrollHeight - controlWrapperHeight;//左侧类别最大可滚动高度
                var maxScroll = contentsElem.scrollHeight - contentsElem.offsetHeight;//右侧内容最大可滚动高度
                var controlHeight = controlListElem[0].offsetHeight;//左侧类别每一项的高度
                var controlTops = []; //存储control的scrollTop值
                var contentTops = [0]; //存储content的scrollTop值
                var length = contentListElem.length;
                for (var i = 0; i < length; i++) {
                    controlTops.push(controlListElem[i].offsetTop + controlHeight);
                }
                for (var i = 1; i < length; i++) {
                    var offsetTop = contentListElem[i].offsetTop;
                    if (offsetTop + 100 >= maxScroll) {
                        var height = Math.max(offsetTop + 100 - maxScroll, 100);
                        var totalHeight = 0;
                        var heights = [];
                        for (var j = i; j < length; j++) {
                            var offsetHeight = contentListElem[j].offsetHeight;
                            totalHeight += offsetHeight;
                            heights.push(totalHeight);
                        }
                        for (var m = 0, len = heights.length; m < len; m++) {
                            contentTops.push(parseInt(maxScroll - (height - heights[m] / totalHeight * height)));
                        }
                        break;
                    } else {
                        contentTops.push(parseInt(offsetTop));
                    }
                }
                contentsElem.addEventListener('scroll', function() {
                    var scrollTop = contentsElem.scrollTop;
                    for (var i = 0; i < length; i++) {
                        var offsetTop = contentTops[i];
                        var offset = Math.abs(offsetTop - scrollTop);
//                      console.log("i:"+i+",scrollTop:"+scrollTop+",offsetTop:"+offsetTop+",offset:"+offset);
                        if (scrollTop < offsetTop) {
                            if (scrollTop >= maxScroll) {
                                onScroll(length - 1);
                            } else {
                                onScroll(i - 1);
                            }
                            break;
                        } else if (offset < 20) {
                            onScroll(i);
                            break;
                        }else if(scrollTop >= maxScroll){
                            onScroll(length - 1);
                            break;
                        }
                    }
                });
                var lastIndex = 0;
                //监听content滚动
                var onScroll = function(index) {
                    if (lastIndex !== index) {
                        lastIndex = index;
                        var lastActiveElem = controlsElem.querySelector('.mui-active');
                        lastActiveElem && (lastActiveElem.classList.remove('mui-active'));
                        var currentElem = controlsElem.querySelector('.mui-control-item:nth-child(' + (index + 1) + ')');
                        currentElem.classList.add('mui-active');
                        //简单处理左侧分类滚动,要么滚动到底,要么滚动到顶
                        var controlScrollTop = controlWrapperElem.scrollTop;
                        if (controlScrollTop + controlWrapperHeight < controlTops[index]) {
                            controlWrapperElem.scrollTop = controlMaxScroll;
                        } else if (controlScrollTop > controlTops[index] - controlHeight) {
                            controlWrapperElem.scrollTop = 0;
                        }
                    }
                };
                //滚动到指定content
                var scrollTo = function(index) {
                    contentsElem.scrollTop = contentTops[index];
                };
                mui(controlsElem).on('tap', '.mui-control-item', function(e) {
                    scrollTo(this.getAttribute('data-index'));
                    return false;
                });
            })();
        </script>

    </body>

</html>

相关文章

网友评论

      本文标题:mui侧面选项卡 带有跳动效果的

      本文链接:https://www.haomeiwen.com/subject/lrhgwftx.html