Web APP 二

前言

关于MUI框架就不多介绍了,和其它前端框架差不多,具体的可以看官方文档,HBuilderMUI都是DCloud 即数字天堂(北京)网络技术有限公司退出的产品,同时是国内HTML5产业的领军企业, W3C会员, HTML5中国产业联盟发起单位.

思考

具体教材就不写了,记录一下自己的思路。主要用到的就是MUI框架,iconfont的图标,还有和风天气提供的接口,和找工具提供的接口。

app的人口页面还是 index.html

<!DOCTYPE html>
<html>

    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
        <title>app入口页面</title>
        <link href="css/mui.min.css" rel="stylesheet" />
        <!--引入公用样式-->
        <link rel="stylesheet" type="text/css" href="css/public.css"/>
        <style type="text/css">
            body {
                background-color: rgba(0, 0, 0, 0);
            }
        </style>
    </head>

    <body>
        <script src="js/mui.min.js"></script>
        <script type="text/javascript" charset="utf-8">
            mui.init();
            mui.plusReady(function() {
                /**
                 * 获取本地存储中launchFlag的值
                 * http://www.html5plus.org/doc/zh_cn/storage.html#plus.storage.getItem
                 * 若存在,说明不是首次启动,直接进入首页;
                 * 若不存在,说明是首次启动,进入引导页;
                 */
                var launchFlag = plus.storage.getItem("launchFlag");
                if(launchFlag) {
                    mui.openWindow({
                        url: "main.html",
                        id: "main",
                        show: {
                            autoShow: true, //页面loaded事件发生后自动显示,默认为true
                            aniShow: 'none', //页面显示动画,默认为”slide-in-right“;
                            duration: 0 //页面动画持续时间,Android平台默认100毫秒,iOS平台默认200毫秒;
                        },
                    });
                } else {
                    mui.openWindow({
                        url: "guidePage.html",
                        id: "guidePage",
                        show: {
                            autoShow: true, //页面loaded事件发生后自动显示,默认为true
                            aniShow: 'none', //页面显示动画,默认为”slide-in-right“;
                            duration: 0 //页面动画持续时间,Android平台默认100毫秒,iOS平台默认200毫秒;
                        },
                    });
                }
            });
            /**
             * 重写mui.back(),一秒内连续点击两次,退出应用,仅安卓有效;
             */
            var first = null;
            mui.back = function() {
                if(!first) {
                    first = new Date().getTime();
                    /**
                     * 自动消失提示信息
                     * http://www.html5plus.org/doc/zh_cn/nativeui.html#plus.nativeUI.toast
                     */
                    plus.nativeUI.toast("再按一次退出应用");
                    setTimeout(function() {
                        first = null;
                    }, 1000);
                } else {
                    if(new Date().getTime() - first < 1000) {
                        /**
                         * 退出应用,仅安卓有效;
                         * http://www.html5plus.org/doc/zh_cn/runtime.html#plus.runtime.quit
                         */
                        plus.runtime.quit();
                    }
                }
            };
        </script>
    </body>

</html>

入口页面主要就是,判断是否首次启动,对退出应用的判断

假如是不是首次启动就进入引导页面 guidePage.html

