Mui实现webview侧滑模块

<!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">

        <link rel="stylesheet" href="css/mui.min.css">
        <style type="text/css">
            /* 解决滑动警告问题:Unable to preventDefault inside passive event listener */
             * { touch-action: pan-y; } 
        </style>
    </head>

    <body>
        <!-- 头部 -->
        <header class="mui-bar mui-bar-nav">
            <a class="mui-action-menu mui-icon mui-icon-bars mui-pull-left"></a>
            <!-- <a class="mui-action-back mui-btn mui-btn-link mui-pull-right">关闭</a> -->
            <h1 class="mui-title">标题</h1>
        </header>
        <!-- 底部选卡 -->
        <nav class="mui-bar mui-bar-tab">
            <a class="mui-tab-item mui-active">
                <span class="mui-icon mui-icon-home"></span>
                <span class="mui-tab-label">首页</span>
            </a>
            <a class="mui-tab-item">
                <span class="mui-icon mui-icon-phone"></span>
                <span class="mui-tab-label">电话</span>
            </a>
            <a class="mui-tab-item">
                <span class="mui-icon mui-icon-email"></span>
                <span class="mui-tab-label">邮件</span>
            </a>
            <a class="mui-tab-item">
                <span class="mui-icon mui-icon-gear"></span>
                <span class="mui-tab-label">设置</span>
            </a>
        </nav>
    </body>
    <script src="js/mui.min.js"></script>
    <script>
        var main,menu, mask = mui.createMask(_closeMenu);
        var showMenu = false,mode = 'menu-move';
        // var mode = 'main-move';
        if (!mui.os.android) {
            //整体滑动暂不支持android手机,因为两个页面的移动动画,无法保证同步性;
            document.getElementById("move-togger").classList.remove('mui-hidden');
            var spans = document.querySelectorAll('.android-only');
            for (var i=0,len=spans.length;i<len;i++) {
                spans[i].style.display = "none";
            }
        }

        mui.init({
            swipeBack: false,
            beforeback: back
        });

        function back() {
            if (showMenu) {
                //菜单处于显示状态,返回键应该先关闭菜单,阻止主窗口执行mui.back逻辑;
                closeMenu();
                return false;
            } else {
                //菜单处于隐藏状态,执行返回时,要先close菜单页面,然后继续执行mui.back逻辑关闭主窗口;
                menu.close('none');
                return true;
            }
        }
        //plusReady事件后,自动创建menu窗口;
        mui.plusReady(function() {
            main = plus.webview.currentWebview();
            //setTimeout的目的是等待窗体动画结束后,再执行create webview操作,避免资源竞争,导致窗口动画不流畅;
            setTimeout(function () {
                //侧滑菜单默认隐藏,这样可以节省内存;
                menu = mui.preload({
                    id: 'test',
                    url: 'test.html',
                    styles: {
                        left: 0,
                        width: '70%',
                        zindex: 9997
                    }
                });
            },300);
            //页面底部切换处理
        });
        /**
         * 显示菜单菜单
         */
        function openMenu() {
            if (!showMenu) {
                //侧滑菜单处于隐藏状态,则立即显示出来;
                //显示完毕后,根据不同动画效果移动窗体;
                menu.show('none', 0, function() {
                    switch (mode){
                        case 'main-move':
                            //主窗体开始侧滑;
                            main.setStyle({
                                left: '70%',
                                transition: {
                                    duration: 150
                                }
                            });
                            break;
                        case 'menu-move':
                            menu.setStyle({
                                left: '0%',
                                transition: {
                                    duration: 150
                                }
                            });
                            break;
                        case 'all-move':
                            main.setStyle({
                                left: '70%',
                                transition: {
                                    duration: 150
                                }
                            });
                            menu.setStyle({
                                left: '0%',
                                transition: {
                                    duration: 150
                                }
                            });
                            break;
                    }
                });
                //显示遮罩
                mask.show();
                showMenu = true;
            }
        }
        /**
         * 关闭侧滑菜单
         */
        function closeMenu () {
            _closeMenu();
            //关闭遮罩
            mask.close();
        }
        
        /**
         * 关闭侧滑菜单(业务部分)
         */
        function _closeMenu() {
            if (showMenu) {
                //关闭遮罩;
                switch (mode){
                    case 'main-move':
                        //主窗体开始侧滑;
                        main.setStyle({
                            left: '0',
                            transition: {
                                duration: 150
                            }
                        });
                        break;
                    case 'menu-move':
                        //主窗体开始侧滑;
                        menu.setStyle({
                            left: '-70%',
                            transition: {
                                duration: 150
                            }
                        });
                        break;
                    case 'all-move':
                        //主窗体开始侧滑;
                        main.setStyle({
                            left: '0',
                            transition: {
                                duration: 150
                            }
                        });
                        //menu页面同时移动
                        menu.setStyle({
                            left: '-70%',
                            transition: {
                                duration: 150
                            }
                        });
                        
                        break;
                }
                
                //等窗体动画结束后,隐藏菜单webview,节省资源;
                setTimeout(function() {
                    menu.hide();
                }, 200);
                //改变标志位
                showMenu = false;
            }
        }

         //点击左上角图标,打开侧滑菜单;
        document.querySelector('.mui-icon-bars').addEventListener('tap', openMenu);
        // document.getElementById("show-btn").addEventListener('tap',openMenu);
         //在android4.4中的swipe事件,需要preventDefault一下,否则触发不正常
         //故,在dragleft,dragright中preventDefault
        window.addEventListener('dragright', function(e) {
            e.detail.gesture.preventDefault();
        });
        window.addEventListener('dragleft', function(e) {
            e.detail.gesture.preventDefault();
        });
         //主界面向右滑动,若菜单未显示,则显示菜单;否则不做任何操作;
        window.addEventListener("swiperight", openMenu);
         //主界面向左滑动,若菜单已显示,则关闭菜单;否则,不做任何操作;
        window.addEventListener("swipeleft", closeMenu);
         //menu页面向左滑动,关闭菜单;
        window.addEventListener("menu:swipeleft", closeMenu);

        //重写mui.menu方法,Android版本menu按键按下可自动打开、关闭侧滑菜单;
        mui.menu = function() {
            if (showMenu) {
                closeMenu();
            } else {
                openMenu();
            }
        }
    </script>
</html>

 

手机上的运行效果:

 

参考:Mui官网

 

posted @ 2019-10-11 16:45  Jayer  阅读(612)  评论(0编辑  收藏  举报