摘要:端如何實現當彈窗顯示時,為元素添加屬性當關閉彈窗時移除該屬性即可在彈窗的上設置你要顯示的內容出現彈窗時,為元素添加,這樣主頁面就禁止滑動,同時很好地解決了彈窗穿透的問題。由于無法取消,因此事件監聽器無法阻止頁面呈現。
pc端如何實現
1.當彈窗顯示時,為body元素添加屬性:overflow:hidden, 當關閉彈窗時移除該屬性即可
2.在彈窗的div上設置 @scroll.stop.prevent
你要顯示的內容
3.出現彈窗時,為body元素添加position:fixed,這樣主頁面就禁止滑動,同時很好地解決了彈窗穿透的問題。
若彈窗為獨立組件,可以采用如下代碼:
beforeMount() { // 獲取原來的scrollTop 并將body的top修改為對應的值 this.prevBodyStyle_scrollTop = document.body.scrollTop || document.documentElement.scrollTop this.prevBodyStyle_top = window.getComputedStyle(document.body, null).getPropertyValue("top") document.body.style.top = `-${this.prevBodyStyle_scrollTop}px` // 獲取原來body的position 為了解決iOS上光標漂移的問題 將position修改為fixed this.prevBodyStyle_position = window.getComputedStyle(document.body, null).getPropertyValue("position") document.body.style.position = "fixed" // 為了避免width空值的情況 this.prevBodyStyle_width = window.getComputedStyle(document.body, null).getPropertyValue("width") document.body.style.width = "100%" }, beforeDestroy() { document.body.style.top = this.prevBodyStyle_top || "0px" document.body.style.position = this.prevBodyStyle_position document.body.style.width = this.prevBodyStyle_width || "100%" document.body.scrollTop = document.documentElement.scrollTop = this.prevBodyStyle_scrollTop || 0 },
備注: 如果彈窗為一個獨立的組件, 那么需要使用v-if來控制彈窗是否顯示,不可使用v-show(因為使用v-show,會在主頁面剛生成的同時生成該組件,導致position=fixed生效,在彈窗關閉的情況下頁面也禁止滑動)
移動端如何實現1.在彈窗的最外層div上添加@touchmove.stop.prevent (適合彈窗內容不需要滾動的情況下)
你要顯示的內容
存在問題: 雖然可以阻止滑動,但是雙擊的時候主頁面還是會跳動
2.同PC端第三種方法
3.通過addEventListener解決
mounted() { document.body.addEventListener("touchmove", this.p, {passive: false}) }, beforeDestroy () { document.body.removeEventListener("touchmove", this.p) }, methods: { p (e) { e.preventDefault() e.stopPropagation() } }
劃重點:addEventListener的第三個參數 {passive: false}
先說說錯誤的代碼,網上千篇一律的都是怎么成功的,納悶了,反正我沒有成功,在手機端和chrome瀏覽器等依然可以正常滾屏:
document.body.addEventListener("touchstart",function(e){ e.stopPropagation(); e.preventDefault(); },false);
錯誤代碼為什么不行呢,而為什么使用{passive: false}就生效了呢?
摘自MDN的解釋:
passive: Boolean,表示 listener 永遠不會調用preventDefault()。如果 listener 仍然調用了這個函數,客戶端將會忽略它并拋出一個控制臺警告。
MDN對于上述錯誤現象解釋地很清楚:
根據規范,passive 選項的默認值始終為false。但是,這引入了處理某些觸摸事件(以及其他)的事件監聽器在嘗試處理滾動時阻止瀏覽器的主線程的可能性,從而導致滾動處理期間性能可能大大降低。
為防止出現此問題,某些瀏覽器(特別是Chrome和Firefox)已將touchstart和touchmove事件的passive選項的默認值更改為true文檔級節點 Window,Document和Document.body。這可以防止調用事件監聽器,因此在用戶滾動時無法阻止頁面呈現。
var elem = document.getElementById("elem"); elem.addEventListener("touchmove", function listener() { /* do something */ }, { passive: true });
添加passive:true參數后,touchmove事件不會阻塞頁面的滾動(同樣適用于鼠標的滾輪事件)。參考鏈接所以,我們可以通過將passive的值顯式設置為false來覆蓋此行為。
另外:您無需擔心基本scroll 事件的passive值。由于無法取消,因此事件監聽器無法阻止頁面呈現。(也是在PC端監聽scroll無效的原因)
前兩種方法:https://blog.csdn.net/Chelle1...
第三種:https://blog.csdn.net/yuhk231...
vue prevent方法: https://www.cnblogs.com/Eden-...
mdn關于addEventListener: https://developer.mozilla.org...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/114324.html
摘要:端如何實現當彈窗顯示時,為元素添加屬性當關閉彈窗時移除該屬性即可在彈窗的上設置你要顯示的內容出現彈窗時,為元素添加,這樣主頁面就禁止滑動,同時很好地解決了彈窗穿透的問題。由于無法取消,因此事件監聽器無法阻止頁面呈現。 pc端如何實現 1.當彈窗顯示時,為body元素添加屬性:overflow:hidden, 當關閉彈窗時移除該屬性即可2.在彈窗的div上設置 @scroll.sto...
摘要:但是,在蒙層元素中滑動的時候,滑到內容的盡頭時,再繼續滑動,蒙層底部的頁面會開始滾動,顯然這不是我們想要的效果,因此需要阻止這種行為。部分安卓機型以及中,無法無法阻止底部頁面滾動。為蒙層容器節點簡單粗暴,滾動時底部頁面也無法動彈了。 場景概述 彈窗是一種常見的交互方式,而蒙層是彈窗必不可少的元素,用于隔斷頁面與彈窗區塊,暫時阻斷頁面的交互。但是,在蒙層元素中滑動的時候,滑到內容的盡頭時...
摘要:但是,在蒙層元素中滑動的時候,滑到內容的盡頭時,再繼續滑動,蒙層底部的頁面會開始滾動,顯然這不是我們想要的效果,因此需要阻止這種行為。部分安卓機型以及中,無法無法阻止底部頁面滾動。為蒙層容器節點簡單粗暴,滾動時底部頁面也無法動彈了。 場景概述 彈窗是一種常見的交互方式,而蒙層是彈窗必不可少的元素,用于隔斷頁面與彈窗區塊,暫時阻斷頁面的交互。但是,在蒙層元素中滑動的時候,滑到內容的盡頭時...
摘要:但是,在蒙層元素中滑動的時候,滑到內容的盡頭時,再繼續滑動,蒙層底部的頁面會開始滾動,顯然這不是我們想要的效果,因此需要阻止這種行為。部分安卓機型以及中,無法無法阻止底部頁面滾動。為蒙層容器節點簡單粗暴,滾動時底部頁面也無法動彈了。 場景概述 彈窗是一種常見的交互方式,而蒙層是彈窗必不可少的元素,用于隔斷頁面與彈窗區塊,暫時阻斷頁面的交互。但是,在蒙層元素中滑動的時候,滑到內容的盡頭時...
閱讀 853·2023-04-26 00:11
閱讀 2654·2021-11-04 16:13
閱讀 2101·2021-09-09 09:33
閱讀 1470·2021-08-20 09:35
閱讀 3816·2021-08-09 13:42
閱讀 3603·2019-08-30 15:55
閱讀 1037·2019-08-30 15:55
閱讀 2218·2019-08-30 13:55