<!doctype html>
<html>

    <head>
        <meta charset="UTF-8">
        <title>引导页</title>
        <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
        <link href="css/mui.min.css" rel="stylesheet" />
        <!--引入公用样式-->
        <link rel="stylesheet" type="text/css" href="css/public.css"/>
        <style type="text/css">
            /*
             *样式文件
             **/
            
            body {
                background-color: rgba(0, 0, 0, 0);
            }
            
            .guide-img {
                width: 100%;
            }
            
            #start {
                position: absolute;
                bottom: 50px;
                width: 60%;
                left: 20%;
                color: #3856D0;
                height: 40px;
                border-radius: 20px;
            }
            
            #slider-dot {
                bottom: 20px !important;
            }
        </style>
    </head>

    <body>
        <div class="mui-content">
            <div id="slider" class="mui-slider">
                <div class="mui-slider-group">
                    <!-- 第一张 -->
                    <div class="mui-slider-item">
                        <a href="#">
                            <img src="images/bgimg1.jpg">
                        </a>
                    </div>
                    <!-- 第二张 -->
                    <div class="mui-slider-item">
                        <a href="#">
                            <img src="images/bgimg2.jpg">
                        </a>
                    </div>
                    <!-- 第三张 -->
                    <div class="mui-slider-item">
                        <a href="#">
                            <img src="images/bgimg3.jpg">
                            <button class="mui-btn mui-btn-blue mui-btn-outlined" type="button" id="start">开始体验</button>
                        </a>
                    </div>
                </div>
                <div class="mui-slider-indicator" id="slider-dot">
                    <div class="mui-indicator mui-active"></div>
                    <div class="mui-indicator"></div>
                    <div class="mui-indicator"></div>
                </div>
            </div>
        </div>
        <script src="js/mui.min.js"></script>
        <script type="text/javascript">
            mui.init();
            mui.plusReady(function() {
                /**
                 * 获取系统状态栏高度
                 * http://www.html5plus.org/doc/zh_cn/navigator.html#plus.navigator.getStatusbarHeight
                 */
                var sh = plus.navigator.getStatusbarHeight();
                /**
                 * 获取设备屏幕高度分辨率以及宽度分辨率
                 * http://www.html5plus.org/doc/zh_cn/device.html#plus.screen.resolutionHeight
                 * http://www.html5plus.org/doc/zh_cn/device.html#plus.screen.resolutionWidth
                 */
                var h = plus.screen.resolutionHeight;
                var w = plus.screen.resolutionWidth;
                /**
                 * 设置图片高度,这里图片并不规范;
                 * 实际开发中,建议大家制作iphone6plus规格的图片;
                 */
                var imgs = document.querySelectorAll(".guide-img");
                for(var i = 0, len = imgs.length; i < len; i++) {
                    imgs[i].style.height = (h - sh) + "px";
                    imgs[i].style.width = w + "px";
                }
                /**
                 * 手动关闭启动页
                 * http://www.html5plus.org/doc/zh_cn/navigator.html#plus.navigator.closeSplashscreen
                 */
                plus.navigator.closeSplashscreen();
                document.getElementById("start").addEventListener("tap", function() {
                    /**
                     * 向本地存储中设置launchFlag的值,即启动标识;
                     * http://www.html5plus.org/doc/zh_cn/storage.html#plus.storage.setItem
                     */
                    plus.storage.setItem("launchFlag", "true");
                    var index = plus.webview.create('index.html', 'index');
                    index.show("none", 150);
                });
            });
            /**
             * 重写mui.back(),什么都不执行,反之用户返回到入口页;
             */
            mui.back = function() {};
        </script>
    </body>

</html>

进入了引导页,我们点击手动关闭启动页,同时也向本地存储中设置了launchFlag的值,这样我们的主页面会再次判断是否可以获取launchFlag的值,如果可以,我们就进入main.html,这样的话main.html其实才是我们能够看到的首页。

