Cordova 自定義彈窗

一.前言

前陣子做公司的項(xiàng)目攒至,是用混合開(kāi)發(fā)cordova來(lái)開(kāi)發(fā)APP峻黍,開(kāi)發(fā)過(guò)程中,需要用到從底部向上的彈窗晃琳。之前用到的彈窗是使用jqm的讯检,但是在開(kāi)發(fā)過(guò)程中發(fā)現(xiàn),如果jqmpopup外部的window也是可以滾動(dòng)的話卫旱,popup會(huì)跟隨著背后的window滾動(dòng)人灼,這個(gè)當(dāng)然是不可取的,所以想自定義一個(gè)彈窗來(lái)滿足需求顾翼。

二.制作思路

在自定這個(gè)彈窗的時(shí)候投放,有大概構(gòu)思過(guò)步驟,就是要有一個(gè)遮罩層适贸,一個(gè)顯示內(nèi)容灸芳。其中遮罩層需要覆蓋這個(gè)mobile界面,當(dāng)用戶點(diǎn)擊遮罩層的時(shí)候拜姿,可以關(guān)閉這個(gè)彈窗或者不關(guān)閉彈窗耗绿,可以自行設(shè)置;顯示內(nèi)容當(dāng)然是可以滾動(dòng)的砾隅,可以給顯示內(nèi)容設(shè)置一個(gè)max-height误阻,這樣,當(dāng)內(nèi)容少的時(shí)候就顯示內(nèi)容高度,當(dāng)內(nèi)容過(guò)多時(shí)候究反,高度就為max-height寻定。彈窗是從下面向上升起,那么顯示內(nèi)容的position就可以設(shè)置為absolute精耐,bottom為0狼速,只是在打開(kāi)或者關(guān)閉的時(shí)候,改變遮罩層和顯示內(nèi)容的高度和顯示的問(wèn)題卦停。

三.遇到的bug

在具體的開(kāi)發(fā)中也是按照這樣的步驟去做向胡,但是其中遇到了一個(gè)比較大的坑,就是自定義的彈窗有滾動(dòng)條惊完,并且彈窗背后的整個(gè)頁(yè)面也是可以滾定的話僵芹,當(dāng)滾動(dòng)彈窗里面的內(nèi)容,背后的window也會(huì)跟著滾動(dòng)小槐。這樣肯定是不可取的拇派,在網(wǎng)上也找了很多解決方法,很多說(shuō)在打開(kāi)彈窗的時(shí)候凿跳,設(shè)置windowoverflowhidden就行件豌,但是這樣設(shè)置后,解決不了控嗜。后面在網(wǎng)上看到了張?chǎng)涡竦囊灿龅竭^(guò)類(lèi)似的問(wèn)題茧彤,所以就用了他的解決方法smartscroll
看了其中的源碼疆栏,解決的核心問(wèn)題就是彈窗滾動(dòng)到上下邊緣的滾定問(wèn)題棘街。

    // 上下邊緣檢測(cè)
    if (distanceY > 0 && scrollTop == 0) {
        // 往上滑,并且到頭
        // 禁止?jié)L動(dòng)的默認(rèn)行為
        event.preventDefault();
        return;
    }
    // 下邊緣檢測(cè)
    if (distanceY < 0 && (scrollTop + 1 >= data.maxscroll)) {
        // 往下滑承边,并且到頭
        // 禁止?jié)L動(dòng)的默認(rèn)行為
        event.preventDefault();
        return;
    }

運(yùn)用到自己的項(xiàng)目里面遭殉,測(cè)試一遍后發(fā)現(xiàn),iPhone運(yùn)行沒(méi)有問(wèn)題博助,但是在Android上發(fā)現(xiàn)险污,當(dāng)彈窗的內(nèi)容接近上下邊緣的時(shí)候,此時(shí)快速滾動(dòng)彈窗富岳,背后的window還是會(huì)跟著滾動(dòng)蛔糯,所以自己在其中改動(dòng)了些代碼,具體的方案是窖式,當(dāng)open彈窗的時(shí)候蚁飒,記錄下window當(dāng)前的xy,然后綁定windowonscroll方法萝喘,在這個(gè)方法中call windowscrollTo方法淮逻,滾動(dòng)的xy就是上面記錄的xy值琼懊,需要注意的是,在close這個(gè)彈窗的時(shí)候爬早,需要windowonscroll方法哼丈,方法里面do nothing,這樣關(guān)閉彈窗后筛严,才不會(huì)影響到window的滑動(dòng)醉旦。
1) open彈窗時(shí)需要調(diào)用

//fiexd position for android
var x=window.scrollX;
var y=window.scrollY;
window.onscroll=function(){
   window.scrollTo(x, y);
};

2)close彈窗時(shí)需要調(diào)用

window.onscroll=function(){};

當(dāng)然,在Android中不能做到跟iOS一樣桨啃,彈窗的滑動(dòng)完全不會(huì)影響到window车胡,在Android中快速滑動(dòng)彈窗,window會(huì)有稍微的移動(dòng)嗎照瘾,但是會(huì)馬上回彈到window原先的位置匈棘。
因?yàn)閟martscroll中,傳入了當(dāng)前頁(yè)面作為container网杆,綁定了touchmove羹饰,所以close彈窗的時(shí)候伊滋,需要給這個(gè)頁(yè)面解除綁定碳却。
張?chǎng)涡窀訚L動(dòng)解決方法

四.總結(jié)

