亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

跳出彈窗頁面禁止?jié)L動(PC端和手機端)

HmyBmny / 1507人閱讀

摘要:端如何實現(xiàn)當(dāng)彈窗顯示時,為元素添加屬性當(dāng)關(guān)閉彈窗時移除該屬性即可在彈窗的上設(shè)置你要顯示的內(nèi)容出現(xiàn)彈窗時,為元素添加,這樣主頁面就禁止滑動,同時很好地解決了彈窗穿透的問題。由于無法取消,因此事件監(jiān)聽器無法阻止頁面呈現(xiàn)。

pc端如何實現(xiàn)

1.當(dāng)彈窗顯示時,為body元素添加屬性:overflow:hidden, 當(dāng)關(guān)閉彈窗時移除該屬性即可
2.在彈窗的div上設(shè)置 @scroll.stop.prevent

你要顯示的內(nèi)容

3.出現(xiàn)彈窗時,為body元素添加position:fixed,這樣主頁面就禁止滑動,同時很好地解決了彈窗穿透的問題。
若彈窗為獨立組件,可以采用如下代碼:

beforeMount() {
    // 獲取原來的scrollTop 并將body的top修改為對應(yīng)的值
    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上光標(biāo)漂移的問題 將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,會在主頁面剛生成的同時生成該組件,導(dǎo)致position=fixed生效,在彈窗關(guān)閉的情況下頁面也禁止滑動)

移動端如何實現(xiàn)

1.在彈窗的最外層div上添加@touchmove.stop.prevent (適合彈窗內(nèi)容不需要滾動的情況下)

你要顯示的內(nèi)容

存在問題: 雖然可以阻止滑動,但是雙擊的時候主頁面還是會跳動

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的第三個參數(shù) {passive: false}

先說說錯誤的代碼,網(wǎng)上千篇一律的都是怎么成功的,納悶了,反正我沒有成功,在手機端和chrome瀏覽器等依然可以正常滾屏:

document.body.addEventListener("touchstart",function(e){
                    e.stopPropagation();
                    e.preventDefault();
                },false);

錯誤代碼為什么不行呢,而為什么使用{passive: false}就生效了呢?
摘自MDN的解釋:

passive: Boolean,表示 listener 永遠(yuǎn)不會調(diào)用preventDefault()。如果 listener 仍然調(diào)用了這個函數(shù),客戶端將會忽略它并拋出一個控制臺警告。

MDN對于上述錯誤現(xiàn)象解釋地很清楚:

根據(jù)規(guī)范,passive 選項的默認(rèn)值始終為false。但是,這引入了處理某些觸摸事件(以及其他)的事件監(jiān)聽器在嘗試處理滾動時阻止瀏覽器的主線程的可能性,從而導(dǎo)致滾動處理期間性能可能大大降低。
為防止出現(xiàn)此問題,某些瀏覽器(特別是Chrome和Firefox)已將touchstart和touchmove事件的passive選項的默認(rèn)值更改為true文檔級節(jié)點 Window,Document和Document.body。這可以防止調(diào)用事件監(jiān)聽器,因此在用戶滾動時無法阻止頁面呈現(xiàn)。
var elem = document.getElementById("elem"); 
elem.addEventListener("touchmove", function listener() { /* do something */ }, { passive: true });
添加passive:true參數(shù)后,touchmove事件不會阻塞頁面的滾動(同樣適用于鼠標(biāo)的滾輪事件)。

所以,我們可以通過將passive的值顯式設(shè)置為false來覆蓋此行為。

另外:您無需擔(dān)心基本scroll 事件的passive值。由于無法取消,因此事件監(jiān)聽器無法阻止頁面呈現(xiàn)。(也是在PC端監(jiān)聽scroll無效的原因)

參考鏈接

前兩種方法:https://blog.csdn.net/Chelle1...
第三種:https://blog.csdn.net/yuhk231...
vue prevent方法: https://www.cnblogs.com/Eden-...
mdn關(guān)于addEventListener: https://developer.mozilla.org...

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/99623.html

相關(guān)文章

  • 跳出彈窗頁面禁止滾動PC手機

    摘要:端如何實現(xiàn)當(dāng)彈窗顯示時,為元素添加屬性當(dāng)關(guān)閉彈窗時移除該屬性即可在彈窗的上設(shè)置你要顯示的內(nèi)容出現(xiàn)彈窗時,為元素添加,這樣主頁面就禁止滑動,同時很好地解決了彈窗穿透的問題。由于無法取消,因此事件監(jiān)聽器無法阻止頁面呈現(xiàn)。 pc端如何實現(xiàn) 1.當(dāng)彈窗顯示時,為body元素添加屬性:overflow:hidden, 當(dāng)關(guān)閉彈窗時移除該屬性即可2.在彈窗的div上設(shè)置 @scroll.sto...

    atinosun 評論0 收藏0
  • 禁止蒙層底部頁面跟隨滾動

    摘要:但是,在蒙層元素中滑動的時候,滑到內(nèi)容的盡頭時,再繼續(xù)滑動,蒙層底部的頁面會開始滾動,顯然這不是我們想要的效果,因此需要阻止這種行為。部分安卓機型以及中,無法無法阻止底部頁面滾動。為蒙層容器節(jié)點簡單粗暴,滾動時底部頁面也無法動彈了。 場景概述 彈窗是一種常見的交互方式,而蒙層是彈窗必不可少的元素,用于隔斷頁面與彈窗區(qū)塊,暫時阻斷頁面的交互。但是,在蒙層元素中滑動的時候,滑到內(nèi)容的盡頭時...

    shiyang6017 評論0 收藏0
  • 禁止蒙層底部頁面跟隨滾動

    摘要:但是,在蒙層元素中滑動的時候,滑到內(nèi)容的盡頭時,再繼續(xù)滑動,蒙層底部的頁面會開始滾動,顯然這不是我們想要的效果,因此需要阻止這種行為。部分安卓機型以及中,無法無法阻止底部頁面滾動。為蒙層容器節(jié)點簡單粗暴,滾動時底部頁面也無法動彈了。 場景概述 彈窗是一種常見的交互方式,而蒙層是彈窗必不可少的元素,用于隔斷頁面與彈窗區(qū)塊,暫時阻斷頁面的交互。但是,在蒙層元素中滑動的時候,滑到內(nèi)容的盡頭時...

    kgbook 評論0 收藏0
  • 禁止蒙層底部頁面跟隨滾動

    摘要:但是,在蒙層元素中滑動的時候,滑到內(nèi)容的盡頭時,再繼續(xù)滑動,蒙層底部的頁面會開始滾動,顯然這不是我們想要的效果,因此需要阻止這種行為。部分安卓機型以及中,無法無法阻止底部頁面滾動。為蒙層容器節(jié)點簡單粗暴,滾動時底部頁面也無法動彈了。 場景概述 彈窗是一種常見的交互方式,而蒙層是彈窗必不可少的元素,用于隔斷頁面與彈窗區(qū)塊,暫時阻斷頁面的交互。但是,在蒙層元素中滑動的時候,滑到內(nèi)容的盡頭時...

    AbnerMing 評論0 收藏0

發(fā)表評論

0條評論

HmyBmny

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<