<!DOCTYPE html>
<html>

    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
        <title>主页面</title>
        <link href="css/mui.min.css" rel="stylesheet" />
        <link href="css/iconfont.css" rel="stylesheet" />
        <!--引入公用样式-->
        <link rel="stylesheet" type="text/css" href="css/public.css"/>
    </head>

    <body class="dp-n" id="body">
        <header class="mui-bar mui-bar-nav titleBar-bgcolor" id="header">
            <h1 class="mui-title titleBar-color">首页</h1>
        </header>
        <nav class="mui-bar mui-bar-tab tabBar-bgcolor">
            <a class="mui-tab-item mui-active" data-id="home">
                <span class="mui-icon iconfont icon-shouye"></span>
                <span class="mui-tab-label">首页</span>
            </a>
            <a class="mui-tab-item" data-id="weather">
                <span class="mui-icon iconfont icon-tianqi"></span>
                <span class="mui-tab-label">天气</span>
            </a>
            <a class="mui-tab-item" data-id="news">
                <span class="mui-icon iconfont icon-zhinanzhen1"></span>
                <span class="mui-tab-label">广播</span>
            </a>
            <a class="mui-tab-item" data-id="about">
                <span class="mui-icon iconfont icon-guanyu"></span>
                <span class="mui-tab-label">关于</span>
            </a>
        </nav>
        <!--这里面是content页面-->
        <div class="mui-content"></div>
        <script src="js/mui.min.js"></script>
        <script src="js/immersed.js"></script>
        <script type="text/javascript" charset="utf-8">
            mui.init({
                statusBarBackground: '#009be0'
            });
            mui.plusReady(function() {
                plus.nativeUI.showWaiting("加载中...");
                var topoffset = '45px';
                if(plus.navigator.isImmersedStatusbar()){
                    topoffset = (Math.round(plus.navigator.getStatusbarHeight())+45)+'px';
                }
                document.getElementById('header').style.height = (immersed+44)+'px';
                document.querySelector('.mui-content').style.marginTop = (immersed)+'px';
                
                /**
                 * 手动关闭启动界面
                 */
                plus.navigator.closeSplashscreen();

                /**
                 *把页面存在数组里面 
                 **/
                var subInfos = [{
                    url: 'pages/home.html',
                    id: 'home'
                }, {
                    url: 'pages/weather.html',
                    id: 'weather',
                }, {
                    url: 'pages/news.html',
                    id: 'news'
                }, {
                    url: 'pages/about.html',
                    id: 'about'
                }];

                /**
                 *设置头部底部高度 
                 **/
                var subStyles = {
                    top: (immersed+44)+'px',
                    bottom: '51px'
                };

                /**
                 * 根据id查询子页面的信息
                 */
                var getSubInfoById = function(infoList, id) {
                    var result = null;
                    for(var i = 0, len = infoList.length; i < len; i++) {
                        var _info = infoList[i];
                        if(_info.id === id) {
                            result = _info;
                            break;
                        }
                    }
                    return result;
                };

                var mainWv = plus.webview.currentWebview();
                var titleEL = document.querySelector('.mui-title');
                var activeTab = '';

                /**
                 * 默认只加载首页webview
                 */
                var homeWv = plus.webview.create(subInfos[0].url, subInfos[0].id, subStyles);
                mainWv.append(homeWv);
                activeTab = subInfos[0].id;
                plus.nativeUI.closeWaiting();
                document.getElementById("body").className = "";

                /**
                 * 点击切换,动态创建其它webview;
                 */
                mui('.mui-bar-tab').on('tap', 'a.mui-tab-item', function(e) {
                    var _self = this;
                    var targetTab = _self.getAttribute('data-id');
                    if(targetTab === activeTab) {
                        return;
                    }
                    titleEL.innerText = _self.querySelector('.mui-tab-label').innerText;
                    var _subWv = plus.webview.getWebviewById(targetTab);
                    /*
                     *若webview不存在,则创建;
                     **/
                    if(!_subWv) {
                        var _subInfo = getSubInfoById(subInfos, targetTab);
                        _subWv = plus.webview.create(_subInfo.url, _subInfo.id, subStyles);
                        mainWv.append(_subWv);
                    }
                    _subWv.show();
                    /**
                     * 隐藏之前的webview
                     */
                    plus.webview.getWebviewById(activeTab).hide('none');
                    activeTab = targetTab;
                });
            });

            /**
             * 重写mui.back(),一秒内连续点击两次,退出应用,仅安卓有效;
             */
            var first = null;
            mui.back = function() {
                if(!first) {
                    first = new Date().getTime();
                    /**
                     * 自动消失提示信息
                     * http://www.html5plus.org/doc/zh_cn/nativeui.html#plus.nativeUI.toast
                     */
                    plus.nativeUI.toast("再按一次退出应用");
                    setTimeout(function() {
                        first = null;
                    }, 1000);
                } else {
                    if(new Date().getTime() - first < 1000) {
                        /**
                         * 退出应用,仅安卓有效;
                         * http://www.html5plus.org/doc/zh_cn/runtime.html#plus.runtime.quit
                         */
                        plus.runtime.quit();
                    }
                }
            };
        </script>
    </body>

</html>

我们在main.html设置了头部和下面的导航栏,固定导航的位置和样式,分了4个模块,我们默认是进入home.html页面。同时创建了子页面的webview的方法。

剩下的就很清晰了,我们只需要创建子页面。home.html,weather.html,news.html,about.html。大体的和web页面构思是差不多的,不过我们选用的是MUI框架还是根据官方文档来完善。

待续。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,465评论 25 707
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,598评论 18 139
  • 以前发过两篇17年的读书小结,后来就没发了。并不是没有继续坚持读书,而是太忙了。现在整理了17年的全部书单,没读完...
    请叫我eleven阅读 389评论 0 2
  • 即将中考的你,对中考数学试卷架构了解吗?随着新课改不断推进,中考数学试卷注意了控制题量与阅读量,有效减轻了学生的考...
    教育特工阅读 551评论 0 5