成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

vue結(jié)合preventDefault()和頁面滾動高度計算,解決ios橡皮筋效果

JerryWangSAP / 1863人閱讀

摘要:第一種方法我嘗試了,覺得不是很好用,而且頁面的滑動變得卡頓,橡皮筋效果還是時而出現(xiàn),因此考慮第二種辦法。由上面的定義可知,當(dāng)頁面滑動到頂部時,為,當(dāng)頁面出現(xiàn)橡皮筋時,小于當(dāng)頁面滑動到底部時,。

    感謝的啟發(fā),方法很有用!
    好幾個月以前,我寫了一個類似于自動回復(fù)那種的客服頁面,嵌入到公司開發(fā)的app里。上周測試突然找到我,說
頁面在滑動的時候,輸入框也會跟著上下滑動,而這個問題只在ios系統(tǒng)上出現(xiàn),Android沒問題。測試的同學(xué)希望我
做點什么,把頁面固定住,不要隨著手指的滑動上下動。修改前的界面大概像下面的示意圖這樣:   

    經(jīng)過百度,知道了這叫做橡皮筋效果,是ios系統(tǒng)在引入網(wǎng)頁時專有的一種效果.要去掉這種效果,可以采用fixed
布局,也可以監(jiān)聽touchmove事件,利用event.preventDefault()解決。第一種方法我嘗試了,覺得不是很好用,而
且頁面的滑動變得卡頓,橡皮筋效果還是時而出現(xiàn),因此考慮第二種辦法。
    event.preventDefault()說白了就是監(jiān)聽touchmove,在手指滑動屏幕的時候,禁止掉頁面隨手指滑動而滾動的
默認(rèn)事件??吹竭@里問題就來了,我的頁面是一個聊天頁面,聊天記錄還是可以通過上下滑動手指來查看的,如果禁止
了滾動頁面,豈不是動不了了?
    所以,需要給preventDefault()增加一個限制條件,即只有頁面滑動到頂部或者底部了,才調(diào)用preventDefault(),
阻止對應(yīng)的滑動事件。那么,如何判斷頁面是否已經(jīng)滑動到兩端呢?利用clientHeight、scrollHeight和scrollTop
三個屬性。
    我們對這三個屬性做一下區(qū)分(對頁面中同一個元素而言):
        clientHeight是元素展示在頁面中的固定高度;
        scrollHeight是當(dāng)元素中內(nèi)容很多,出現(xiàn)滾動條時,元素中內(nèi)容的實際高度,scrollHeight>=clientHeight,
    當(dāng)不需要滾動頁面時,二者相等;
        scrollTop是當(dāng)頁面滾動時,頁面中內(nèi)容向上卷起來的距離,即內(nèi)容的頂部距離固定的元素頂部的距離。

    由上面的定義可知,當(dāng)頁面滑動到頂部時,scrollTop為0,當(dāng)頁面出現(xiàn)橡皮筋時,scrollTop小于0.當(dāng)頁面滑動
