從京東購物菩彬,印象筆記看小程序左滑交互的實(shí)現(xiàn)

小程序項目中遇到左滑刪除的交互需求缠劝,體驗(yàn)了幾個流行的小程序,各廠的解決方案有不同骗灶,也有類似惨恭。為一探究竟,自己動手實(shí)現(xiàn)了京東購物耙旦,印象筆記隨時記的左滑交互脱羡。在文章的最后,給出了自己的方案免都,總結(jié)了文章中三種方案的優(yōu)缺點(diǎn)锉罐。

方案一:使用scroll-view,代表:印象筆記隨時記

原理

用scroll-view實(shí)現(xiàn)左滑刪除交互的原理非常簡單绕娘,設(shè)置一個支持橫向滑動的scroll-view脓规,同時將子組件的寬度設(shè)置為scroll-view的寬度加上刪除按鈕的寬度。由于子組件的寬度大于scroll-view的寬度险领,自然地侨舆,就可以進(jìn)行橫向滑動了。


scroll_delete.gif

代碼

<scroll-view class="scroll-view-scroller" scroll-x>
      <view class='scroll-view-item'>
        <view class="scroll-view-delete">
          <text>刪除</text>
        </view>
      </view>
  </scroll-view>
.scroll-view-scroller {
  width: 375px; //處于demo考慮 ,scroll-view寬度設(shè)為固定值舷暮,實(shí)際項目中請自行計算
}
.scroll-view-item {
  width: 475px; // 300(scroller的寬度) + 100(delete按鈕的寬度)
  height: 100px;
  background: blue;
  position: relative;
}
.scroll-view-delete {
  width: 100px; //按鈕的寬度
  position: absolute;
  right: 0;
  top: 0;
  bottom: 0;
  background: red;
  color: #fff;
  text-align: center;
  line-height: 100px;
}

優(yōu)點(diǎn)

  • 實(shí)現(xiàn)成本低
  • 兼容所有小程序版本
  • 組件高度可設(shè)為自適應(yīng)

缺點(diǎn)

  • 當(dāng)用戶手指離開屏幕時态罪,刪除按鈕不能自動隱藏或顯示
  • 有一個明顯的橫向滾動條
  • 和原生的左滑體驗(yàn)差別較大

方案二: 檢測左滑手勢,代表:京東購物下面,每日優(yōu)鮮

原理

通過touch事件复颈,計算用戶手指左向滑動的距離,當(dāng)用戶手指離開屏幕時沥割,如果左向滑動的距離大于預(yù)設(shè)閥值耗啦,比如50像素,就打開左滑動畫机杜。
當(dāng)我在體驗(yàn)京東購物和每日優(yōu)鮮小程序上的左滑交互時帜讲,發(fā)現(xiàn)兩者都存在一些細(xì)節(jié)上的缺失。比如沒有將左滑限制為橫掃椒拗,沒有檢測多點(diǎn)觸控似将。這兩點(diǎn)應(yīng)該還是出于簡化代碼的考慮得吧。


左滑檢測

代碼

<view class="swipe-delete-wrapper" 
  bind:touchstart="onTouchStart"
  bind:touchmove="onTouchMove"
  bind:touchcancel="onTouchEnd"
  bind:touchend="onTouchEnd"
  >
    <view class="swipe-delete-content {{swiped ? 'open' : ''}}" bindtap='closeSwipe'>
      
    </view>
    <view class="swipe-delte-btn">
      <text>刪除</text>
    </view>
  </view>
.swipe-delete-wrapper {
  height: 100px;
  width: 100%;
  position: relative;
}

.swipe-delte-btn {
  position: absolute;
  right: 0;
  width: 100px;
  top: 0;
  text-align: center;
  background: red;
  bottom: 0;
  line-height: 100px;
  color: #fff;
}

.swipe-delete-content {
  position: absolute;
  left: 0;
  right: 0;
  top: 0;
  bottom: 0;
  background: blue;
  z-index: 2;
  transition: transform 200ms linear;
}

.swipe-delete-content.open {
  transform: translateX(-100px);
}
onTouchStart(event) {
    if (event.touches[0]) {
      this.touchStartPosition = event.touches[0].clientX;
    }
  }

  onTouchMove(event) {
    if (event.touches[0]) {
      this.touchEndPosition = event.touches[0].clientX;
    }
  }

  closeSwipe() {
    this.setData({
      swiped: false
    })
  }

  onTouchEnd() {
    if (this.touchStartPosition && this.touchEndPosition) {
      let delta = this.touchStartPosition - this.touchEndPosition;
      //左滑距離大于閥值蚀苛,顯示刪除按鈕
      if(delta > 50) {
        this.setData({
          swiped: true
        })
      }
      //右滑距離小于閥值在验,隱藏刪除按鈕
      if(delta < -50) {
        this.setData({
          swiped: false
        })
      }
    }
    this.touchStartPosition = null;
    this.touchEndPosition = null;
  }

優(yōu)點(diǎn)

  • 兼容所有小程序版本
  • 體驗(yàn)好于scroll-view
  • 組件高度可設(shè)為自適應(yīng)

缺點(diǎn)

  • 滑動不跟手
  • 和原生的左滑體驗(yàn)差別較大

方案三:使用movable-view

原理

