1. 程式人生 > >移動端左右滑動阻止觸發上一頁下一頁操作

移動端左右滑動阻止觸發上一頁下一頁操作

最近有個需求,就是非常簡單地橫向滑動。打算使用overflow-x:auto;來試驗原生滑動,但在安卓版UC下當滑到最左或者最右會

1
預設啟用UC上一頁、下一頁手勢
,導致頁面的跳轉(原生瀏覽器無此手勢)。之前好幾個專案之前視訊有使用js處理(query: 夏洛特煩惱), 橫向滑動沒有加慣性支援,非常卡頓。感覺此類對距離沒有要求的滑動用原生最好,而且overflow-x:auto;相容性支援到安卓2.1以上,使用起來也非常方便,所以打算在UC下做一下適配。

使用css佈局

先使用overflow-x:auto;給UL加上一下css,做出橫向滑動的效果:

1
2
3
overflow-x
: auto; white-space: nowrap; -webkit-overflow-scrolling: touch;

這樣,一個簡單地滾動效果就實現了。如圖

css滑動

在UC瀏覽器安卓版下試驗,不出所料的滑到最右邊啟用了UC上一頁、下一頁手勢。

解決思路

經過無數次和@紹偉的試驗,給

1
body
繫結
1
touchmove
事件,並且組織預設行為就能把UC效果乾掉,那麼就有思路了:
  1. 在滑到最左邊或者最右邊給Body繫結事件,組織預設行為
  2. 當手指擡起解綁事件

參考程式碼

具體參考程式碼如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
var preventUCDefault = (function() {
    var ua = window.navigator.userAgent,
        startX = 0,
        diffY = 0,
        bindPreventTouch = function() {
            $(document.body).on('touchmove.prevUC', function(e) {
                e.preventDefault();
            });
        },
        isAndroid
= (function() { //https://github.com/amfe/lib-env/blob/master/src/browser.js#L70 return (!!ua.match(/(?:UCWEB|UCBrowser\/)([\d\.]+)/) && !!ua.match(/Android[\s\/]([\d\.]+)/)); })(); return { init : function(ul) { if(isAndroid) { var scrollWidth = ul[0].scrollWidth; ul.on('touchstart.prevUC', function(e) { startX = e.touches[0].pageX; }); ul.on('touchmove.prevUC',function(e) { diffY = e.touches[0].pageX - startX; if($(this).scrollLeft() == 0 && diffY > 0) { //到最左 bindPreventTouch(); }else if((scrollWidth - $(this).scrollLeft() - ul.width()) === 0 && diffY < 0) { //到最右 bindPreventTouch(); } }); ul.on('touchend.prevUC',function(e) { $(document.body).off('touchmove.prevUC'); }); } } } })(); preventUCDefault.init(scope.find('.slide-image ul'));

經過QA測試,低版本UC下滑動效果也很不錯呢!

優化

當然,想開啟gpu加速可以加上下句話:

1
-webkit-transform:translateZ(0);

另外,使用原生滑動會出現滾動條,如果想達到極致體驗的話,@靳磊給了兩個思路:

  1. 外面套一層,給定高度+overflow:hidden;
  2. 加一個偽元素將滾動條遮起來

使用偽元素程式碼如下

1
2
3
4
5
6
7
8
9
10
 ul::after {
    display: block;
    content: "";
    position: absolute;
    z-index: 10;
    width: 100%;
    background-color: #fff;
    height: 10px;
    margin-top : -11px;
}

總結

對於一個問題一個人思考思維會很侷限,和大家一起討論完成學到了很多解決的辦法,能將任務完成最優而且增進團隊的融合性。

更新 2015年12月14日

隱藏滾動條還有更好地方法

1
2
3
ul::-webkit-scrollbar {
        display: none;
    }

主要解決背景非純色而是虛化這樣的需求,uc下有效,但是safari下還是會出現滾動條,有點小遺憾。