到底部時,scrollTop + clientHeight = scrollHeight。因此,我們可以寫下這樣的代碼:
mounted(){
//判斷是不是ios
      let u = navigator.userAgent;
      let isiOS = !!u.match(/(i[^;]+;( U;)? CPU.+Mac OS X/); //ios終端

      //如果是ios,執(zhí)行下面的代碼
      if(isiOS){
      //因為要禁止整個頁面的滑動,所以定義一個box,里面裝有chatBody和foot兩個子元素
        const box = document.getElementById("longbox");  
        const chatBody = document.getElementById("chatContainer");
        //開始滑動,此處使用box元素的事件監(jiān)聽,來禁止整個頁面的滑動
        box.addEventListener("touchmove", function(e){
            //如果滑到頂端或底端,禁止滑動
          if(chatBody.scrollTop<=0 || chatBody.scrollTop + chatBody.clientHeight>=chatBody.scrollHeight){
            e.preventDefault();
          }
        })
      }
  }
    測試一下,發(fā)現(xiàn)一個問題,的確當(dāng)滑動到頂部時,無法繼續(xù)上滑了,但同時也無法下滑了。為什么?因為e.preventDefault()組織的是所有方向上的滑動事件,所以當(dāng)頁面滑到頂端或者底端時,禁止了一切的滑動,頁面就動不了了。因此,考慮改進(jìn)代碼,增加一個上滑或者下滑的判斷:
mounted(){
//判斷是不是ios
      let u = navigator.userAgent;
      let isiOS = !!u.match(/(i[^;]+;( U;)? CPU.+Mac OS X/); //ios終端

      //如果是ios,執(zhí)行下面的代碼
      if(isiOS){
      //因為要禁止整個頁面的滑動,所以定義一個box,里面裝有chatBody和foot兩個子元素
        const box = document.getElementById("longbox");
        const chatBody = document.getElementById("chatContainer");
        var startY,endY; //定義滑動的起點和終點
        //監(jiān)聽touchstart事件,記錄滑動起點的位置
        box.addEventListener("touchstart", function(e){
          startY = e.touches[0].pageY;
        })
        //開始滑動,此處使用box元素的事件監(jiān)聽,來禁止整個頁面的滑動
        box.addEventListener("touchmove", function(e){
          endY = e.touches[0].pageY;  //記錄此時的滑動y軸坐標(biāo)
         
          //頁面向上滑動
          //頁面滾動上去的長度scrollTop
          if(endY>startY&& chatBody.scrollTop<=0){
            e.preventDefault();
          }

          //頁面向下滑動
          //頁面的總長度(包括滾動上去的部分)scrollHeight
          if(endY=chatBody.scrollHeight){
            e.preventDefault();
          }
        })
      }
  }
   再測試,解決橡皮筋效果~
   啰嗦一下,上面的代碼是最終解決版的代碼,但其實中間還是遇到了一個小坑的,就是在多層div嵌套時,父容器的
   高度可能不定,由子容器撐開。比如我這個聊天頁面,父容器box只標(biāo)注了height:100%; container包括兩個子容
   器:子容器chat是需要滑動的div,不定高,還有一個高度為47px的foot子容器。這時候,需要禁止整個頁面(其
   實就是父容器)的滑動,子容器chat可以滑動,所以,要監(jiān)聽box的事件,禁止的也是box的滑動,而是否滑動到頁
   面頂端/底端的判斷依據(jù),則需要對chat的scrollHeight和scrollTop進(jìn)行判斷。
   第一次寫文章,說的不對的地方,還請多多指正!

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

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

相關(guān)文章

  • Vue開發(fā)——實現(xiàn)吸頂效果

    摘要:因為項目需求,最近開始轉(zhuǎn)到微信公眾號開發(fā),接觸到了框架,這個效果的實現(xiàn)雖說是基于框架下實現(xiàn)的,但是同樣也可以借鑒到其他地方,原理都是一樣的。上面我們得到了一個的屬性值,接下來我們只需要根據(jù)它的值來設(shè)置吸頂元素的屬性就可以了。 因為項目需求,最近開始轉(zhuǎn)到微信公眾號開發(fā),接觸到了Vue框架,這個效果的實現(xiàn)雖說是基于Vue框架下實現(xiàn)的,但是同樣也可以借鑒到其他地方,原理都是一樣的。 進(jìn)入正題...

    amuqiao 評論0 收藏0
  • 阻止微信瀏覽器下拉滑動效果ios11.3 皮筋效果

    摘要:一前言瀏覽器在移動端有一個默認(rèn)觸摸滾動的效果,讓我們感觸最深的莫過于微信瀏覽器里面,下拉時自帶橡皮筋的效果。二解釋微信在端和端使用的不是同樣的瀏覽器內(nèi)核版微信瀏覽器瀏覽器內(nèi)核相當(dāng)于使用的版微信瀏覽器相當(dāng)于使用的所以下面分別使用和來分析。 在升級到 ios11.3 系統(tǒng)后,發(fā)現(xiàn)之前阻止頁面滾動的代碼e.preventDefault代碼失效了。于是自己折騰了一番,找到了解決辦法,分享給大家...

    cangck_X 評論0 收藏0
  • 【前端詞典】滾動穿透問題的解決方案

    摘要:接下就說下我對滾動穿透問題解決方案探索的過程,希望對大家有點啟發(fā)。心想來了突然意識到寫彈窗的時候忘記處理滾動穿透的問題了。下期預(yù)告前端詞典繼承必懂知識點傳送門前端詞典代理的概念及其應(yīng)用前端詞典滾動穿透問題的解決方案 背景 產(chǎn)品有三寶,彈窗,浮層加引導(dǎo); 設(shè)計有三寶,透明,陰影加圓角; 運營有三寶,短信,推送加紅包; 程序員有一寶,這個做不了。 隨著移動端市場的份額越大,需求就越多...

    _Dreams 評論0 收藏0

發(fā)表評論

0條評論

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