基于mui+vue框架的跨平臺客戶端app---購物商城

涉及到知識點:

  • vue.js
  • 首頁底部Tab
  • banner廣告
  • 沉浸式狀態(tài)欄
  • 分類頂部切換的slider
  • 圖片預(yù)覽并保存到相冊
  • 拍照、掃碼、選擇本地文件
  • 側(cè)滑欄
  • 搜索列表頁兩層側(cè)滑欄篩選
  • 上拉刷新下拉加載
  • 登錄、退出邏輯處理

    主要功能點:
    首頁商品展示,商品分類,搜索列表汗销,商品詳情,購物車抵窒,下訂單弛针,個人中心,我的訂單/退單李皇,收貨地址管理

示例圖片

部分示例圖片


1.jpg
2.jpg
3.jpg
4.jpg
5.jpg
6.jpg
7.jpg
8.jpg
9.jpg

遇見的問題

  • 首頁底部的Tab
    html頁面
<nav class="mui-bar mui-bar-tab footerBar">
    <a id="defaultTab" class="mui-tab-item ft-tab-item mui-active" href="home.html">
        <span class=" mui-icon iconfont icon-m-ao"></span>
        <span class="mui-tab-label">首頁</span>
    </a>
    <a id="tab1" class="mui-tab-item ft-tab-item" href="classify.html">
        <span class="mui-icon iconfont icon-m-am"></span>
        <span class="mui-tab-label">分類</span>
    </a>
    <a id="tab2" class="mui-tab-item ft-tab-item" href="cart.html">
        <span class="mui-icon iconfont icon-m-y"></span>
        <span class="mui-tab-label">購物車</span>
    </a>
    <a id="tab3" class="mui-tab-item ft-tab-item" href="my.html">
        <span class="mui-icon iconfont icon-m-aq"></span>
        <span class="mui-tab-label">我的</span>
    </a>
</nav>

js代碼

//底部選項卡切換跳轉(zhuǎn)
(function jumpPage() {
    //跳轉(zhuǎn)頁面
    var subpages = ['view/home/home.html', 'view/home/classify.html', 'view/home/cart.html', 'view/home/my.html'];
    var ids = ['home.html', 'classify.html', 'cart.html', 'my.html'];
    var aniShow = {};
    //創(chuàng)建子頁面削茁,首個選項卡頁面顯示,其它均隱藏掉房;
    mui.plusReady(function() {
        plus.screen.lockOrientation("portrait-primary"); 
        var subpage_style = {
            top: '0px',
            bottom: '51px'
        };
        //設(shè)置bottom絕對位置
        //iphoneX中出現(xiàn)遮擋底部tab現(xiàn)象,采用js判斷屏幕大小方式改變bottom值
        //isIPhoneX() 要在plusReady后調(diào)用
        if (isIPhoneX()) {
            subpage_style = {
                top: '0px',
                bottom: '88px', //34px
                styles: {
                    "render": "always",
                }
            };
        }
        var self = plus.webview.currentWebview();
        for (var i = 0; i < 4; i++) {
            var temp = {};
            var sub = plus.webview.create(subpages[i], ids[i], subpage_style);
            if (i > 0) {
                sub.hide();
            } else {
                temp[ids[i]] = "true";
                mui.extend(aniShow, temp);
            }
            self.append(sub);
        }
    });
    //當(dāng)前激活選項
    var activeTab = ids[0];

    //選項卡點擊事件
    mui('.mui-bar-tab').on('tap', 'a', function(e) {
        e.preventDefault();
        var targetTab = this.getAttribute('href');
        if (targetTab == activeTab) {
            return;
        }
        //顯示目標(biāo)選項卡
        //若為iOS平臺或非首次顯示茧跋,則直接顯示
        if (mui.os.ios || aniShow[targetTab]) {
            plus.webview.show(targetTab);
        } else {
            //否則,使用fade-in動畫卓囚,且保存變量
            var temp = {};
            temp[targetTab] = "true";
            mui.extend(aniShow, temp);
            plus.webview.show(targetTab, "fade-in", 300);
        }
        //隱藏當(dāng)前;
        plus.webview.hide(activeTab);
        //更改當(dāng)前活躍的選項卡
        activeTab = targetTab;
    });
})()

注意iphoneX中出現(xiàn)遮擋底部tab現(xiàn)象,采用js判斷屏幕大小方式改變bottom值瘾杭,isIPhoneX(),isIPhoneX() 要在plusReady后調(diào)用哪亿。

  • 沉浸式狀態(tài)欄

1.在manifest.json文件粥烁,切換到代碼視圖贤笆,在plus -> statusbar 下添加immersed節(jié)點并設(shè)置值為true

"statusbar" : {
    "immersed" : true
},

2.__設(shè)置了沉浸式狀態(tài)欄后,狀態(tài)欄的高度變?yōu)?页徐,如圖所示

status1.jpg


輸入框把狀態(tài)擋住了苏潜,這時候需要重寫mui.css或者mui.min.css樣式表银萍,在樣式表底部添加如下一段樣式__:

