uni-app、H5+ 仿IOS 實現(xiàn) 安卓手勢拖拽右滑關閉當前頁面并返回上級頁面 + 陰影效果

背景

在我們日常開發(fā)中研侣,經常會效仿某些流行APP渲染動畫效果谱邪,用來滿足自己開發(fā)或公司開發(fā)的日常需要,學習一下新的東西還是好的庶诡,本案例是 仿IOS 手勢拖拽右滑?關閉當前頁面并返回主頁的一個案例

預覽效果

實現(xiàn)方案

基于H5+方案

說明:本示例是基于HBuilderX 構建的 5 + App模板僅僅用于測試惦银,當然大家可以用Vue 腳手架 或者其他的腳手架 構建 都可以。

第一步末誓、創(chuàng)建項目命名hello-mui-example

第二步扯俱、我在官方模板中加入了一個頁面用于測試,項目目錄:

hello-mui-example/examples/webview-drag.html? ?

入口 index.html 加入了 li 鏈接標簽

第三步喇澡、用HBuilderX內置瀏覽器運行迅栅,看項目是否啟動成功

訪問:http://127.0.0.1:9220/hello-mui-example/index.html

端口:9220是隨機生成的,具體看自身機器情況

手機訪問滑動效果(僅支持App端晴玖,用HBuilderX 真機模擬測試)

第四步读存、查看webview-drag.html具體的代碼實現(xiàn)

