1. 程式人生 > >MUI的webview模式-縮放式側滑(類手機QQ)

MUI的webview模式-縮放式側滑(類手機QQ)

MUI提供了非常多的控制元件,我想其中的側滑導航大多數MUI使用者都在使用,並且遇到不少難題。MUI模板裡面有一個非常亮眼的側滑導航當屬縮放式導航(類手機QQ),這是一個DIV模式的縮放式側滑,它的優點是可以跟著手勢滑動,缺點是不可以複用,其實它還有其它缺點,比如在主頁面擁有子webview的情況下,這種縮放式側滑就無法使用了,由於是div模式的,子webview並不會跟著一起縮放。這就不得不讓人捨棄主頁面的子webview了,但是一般主頁面都有下拉重新整理控制元件的,而下拉重新整理最佳的拖動效能是必須使用一個單獨的webview去裝載下拉重新整理(使用原生body滾動,並且下拉拖動的是webview不是div)

,如下圖,中間下拉重新整理是一個webview,導航和底部選單是一個webview,因此遇到這種情況我們就需要採用webview模式的縮放式側滑。


這裡我使用webview模式開發的縮放式側滑,做的不好的地方請指教。主要思路是讓一個左滑webview被擋在主webview之下;首先有一個側滑頁面的webview和主頁面的webview,主頁面下有一個子webview。我們先預載入左邊的側滑頁面member/left.html,程式碼圖片如下(未登入情況下的左邊滑動webview,注意佈局右邊留一部分空白提供遮擋):

// 預載入側滑頁面,先讓頁面藏在顯示區域之外-100%
		  	var memberLeftView = mui.preload({
			    url:'views/member/left.html',
			    id:'views/member/left.html',
			    styles: {
					left: "-100%",
					zindex: -9997,
					render:'always'
				}
			});

左邊圖片如下:


然後在觸發側滑的時候設定頁面webview的移動位置,側滑頁面首先右移到顯示區域,主頁面的webview移動到left: '70%',top: '10%',bottom: '10%',的位置,同時開啟遮罩(webview的遮罩會同時把子頁面也一起遮罩),動畫300毫秒的移動時間,注意:切勿使用mui.createMash(callback);去建立遮罩,因為主頁面是有子webview,會造成不同步且會出現閃動情況,另外render:'always'可以避免每次去渲染dom,增強webview的縮放體驗。接著在關閉遮罩的時候,再移回原來的位置,這樣就實現了簡單的webview模式的縮放式側滑。注意:恢復正常介面的時候隱藏側滑頁面,避免資源消耗。

程式碼如下:

                        // 我的頭像的點選事件
			document.getElementById('reho-left-me').addEventListener('tap', function() {
				// 側滑頁面出現右移到顯示區域
				GO_Index.memberLeftView.show('none', 0, function() {
					GO_Index.memberLeftView.setStyle({
						left: '0',
					});
				});
				// 主介面右移
				GO_Index.indexView.show('none', 0, function() {
					GO_Index.indexView.setStyle({
						left: '70%',
						top: '10%',
						bottom: '10%',
						mask: 'rgba(0,0,0,0.5)',
						transition: {
							duration: 300
						}
					});
				});
				
				// 每次移除遮罩點選事件,避免重複新增監聽
				GO_Index.indexView.removeEventListener('maskClick');
				// 點選關閉遮罩時
				GO_Index.indexView.addEventListener('maskClick', function(){
					// 主介面移動到最大顯示區域
					GO_Index.indexView.setStyle({
						left: '0',
						top: '0',
						bottom: '0',
						mask: 'none',
						transition: {
							duration: 300
						}
					});
					// 側滑介面移出顯示區域之外
					GO_Index.memberLeftView.setStyle({
						left: "-100%",
						transition: {
							duration: 300
						}
					});
					// 隱藏側滑頁面,setTimeout避免競爭資源
					setTimeout(function() {
						GO_Index.memberLeftView.hide();
					}, 300);
					
				},false);
				
			});

實現效果如下圖:


感謝你的閱讀,webview模式的縮放是為了彌補存在子webview的情況下實現縮放式側滑的難題。存在不足的地方請指教,謝謝!更多精彩內容請訪問DCloud官網(http://www.dcloud.io/)