*解決沉寖式狀態(tài)欄導(dǎo)致導(dǎo)航欄高度少20px的問題*/
.mui-bar-nav {
    height: 64px;
    padding-top: 22px;
}

.mui-bar-nav ~ .mui-content
{
    padding-top: 64px;
}

.mui-bar-nav ~ .mui-content .mui-pull-top-pocket
{
    top: 64px;
}

.mui-bar-nav ~ .mui-content.mui-scroll-wrapper .mui-scrollbar-vertical
{
    top: 64px;
}

.mui-bar-nav ~ .mui-content .mui-slider.mui-fullscreen
{
    top: 64px;
}

顯示效果如圖


status2.jpg

注意:以上操作后Android沉浸式狀態(tài)就完成了变勇,但是IOS還需在distribute節(jié)點下的apple節(jié)點下添加

"UIReserveStatusbarOffset" : false

本以為沉浸式狀態(tài)欄就完成了,結(jié)果老板iPhoneX手機顯示有問題贴唇,于是又單獨適配iPhoneX搀绣,具體操作:

在mui.js或者mui.min.js中底部添加如下一段代碼

/**
 * 適配iPhone X 系列手機的導(dǎo)航欄(包括狀態(tài)欄)
 */
mui.plusReady(function(){
    if(plus.navigator.isImmersedStatusbar() && isIPhoneX()){
        //.mui-bar-nav
        var nav = document.querySelector(".mui-bar-nav");
        if(nav){
            nav.style.cssText="height:88px; padding-top: 44px;";
        } else {
            return;
        }
        //.mui-bar-nav ~ .mui-content
        var content = document.querySelector(".mui-content");
        if (content) {
            content.style.paddingTop = "88px";
        } else {
            return;
        }
        //.mui-bar-nav ~ .mui-content .mui-pull-top-pocket
        var pullTopPocket_Arr = content.querySelectorAll(".mui-pull-top-pocket");
        if (pullTopPocket_Arr) {
            pullTopPocket_Arr.forEach(function(value){
                value.style.top = "88px";
            });
        }
        //.mui-bar-nav ~ .mui-content.mui-scroll-wrapper .mui-scrollbar-vertical
        var scrollbarVertical = document.querySelector(".mui-content.mui-scroll-wrapper .mui-scrollbar-vertical");
        if (scrollbarVertical) {
            scrollbarVertical.style.top = "88px";
        }
        //.mui-bar-nav ~ .mui-content .mui-slider.mui-fullscreen
        var slider_fullscreen_Arr = content.querySelectorAll(".mui-content .mui-slider.mui-fullscreen");
        if (slider_fullscreen_Arr) {
            slider_fullscreen_Arr.forEach(function(value){
                value.style.top = "88px";
            });
        }
    }
});

/**
 * 判斷是否為iPhone X 系列機型
 */
function isIPhoneX(){
    if(plus.device.model.indexOf('iPhone') > -1 && screen.height >= 812){
        return true;
    }else{
        return false;
    }
}
  • 標(biāo)題欄在IOS上存在的問題
    原生標(biāo)題欄
var styles = { // 窗口參數(shù) 參考5+規(guī)范中的WebviewStyle,也就是說WebviewStyle下的參數(shù)都可以在此設(shè)置
    titleNView: { // 窗口的標(biāo)題欄控件
        titleText: title, // 標(biāo)題欄文字,當(dāng)不設(shè)置此屬性時,默認(rèn)加載當(dāng)前頁面的標(biāo)題戳气,并自動更新頁面的標(biāo)題
        titleColor: "#FFFFFF", // 字體顏色,顏色值格式為"#RRGGBB",默認(rèn)值為"#000000"
        backgroundColor: "#E60012", // 控件背景顏色,顏色值格式為"#RRGGBB",默認(rèn)值為"#F7F7F7"
        autoBackButton: true
    }
}
plus.webview.create(url, id, styles, extras);

