摘要:巧用做浮層的詬病太多了,還好標(biāo)準(zhǔn)沒有廢棄它,其實(shí)還是有點(diǎn)用的。做的過程發(fā)現(xiàn)頁面是可以滑動的,理想的情況當(dāng)然是鎖住頁面。父頁面域名白名單子頁面好了,完成這樣的需求,半天都不用。用雖然不是最好的方案,但對于本案例來是最佳的。
巧用iframe做浮層
iframe的詬病太多了,還好標(biāo)準(zhǔn)沒有廢棄它,其實(shí)還是有點(diǎn)用的。在開發(fā)產(chǎn)品的時候,我們不得不舍棄一些東西來換取效率。
我們的需求是,在某些特定的場景下在現(xiàn)有的頁面做一個彈窗,這是常有的運(yùn)營手段,雖然我覺得是一種粗魯?shù)倪\(yùn)營,但需求還是得做啊。
原有的平臺頁面:
新增的運(yùn)營活動頁面:
合成的效果圖:
看到最后這個圖不就是個簡單的彈層嗎?
但這個彈層的邏輯不少啊,而且是由專門的系統(tǒng)配置生成,包括領(lǐng)取卡券邏輯。跟現(xiàn)有的頁面基本沒關(guān)系,而且只是一個臨時的運(yùn)營活動。沒必要在主頁面的邏輯中專門加一個這樣的活動邏輯。
所以最好是將兩個頁面合成到一起。
設(shè)置這個臨時iframe的樣式使得iframe鋪滿整個瀏覽器窗口,這里可以先將透明度設(shè)置為0,等到iframe完全加載再顯示出來,以免iframe加載失敗或者樣式抖動導(dǎo)致用戶體驗(yàn)就不太友好:
.float-iframe{ position: absolute; width: 100%; height: 100%; top: 0; left: 0; border: 0; z-index: 1000; opacity: 0; }
iframe加載出來后發(fā)現(xiàn)并不是透明的,平臺頁面的背景被遮蓋了。這里需要設(shè)置iframe的body樣式:
background-color:rgb(0,0,0,0.6);
設(shè)置透明度為0.6,可以生成一個透明度的蒙層,這樣也可以免去自己再去寫一個遮罩層。
在body上加上下面的樣式,可以設(shè)置完全透明:
background-color: transparent;
這樣就需要自己去加遮罩層,不然兩個頁面的元素視覺上看起來會疊加到一起了。
做的過程發(fā)現(xiàn)頁面是可以滑動的,理想的情況當(dāng)然是鎖住頁面。這個時候想到的是阻止touchmove事件
document.addEventListener("touchmove", function(e){ e.preventDefault(); },false)
發(fā)現(xiàn)這樣是不生效的,在iframe的頁面區(qū)域照樣可以滑動,在主頁面卻不能滑動,說明對iframe是無效的。唯一的解釋就是發(fā)生在iframe的touch事件只在iframe內(nèi)部冒泡,并不會傳遞到父頁面,所以是不能阻止父頁面的滑動,如果這個猜想成立的話,以下代碼應(yīng)該會生效
iframe.onload = function(){ var doc = iframe.contentDocument; doc.addEventListener("touchmove", function(e){ e.preventDefault(); },false) };
這樣設(shè)置以后,果然就不能滑動了。
接下來的問題,怎么去關(guān)閉iframe。在頁面上我們設(shè)計了一個X按鈕,用來關(guān)閉。這里要分場景來做,一種是同源,另外是不同源。
我們的這兩個頁面是同源,就比較好做了,通過父頁面直接控制子頁面,完全的控制權(quán)限。
var doc = iframe.contentDocument; doc.querySelector("#_js_close").addEventListener("click", function(){ document.body.removeChild(iframe); });
如果是不同源,會比較麻煩點(diǎn),需要兩個頁面間的通信。
// 父頁面 http://parent.com window.addEventListener("message", receiveMessage, false); function receiveMessage(event){ var origin = event.origin || event.originalEvent.origin; // 域名白名單 if (origin !== "http://child.com") return; if(event.data === "closepage"){ document.body.removeChild(iframe); } } // 子頁面 http://child.com window.postMessage("closepage", "http://parent.com");
好了,完成這樣的需求,半天都不用。如果從頭開始寫,估計要花幾天,主要不是顯示彈層邏輯,而是彈層里本身的邏輯。用iframe雖然不是最好的方案,但對于本案例來是最佳的。
本文為原創(chuàng)文章,可能會經(jīng)常更新知識點(diǎn)以及修正一些錯誤,因此轉(zhuǎn)載請保留原出處,方便溯源,謝謝合作。
本文的博客地址:http://www.iamaddy.net/2017/0...
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/83021.html
摘要:巧用做浮層的詬病太多了,還好標(biāo)準(zhǔn)沒有廢棄它,其實(shí)還是有點(diǎn)用的。做的過程發(fā)現(xiàn)頁面是可以滑動的,理想的情況當(dāng)然是鎖住頁面。父頁面域名白名單子頁面好了,完成這樣的需求,半天都不用。用雖然不是最好的方案,但對于本案例來是最佳的。 巧用iframe做浮層 iframe的詬病太多了,還好標(biāo)準(zhǔn)沒有廢棄它,其實(shí)還是有點(diǎn)用的。在開發(fā)產(chǎn)品的時候,我們不得不舍棄一些東西來換取效率。 我們的需求是,在某些特定...
摘要:在中巧用解決跳轉(zhuǎn)到第三方平臺時不能回調(diào)的問題比如支付在開發(fā)中遇到不少的坑,絕大部分解決了但是在我們的中如果跳轉(zhuǎn)到第三方網(wǎng)站上時,那么問題來了此時我們的是不能監(jiān)聽到你在其它網(wǎng)站上的事件的,所以當(dāng)你想要回退到我們自己上時請緊握你的蛋小編在開發(fā)這 在ionic中巧用iframe解決跳轉(zhuǎn)到第三方平臺時不能回調(diào)的問題-比如支付 在ionic開發(fā)中遇到不少的坑,絕大部分解決了但是在我們的app...
摘要:小知識透明的在中的像素小一些,背景色變一下,這樣邊框自然出來了點(diǎn)擊按鈕主要是切換浮層的轉(zhuǎn)態(tài)阻止事件冒泡定時器,的含義會在下一輪事件循環(huán)一開始就執(zhí)行。 浮層效果預(yù)覽 showImg(https://segmentfault.com/img/bVbcDBw?w=163&h=64); 實(shí)現(xiàn)了:. 點(diǎn)擊按鈕彈出浮層. 點(diǎn)擊別處關(guān)閉浮層. 點(diǎn)擊浮層時,浮層不得關(guān)閉. 再次點(diǎn)擊按鈕,浮層消失 要...
摘要:小知識透明的在中的像素小一些,背景色變一下,這樣邊框自然出來了點(diǎn)擊按鈕主要是切換浮層的轉(zhuǎn)態(tài)阻止事件冒泡定時器,的含義會在下一輪事件循環(huán)一開始就執(zhí)行。 浮層效果預(yù)覽 showImg(https://segmentfault.com/img/bVbcDBw?w=163&h=64); 實(shí)現(xiàn)了:. 點(diǎn)擊按鈕彈出浮層. 點(diǎn)擊別處關(guān)閉浮層. 點(diǎn)擊浮層時,浮層不得關(guān)閉. 再次點(diǎn)擊按鈕,浮層消失 要...
閱讀 2657·2021-11-25 09:43
閱讀 676·2021-11-12 10:36
閱讀 4628·2021-11-08 13:18
閱讀 2178·2021-09-06 15:00
閱讀 3114·2019-08-30 15:56
閱讀 932·2019-08-30 13:57
閱讀 1989·2019-08-30 13:48
閱讀 1417·2019-08-30 11:13