使用jqm中的popup效果不佳,popup跟著window滑動(dòng)的問(wèn)題之前就存在了笑旺,所以自定義的彈窗也要盡量避免出現(xiàn)這個(gè)問(wèn)題昼浦。在解決這個(gè)問(wèn)題花費(fèi)了很多時(shí)間,其中最最重要的就是解決有滾動(dòng)條的彈窗的下上邊緣的問(wèn)題筒主,在臨界點(diǎn)進(jìn)行處理关噪。

五.Github地址

GitHub上,導(dǎo)入了jqm的相關(guān)代碼乌妙,因?yàn)閏ustom_alert.js文件中用到了jqm來(lái)獲取當(dāng)前頁(yè)面使兔,如果UI框架不使用jqm,可以用你項(xiàng)目的UI框架來(lái)獲取當(dāng)前頁(yè)面藤韵,然后代替里面的代碼即可虐沥,承載的彈窗的div放在page的footer中(即使顯示彈窗的頁(yè)面不需要用到footer,承載的彈窗的div放在page的footer中也不會(huì)影響)泽艘。
有實(shí)例展示欲险,直接下載源碼,就可以測(cè)試匹涮。其中做得不好的請(qǐng)指正天试,相互交流??。
源碼下載

六.運(yùn)行后樣式

制作后簡(jiǎn)單展示(如果需要美化彈窗然低,可以自行在我這個(gè)小組件上進(jìn)行修改):


仿iPhone原生彈窗
彈窗內(nèi)容超出喜每,可以滾動(dòng)彈窗
彈窗內(nèi)容未超出务唐,自適應(yīng)高度
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市灼卢,隨后出現(xiàn)的幾起案子绍哎,更是在濱河造成了極大的恐慌,老刑警劉巖鞋真,帶你破解...
    沈念sama閱讀 216,843評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件崇堰,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡涩咖,警方通過(guò)查閱死者的電腦和手機(jī)海诲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,538評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)檩互,“玉大人特幔,你說(shuō)我怎么就攤上這事≌⒆颍” “怎么了蚯斯?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,187評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)饵较。 經(jīng)常有香客問(wèn)我拍嵌,道長(zhǎng),這世上最難降的妖魔是什么循诉? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,264評(píng)論 1 292
  • 正文 為了忘掉前任横辆,我火速辦了婚禮,結(jié)果婚禮上茄猫,老公的妹妹穿的比我還像新娘狈蚤。我一直安慰自己,他們只是感情好划纽,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,289評(píng)論 6 390
  • 文/花漫 我一把揭開(kāi)白布脆侮。 她就那樣靜靜地躺著,像睡著了一般勇劣。 火紅的嫁衣襯著肌膚如雪靖避。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,231評(píng)論 1 299
  • 那天芭毙,我揣著相機(jī)與錄音筋蓖,去河邊找鬼。 笑死退敦,一個(gè)胖子當(dāng)著我的面吹牛粘咖,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播侈百,決...
    沈念sama閱讀 40,116評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼瓮下,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼翰铡!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起讽坏,我...
    開(kāi)封第一講書(shū)人閱讀 38,945評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤锭魔,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后路呜,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體迷捧,經(jīng)...
    沈念sama閱讀 45,367評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,581評(píng)論 2 333
  • 正文 我和宋清朗相戀三年胀葱,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了漠秋。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,754評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡抵屿,死狀恐怖庆锦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情轧葛,我是刑警寧澤搂抒,帶...
    沈念sama閱讀 35,458評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站尿扯,受9級(jí)特大地震影響求晶,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜姜胖,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,068評(píng)論 3 327
  • 文/蒙蒙 一誉帅、第九天 我趴在偏房一處隱蔽的房頂上張望淀散。 院中可真熱鬧右莱,春花似錦、人聲如沸档插。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,692評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)郭膛。三九已至晨抡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間则剃,已是汗流浹背耘柱。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,842評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留棍现,地道東北人调煎。 一個(gè)月前我還...
    沈念sama閱讀 47,797評(píng)論 2 369
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像己肮,于是被迫代替她去往敵國(guó)和親士袄。 傳聞我的和親對(duì)象是個(gè)殘疾皇子悲关,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,654評(píng)論 2 354

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,085評(píng)論 25 707
  • 內(nèi)容抽屜菜單ListViewWebViewSwitchButton按鈕點(diǎn)贊按鈕進(jìn)度條TabLayout圖標(biāo)下拉刷新...
    皇小弟閱讀 46,756評(píng)論 22 665
  • 運(yùn)行故障: MNIST,運(yùn)行中間發(fā)生Python執(zhí)行非法指令錯(cuò)誤娄柳,同時(shí)運(yùn)行窗口報(bào)告:Couldn't open C...
    zy_now閱讀 483評(píng)論 0 0
  • 小白7天發(fā)圈 第一天:首先要熟悉了解產(chǎn)品寓辱,熟悉朋友圈人群質(zhì)量。發(fā)圈以分享為前提赤拒★ぃ可以在晚上9點(diǎn)左右發(fā)一條自己喝燕窩...
    Miss伊閱讀 365評(píng)論 0 0
  • 默認(rèn)情況下,把一個(gè)NTFS格式的磁盤(pán)插入到Mac里挎挖,是只能讀不能寫(xiě)的跳昼。網(wǎng)上一直流傳著這么一個(gè)簡(jiǎn)單的方法是用第三方工...
    Chefil閱讀 46,670評(píng)論 37 18