1.mui原生標(biāo)題欄链患,假如titleColor的值為小寫(#ffffff)的話,在IOS上不顯示標(biāo)題瓶您,必須要大寫(#FFFFFF)才顯示麻捻,親測

2.非原生標(biāo)題欄,假如頁面中有輸入框的話呀袱,軟鍵盤彈出贸毕,IOS上會把標(biāo)題欄頂上去,因為ios彈出軟鍵盤的時候夜赵,webview的高度沒有變化導(dǎo)致超出屏幕范圍明棍,
而plus這時候又會自動把header的 position:fixed 屬性設(shè)置為 position:relative,header就跟著滾動了寇僧。在mui社區(qū)找到一個的解決方案:

http://ask.dcloud.net.cn/question/10629

plus.webview.currentWebview().setStyle({  
    softinputMode: "adjustResize"  // 彈出軟鍵盤時自動改變webview的高度  
}); 

html, body {  
    height: 100%;  
    margin: 0px;  
    padding: 0px;  
    overflow: hidden;  
    -webkit-touch-callout: none;  
    -webkit-user-select: none;  
}  

.mui-content {  
    height: 100%;  
    overflow: auto;   
}   

這樣會解決IOS標(biāo)題欄頂上去的問題摊腋,但是這樣處理后,頁面打開標(biāo)題欄會有抖動嘁傀,雖然很短暫兴蒸,但是看著不爽,有更好的方案可以聯(lián)系我(QQ742330561)

  • 支付問題
    mui的支付還是比較好配置的,詳細(xì)的參照http://ask.dcloud.net.cn/article/71

  • 側(cè)滑導(dǎo)航主體內(nèi)容設(shè)置下拉刷新和上拉加載后不能滾動的問題
    使用div側(cè)滑欄的時候细办,給側(cè)滑欄主題設(shè)置了下拉刷新和上拉加載

mui.init({
    pullRefresh: {
        container: '#pullrefresh',
        down: {
            style: 'circle',
            callback: pulldownRefresh
        },
        up: {
            auto: false,
            contentrefresh: '正在加載...',
            callback: pullupRefresh
        }
    }
});

橙凳,頁面不能滾動,把這段代碼注釋掉后就能滾動了蟹腾,不知道是不是mui的bug痕惋,還是我沒找到合適的方法。

下面推薦webview模式側(cè)滑菜單

//plusReady事件后娃殖,自動創(chuàng)建menu窗口值戳;
main = plus.webview.currentWebview();
//setTimeout的目的是等待窗體動畫結(jié)束后,再執(zhí)行create webview操作炉爆,避免資源競爭堕虹,導(dǎo)致窗口動畫不流暢卧晓;
setTimeout(function() {
    menu = mui.preload({
        id: 'class-menu',
        url: 'class-menu.html',
        styles: {
            left: "20%",
            width: '80%',
            zindex: 10000
        }
    });
}, 500);

詳細(xì)查看demo的view/search/search.html和view/search/class-menu.html兩個文件。

  • 下拉刷新和其他控件的沖突

可以在控件某個事件觸發(fā)的時候赴捞,禁止?jié)L動下拉刷新逼裆,事件結(jié)束后在開啟

mui('#pullrefresh').pullRefresh().setStopped(true);//暫時禁止?jié)L動
mui('#pullrefresh').pullRefresh().setStopped(false);//開啟禁止?jié)L動

注意判斷mui('#pullrefresh').pullRefresh()是否為空,否則會報錯

項目地址

歡迎轉(zhuǎn)載赦政,但是請注明出處

示例源碼
個人Github主頁

如果對您有幫助胜宇,您可以 "Star" 支持一下哦, 謝謝恢着! ^^

該項目的數(shù)據(jù)和圖片來自網(wǎng)絡(luò)桐愉,均只用于案例展示,請勿用于其他用途掰派。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末从诲,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子靡羡,更是在濱河造成了極大的恐慌系洛,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,997評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件略步,死亡現(xiàn)場離奇詭異描扯,居然都是意外死亡,警方通過查閱死者的電腦和手機纳像,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評論 3 392
  • 文/潘曉璐 我一進店門荆烈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人竟趾,你說我怎么就攤上這事憔购。” “怎么了岔帽?”我有些...
    開封第一講書人閱讀 163,359評論 0 353
  • 文/不壞的土叔 我叫張陵玫鸟,是天一觀的道長。 經(jīng)常有香客問我犀勒,道長屎飘,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,309評論 1 292
  • 正文 為了忘掉前任贾费,我火速辦了婚禮钦购,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘褂萧。我一直安慰自己押桃,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,346評論 6 390
  • 文/花漫 我一把揭開白布导犹。 她就那樣靜靜地躺著唱凯,像睡著了一般羡忘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上磕昼,一...
    開封第一講書人閱讀 51,258評論 1 300
  • 那天卷雕,我揣著相機與錄音,去河邊找鬼票从。 笑死漫雕,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的纫骑。 我是一名探鬼主播蝎亚,決...
    沈念sama閱讀 40,122評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼先馆!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起躺彬,我...
    開封第一講書人閱讀 38,970評論 0 275
  • 序言:老撾萬榮一對情侶失蹤煤墙,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后宪拥,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體仿野,經(jīng)...
    沈念sama閱讀 45,403評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,596評論 3 334
  • 正文 我和宋清朗相戀三年她君,在試婚紗的時候發(fā)現(xiàn)自己被綠了脚作。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,769評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡缔刹,死狀恐怖球涛,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情校镐,我是刑警寧澤亿扁,帶...
    沈念sama閱讀 35,464評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站鸟廓,受9級特大地震影響从祝,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜引谜,卻給世界環(huán)境...
    茶點故事閱讀 41,075評論 3 327
  • 文/蒙蒙 一牍陌、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧员咽,春花似錦毒涧、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽萌狂。三九已至,卻和暖如春怀泊,著一層夾襖步出監(jiān)牢的瞬間茫藏,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評論 1 269
  • 我被黑心中介騙來泰國打工霹琼, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留务傲,地道東北人。 一個月前我還...
    沈念sama閱讀 47,831評論 2 370
  • 正文 我出身青樓枣申,卻偏偏與公主長得像售葡,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子忠藤,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,678評論 2 354

推薦閱讀更多精彩內(nèi)容