<!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 rel="stylesheet" href="../css/mui.min.css">    <script src="../js/mui.min.js"></script>  </head>  <body>    <script type="text/javascript">      mui.init();      function plusReady() {        //獲取當前窗口          var ws = plus.webview.currentWebview();        //監(jiān)聽當前側滑窗口的右滑        ws.drag({          direction: 'right',          moveMode: 'followFinger'        }, {          view: plus.runtime.appid,          moveMode: 'silent'        }, function(e) {          if (e.type == 'end' && e.result) {            console.log('程序執(zhí)行到這里已經返回到目標窗口了');          }        });      }      if (window.plus) {        plusReady();      } else {        document.addEventListener("plusready", plusReady, false);      }</script>    <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">webview-drag 演示示例</h1>    </header>    <div class="mui-content">      <div class="mui-content-padded">        <h2>右側滑動試試看</h2>      </div>    </div>      </body></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 rel="stylesheet" href="../css/mui.min.css">    <script src="../js/mui.min.js"></script>  </head>  <body>    <script type="text/javascript">      mui.init();      function plusReady() {        //獲取當前窗口          var ws = plus.webview.currentWebview();        //獲取首頁入口webview        var homeWs = plus.webview.getWebviewById(plus.runtime.appid);        //監(jiān)聽當前側滑窗口的右滑        ws.drag({          direction: 'right',          moveMode: 'followFinger'        }, {          view: homeWs,          moveMode: 'silent'        }, function(e) {          // 顯示遮罩層          homeWs.setStyle({mask:'rgba(0,0,0,0.5)'});          if (e.type == 'end' && e.result) {            console.log('程序執(zhí)行到這里已經返回到目標窗口了');            //關閉遮罩層            homeWs.setStyle({mask:'none'});            mui.back();//關閉當前頁面 關閉webview 防止第二次openWindow()打不開          }        });      }      if (window.plus) {        plusReady();      } else {        document.addEventListener("plusready", plusReady, false);      }</script>    <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">webview-drag 演示示例</h1>    </header>    <div class="mui-content">      <div class="mui-content-padded">        <h2>右側滑動試試看</h2>      </div>????</div>  </body></html>

修改后的效果圖

分析代碼:

/* H5+文檔:https://www.html5plus.org/doc/zh_cn/webview.html#plus.webview.currentWebview?獲取當前窗口*/plus.webview.currentWebview();/*  H5+文檔:https://www.html5plus.org/doc/zh_cn/webview.html#plus.webview.getWebviewById   如果要獲取應用入口頁面所屬的Webview窗口呕屎,其標識為應用的%APPID%让簿,    可通過plus.runtime.appid獲取 */plus.runtime.appidvar homeWs = plus.webview.getWebviewById(plus.runtime.appid);/*   WebviewDragEvent:https://www.html5plus.org/doc/zh_cn/webview.html#plus.webview.WebviewDragEvent   WebviewDragOptions:https://www.html5plus.org/doc/zh_cn/webview.html#plus.webview.WebviewDragOptions?? WebviewDragOtherViewOptions:https://www.html5plus.org/doc/zh_cn/webview.html#plus.webview.WebviewDragOtherViewOptions ?  */ws.drag({ /* WebviewDragOptions 右滑拖拽的當前窗口 */  direction: 'right',  moveMode: 'followFinger'},?{?/*?WebviewDragOtherViewOptions?右滑拖拽結束后的目標窗口?*/  view: plus.runtime.appid,  moveMode: 'silent'}, function(e) { /* WebviewDragEvent 事件回調函數(shù) */? /* 還可以做其他額事情  看自己喲 */??/*?顯示遮罩層???   https://www.html5plus.org/doc/zh_cn/webview.html#plus.webview.WebviewStyles      mask: (String 類型 )窗口的遮罩      用于設置Webview窗口的遮罩層樣式,遮罩層會覆蓋Webview中所有內容秀睛,      包括子webview尔当,并且截獲webview的所有觸屏事件,      此時Webview窗口的點擊操作會觸發(fā)maskClick事件蹂安。      字符串類型椭迎,可取值:rgba格式字符串锐帜,定義純色遮罩層樣式,      如"rgba(0,0,0,0.5)"畜号,表示黑色半透明抹估;"none",表示不使用遮罩層弄兜;       默認值為"none",即無遮罩層瓷式。?? */  homeWs.setStyle({mask:'rgba(0,0,0,0.5)'});  if (e.type == 'end' && e.result) {    console.log('程序執(zhí)行到這里已經返回到目標窗口了');    //關閉遮罩層    homeWs.setStyle({mask:'none'});????mui.back();//關閉當前頁面?關閉webview?防止第二次openWindow()打不開  }});

基于H5+方案——可能遇到的問題

  • 增加遮罩層的問題替饿,上面已經提過優(yōu)化代碼了,這里不在詳細說明贸典,只是備注

  • 列表點擊第一次是可以打開頁面视卢,第二次沒有打開頁面,解決方案如下:

    a.僅僅是為了測試效果廊驼,截取了index.html中點擊觸發(fā)函數(shù)代碼

    //主列表點擊事件      mui('#list').on('tap', 'a', function() {        var href = this.getAttribute('href');        //中間dde 省略        /*             增加如下代碼据过,每次點擊都生成webview,             options.createNew = true             uni-app 官方解答社區(qū):https://ask.dcloud.net.cn/question/6514             mui 官方文檔:https://dev.dcloud.net.cn/mui/window/#openwindow             上面兩個文檔詳細的介紹了關于openWindow的使用方式以及webview創(chuàng)建的最佳方式妒挎,             本示例绳锅,僅僅是為了演示效果        */          options.createNew = true, ??????????//打開新窗口??????????mui.openWindow(href,id,options);       });

    ??????? b.就是根據(jù)官方說的自定義事件來處理或者是在返回頁面時直接mui.back(),代碼如下:

    mui.back();//關閉當前頁面 關閉webview 防止第二次openWindow()打不開

    以上就是H5+ app 仿IOS 實現(xiàn) 安卓手機拖拽效果酝掩,示例代碼都已經標明

    基于uni-app 實現(xiàn)方案

    這個估計是大家最常用的了鳞芙,項目的基本搭建過程就忽略了,主要核心代碼跟H5+類似期虾,其他頁面棧數(shù)據(jù)獲取的稍有不同原朝,這里直接上代碼:

    //?在頁面的?onLoad?生命周期?中進行處理onLoad() {        //獲取頁面棧 所有頁面窗口      let pages = getCurrentPages();        // 獲取首頁webview對象,頁面棧數(shù)組第一個元素為首頁頁面對象      let homePage = pages[0];       let hometWs = homePage.$getAppWebview();        //獲取當前頁面窗口webview對象 頁面棧數(shù)組第二個元素為當前頁面對象      let page = pages[pages.length - 1];      let ws = page.$getAppWebview();      ws.drag(      {        direction: 'right',        moveMode: 'followFinger'      }, {        view: hometWs,        moveMode: 'silent'      }, function(e) {        console.log('Left WebviewDragEvent: ' + JSON.stringify(e));          // 顯示遮罩層        hometWs.setStyle({mask:'rgba(0,0,0,0.5)'});        if (e.type == 'end' && e.result) {            //關閉遮罩層          hometWs.setStyle({mask:'none'});        }      })},

    參考如下文檔:

    uni-app官方文檔:

    https://uniapp.dcloud.io/collocation/frame/window?id=getcurrentpages

    H5+官方文檔:

    https://www.html5plus.org/doc/zh_cn/webview.html#plus.webview.WebviewDragEvent

    https://www.html5plus.org/doc/zh_cn/webview.html#plus.webview.WebviewDragOptions

    https://www.html5plus.org/doc/zh_cn/webview.html#plus.webview.WebviewDragOtherViewOptions

    最后

    以上就是今天分享的內容镶苞,干貨滿滿喳坠,希望對大家有幫助。示例代碼基本上都貼出來了茂蚓,如果需要源代碼的請公眾號留言

    點擊下方卡片/微信搜索壕鹉,關注公眾號“天宇文創(chuàng)意樂派”(ID:gh_cc865e4c536b)

    聽說點贊和關注本號的都找到漂亮的小姐姐了喲且年后必入百萬呀!聋涨!

    本文使用 文章同步助手 同步

    ?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
    • 序言:七十年代末御板,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子牛郑,更是在濱河造成了極大的恐慌怠肋,老刑警劉巖,帶你破解...
      沈念sama閱讀 223,002評論 6 519
    • 序言:濱河連續(xù)發(fā)生了三起死亡事件淹朋,死亡現(xiàn)場離奇詭異笙各,居然都是意外死亡钉答,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
      沈念sama閱讀 95,357評論 3 400
    • 文/潘曉璐 我一進店門杈抢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來数尿,“玉大人,你說我怎么就攤上這事惶楼∮冶模” “怎么了?”我有些...
      開封第一講書人閱讀 169,787評論 0 365
    • 文/不壞的土叔 我叫張陵歼捐,是天一觀的道長何陆。 經常有香客問我,道長豹储,這世上最難降的妖魔是什么贷盲? 我笑而不...
      開封第一講書人閱讀 60,237評論 1 300
    • 正文 為了忘掉前任,我火速辦了婚禮剥扣,結果婚禮上巩剖,老公的妹妹穿的比我還像新娘。我一直安慰自己钠怯,他們只是感情好佳魔,可當我...
      茶點故事閱讀 69,237評論 6 398
    • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著晦炊,像睡著了一般吃引。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上刽锤,一...
      開封第一講書人閱讀 52,821評論 1 314
    • 那天镊尺,我揣著相機與錄音,去河邊找鬼并思。 笑死庐氮,一個胖子當著我的面吹牛,可吹牛的內容都是我干的宋彼。 我是一名探鬼主播弄砍,決...
      沈念sama閱讀 41,236評論 3 424
    • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼输涕!你這毒婦竟也來了音婶?” 一聲冷哼從身側響起,我...
      開封第一講書人閱讀 40,196評論 0 277
    • 序言:老撾萬榮一對情侶失蹤莱坎,失蹤者是張志新(化名)和其女友劉穎衣式,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
      沈念sama閱讀 46,716評論 1 320
    • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
      茶點故事閱讀 38,794評論 3 343
    • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了冕房。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
      茶點故事閱讀 40,928評論 1 353
    • 序言:一個原本活蹦亂跳的男人離奇死亡婶博,死狀恐怖,靈堂內的尸體忽然破棺而出荧飞,到底是詐尸還是另有隱情凡人,我是刑警寧澤,帶...
      沈念sama閱讀 36,583評論 5 351
    • 正文 年R本政府宣布叹阔,位于F島的核電站挠轴,受9級特大地震影響,放射性物質發(fā)生泄漏条获。R本人自食惡果不足惜,卻給世界環(huán)境...
      茶點故事閱讀 42,264評論 3 336
    • 文/蒙蒙 一蒋歌、第九天 我趴在偏房一處隱蔽的房頂上張望帅掘。 院中可真熱鬧,春花似錦堂油、人聲如沸修档。這莊子的主人今日做“春日...
      開封第一講書人閱讀 32,755評論 0 25
    • 文/蒼蘭香墨 我抬頭看了看天上的太陽吱窝。三九已至,卻和暖如春迫靖,著一層夾襖步出監(jiān)牢的瞬間院峡,已是汗流浹背。 一陣腳步聲響...
      開封第一講書人閱讀 33,869評論 1 274
    • 我被黑心中介騙來泰國打工系宜, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留照激,地道東北人。 一個月前我還...
      沈念sama閱讀 49,378評論 3 379
    • 正文 我出身青樓盹牧,卻偏偏與公主長得像俩垃,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子汰寓,可洞房花燭夜當晚...
      茶點故事閱讀 45,937評論 2 361

    推薦閱讀更多精彩內容