從1.2.0開始,小程序提供了movable-view堵未,配合movable-area腋舌,可以實(shí)現(xiàn)非常流暢的滑動效果。
首先渗蟹,我們需要確定組件的寬度和刪除按鈕的寬度块饺,組件的寬度就是movable-view的寬度赞辩,而movable-area的寬度就是組件的寬度減去刪除按鈕的寬度。這樣授艰,我們就可以在限定的范圍內(nèi)滑動了辨嗽,當(dāng)超過最大滑動距離時,movable-view還會自動提供一個非常流暢的過界動畫和回彈效果想诅,媲美原生召庞。


流暢方案

代碼

<view class="moveable-item" 
   bind:touchstart="onTouchStart" 
   bind:touchmove="onTouchMove"
   bind:touchend="onTouchEnd"    
   bind:touchcancel="onTouchEnd">
    <movable-area class="movable-wrapper">
      <movable-view class='movable-item' out-of-bounds="true" direction="horizontal" x="{{x}}"></movable-view>
    </movable-area>
    <view class="move-able-delete-section">
      <text>刪除</text>
    </view>
  </view> 
.moveable-item {
  display: flex;
  flex-direction: row;
  position: relative;
  align-items: center;
  background: red;
}
.movable-wrapper {
  min-height: 100px;
  background: #ddd;
  flex: 1;
  position: relative;
}
.movable-item {
  position: relative;
  height: 100px;
  width:  375px;
  background: blue;
  flex:1
}
.move-able-delete-section {
  width: 100px;
  height: 100%;
  text-align: center;
  color: #fff;
}
onTouchStart(event) {
    if(event.touches[0]){
      this.touchStartPosition = event.touches[0].clientX;
    }
  }

  onTouchMove(event) {
    if (event.touches[0]) {
      this.touchEndPosition = event.touches[0].clientX;
    }
  }

  onTouchEnd(event) { 
    if (this.touchStartPosition && this.touchEndPosition) {
      console.log(this.touchStartPosition - this.touchEndPosition)
      let delta = this.touchStartPosition - this.touchEndPosition;
      //left
      if(delta > 0) {
        if(delta> 40) {
          this.setData({
            x: -100
          })
        }else {
          this.setData({
            x: 0
          })
        }
      }else {
        //right
        if (Math.abs(delta) > 40) {
          this.setData({
            x: 0
          })
        }else {
          this.setData({
            x: -100
          })
        }
      }
      this.touchStartPosition = null;
      this.touchEndPosition = null;
    }
  } 

優(yōu)點(diǎn)

  • 動畫流暢,操作跟手
  • 媲美原生左滑交互

缺點(diǎn)

  • 組件需要固定高度

總結(jié)

方案一作為小程序早期的解決方案来破,目前不再推薦。
方案二由于無需限制組件的高度忘古,具有很大的普適性徘禁。如果你的小程序中組件高度需要自適應(yīng),那么推薦你使用方案二髓堪。
如果你的小程序中組件的高度是固定的送朱,那么方案三無疑是最優(yōu)的方案,你可以提供給用戶媲美原生的左滑體驗(yàn)干旁。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末驶沼,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子争群,更是在濱河造成了極大的恐慌回怜,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件换薄,死亡現(xiàn)場離奇詭異玉雾,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)轻要,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門复旬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人冲泥,你說我怎么就攤上這事驹碍。” “怎么了凡恍?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵志秃,是天一觀的道長。 經(jīng)常有香客問我咳焚,道長洽损,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任革半,我火速辦了婚禮碑定,結(jié)果婚禮上流码,老公的妹妹穿的比我還像新娘。我一直安慰自己延刘,他們只是感情好漫试,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著碘赖,像睡著了一般驾荣。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上普泡,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天播掷,我揣著相機(jī)與錄音,去河邊找鬼撼班。 笑死歧匈,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的砰嘁。 我是一名探鬼主播件炉,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼矮湘!你這毒婦竟也來了斟冕?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤缅阳,失蹤者是張志新(化名)和其女友劉穎磕蛇,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體券时,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡孤里,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了橘洞。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片捌袜。...
    茶點(diǎn)故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖炸枣,靈堂內(nèi)的尸體忽然破棺而出虏等,到底是詐尸還是另有隱情,我是刑警寧澤适肠,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布霍衫,位于F島的核電站,受9級特大地震影響侯养,放射性物質(zhì)發(fā)生泄漏敦跌。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望柠傍。 院中可真熱鬧麸俘,春花似錦、人聲如沸惧笛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽患整。三九已至拜效,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間各谚,已是汗流浹背紧憾。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留昌渤,地道東北人稻励。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像愈涩,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子加矛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫履婉、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,022評論 4 62
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,498評論 25 707
  • 近日斟览,細(xì)細(xì)品讀了畢淑敏的散文毁腿,對《提醒幸福》一篇感觸頗深苛茂。文中說“人們喜愛回味幸福的標(biāo)本已烤,卻忽略幸福披著露...
    花開滿月樓閱讀 241評論 0 2
  • 這是第010篇 我在那一角落患過傷風(fēng) 馮曦妤 - A Little Love 去愛一個讓你不太累的人吧。 小可愛們...
    時糖Tsugar911閱讀 281評論 0 0
  • 八年前的一個下午,我邂逅了你躁绸,而且親吻了你裕循,從此一發(fā)不可收拾…… 八年了,我們從一開始的偶爾親吻净刮、斷斷續(xù)續(xù)親吻到每...
    菖蒲生活閱讀 780評論 8 7