解決ios下滑動引起webview整體滾動

2021-10-06 02:23:23 字數 4223 閱讀 3453

在作flutter內webview內嵌h5的時候,遇到了在ios下滑動頁面會出現橡皮筋效果,而在android下不會出現該問題。這樣的話在ios下滑動會意外的觸發會感覺頁面整體在上下彈動。

後面繼續開發中發現次方案只能解決首次手勢問題,比如手指一直沒離開螢幕而先向上又向下依然會出現彈性滾動,在移動過程中不能中斷,目前沒找到更好的辦法解決

方案1:在移動端h5中我們可以監聽touchstart(觸控開始),touchmove(觸控移動),touchend(觸控結束)等觸控事件,來判斷當前是否該滑動。

方案2: 若是引入的第三方滾動元件,大多數第三方元件都是使用transform來實現滾動的,所以只需要設定css: touch-action:none;則不會觸發觸控。

我這裡使用的webview自帶的瀏覽器滾動條來實現的原生滾動,目前使用起還是比較順手。

// 區域性使用瀏覽器自帶滾動條

@mixin usescrollbybrowser

($h:

1px));

&::-webkit-scrollbar

}

<

!-- 建立滾動區域 滾動一級--

>

="area-scroll" data-scroll-root=

"true"

>

<

!-- 滾動二級 主要獲取其高度與滾動一級比較 --

>

="area-scroll-content"

>

<

/slot>

<

/div>

<

/div>

<

/template>

touch._startx = e.touches[0]

.pagex;

touch._starty = e.touches[0]

.pagey;

let endx = e.touches[0]

.pagex;

let endy = e.touches[0]

.pagey;

let distancex = endx - touch._startx;

let distancey = endy - touch._starty;

let finaldirction =

'none';if

(math.

abs(distancex)

< math.

abs(distancey)

&& distancey >0)

else

if(math.

abs(distancex)

< math.

abs(distancey)

&& distancey <0)

if

(curnodeparent.scrolltop ===

0&& finaldirction ===

'down'

)

當滾動到底且手勢往上 需禁止

if

( math.

ceil

(curnodeparent.clientheight + curnodeparent.scrolltop)

== curnodeparent.scrollheight &&

finaldirction ===

'up'

)

_findparent:

(pnode, finaldirction)

=>

else

elseif(

math.

ceil

(curnodeparent.clientheight + curnodeparent.scrolltop)

== curnodeparent.scrollheight &&

finaldirction ===

'up'

)else}}

else

}

// 在頂層vue模板中引入觸控事件

import

from

'utils/touch'

// script中

created()

,destroyed()

頁面內直接使用全域性滾動元件

<

!-- 區域性滾動元件 --

>

<

!-- 您的業務dom --

>

for=

"index in 124"

:key=

"index"

>

}<

/li>

<

/ul>

<

/area-scroll>

// css

/deep/

.area-scroll

其實還可以優化一點就是針對ios才走邏輯若是安卓機則直接跳過,這樣更合理些。

/**

* @module 針對ios滑動帶動webview觸控事件封裝

* @author ljxin

* @tips touch物件

* 私有變數 startx,starty

* 私有方法:_onmove,_onstart,_onend,_findparent

* 暴露方法: oninittouchevent onremovetouchevent

*/const touch =

else

if(math.

abs(distancex)

< math.

abs(distancey)

&& distancey <0)

// 1. 先判斷當前vue頁面下是否存在可滾動區域if(

!!document.

queryselector

('.area-scroll'))

}// 在cancalable為true得時候 來阻止冒泡及預設事件 及一定要return 不然會報個錯

if(e.cancelable)

return

null;}

, _onstart:

(e)=>

, _onend:

(e)=>

, _findparent:

(pnode, finaldirction)

=>

else

elseif(

math.

ceil

(curnodeparent.clientheight + curnodeparent.scrolltop)

== curnodeparent.scrollheight &&

finaldirction ===

'up'

)else}}

else}}

,};/**

* @func 暴露給vue使用的初始化介面

*/const

oninittouchevent=(

)=>);

document.body.

addeventlistener

('touchmove'

, touch._onmove,);

document.body.

addeventlistener

('touchend'

, touch._onend,);

};/** * @func 暴露給vue使用的解除安裝監聽介面

*/const

onremovetouchevent=(

)=>

,false);

document.body.

removeeventlistener

('touchmove',(

)=>

,false);

document.body.

removeeventlistener

('touchend',(

)=>

,false);

};export

;

Gesture 向上滑動,上下滑動

問題 解決方案 android中schrolling 主要包含兩中方式 dragging 拖動,fling 扔,區別在於速度上面。明顯此刻的需求要求使用fling.在onfling 方法中可以得到fling開始和結尾的x,y軸的位置,還有 扔 這個動作在x,y軸上的速度 velocity 注 螢幕的...

WebView禁止上下滑動

在工作中 我們經常會把後台傳回來的資料 用乙個webview顯示出來。我們需要固定webview的大小的時候,webview 雖然大小被固定了 但是當資料過多的的時候顯示不全,依然可以在固定的大小內上下滑動。但是如何禁止webview不可滑動呢?webview有幾個與滑動有關的方法都是無效的 web...

表頭左右滑動表體上下滑動

接下來我們來說 的滑動分為兩部分,分別是表頭滑動 表體滑動。1.表體滑動 表體其實很簡單,就是給表體乙個高度height,然後overflow y scroll 2.表頭滑動 表頭滑動的話就要在外邊設定兩個個div包裹 下面是表頭左右滑動的 table out table box table out...