使用better-scroll解決ios滾動(dòng)問題

前言

最近在項(xiàng)目開發(fā)中著洼,遇到一個(gè)令人頭疼的問題。當(dāng)一個(gè)容器能左右滑動(dòng)時(shí)宛瞄,手指在該容器上做上下滑動(dòng)的手勢(shì)頁面不會(huì)上下滾動(dòng)(在容器外圍上下滑動(dòng)是可以的逊拍,所以排除頁面的scroll問題),并且這個(gè)問題只會(huì)在ios上出現(xiàn)驰唬,安卓沒有顶岸。

通過查資料發(fā)現(xiàn)腔彰,原生的IOS scroll有這個(gè)問題,所以就使用了本文所講的better-srcoll來解決辖佣。下面來講講如何使用better-scroll來實(shí)現(xiàn)左右和上下滾動(dòng)霹抛。

環(huán)境準(zhǔn)備

  1. 安裝better-scroll
npm install --save better-scroll

2.引入better-scroll

import   BScroll   from   "better-scroll"

實(shí)現(xiàn)左右滾動(dòng)

使用BScroll實(shí)例化之前必需要等待DOM渲染完成。
產(chǎn)生左右滾動(dòng)的條件是子盒子內(nèi)的寬度必須要大于父盒子的寬度卷谈,所以我們?cè)谟胋etter-scroll時(shí)杯拐,必須要先得到滾動(dòng)區(qū)域的尺寸和父盒子的尺寸,來計(jì)算出是否能滾動(dòng)世蔗。
下面是一個(gè)小demo

  1. html
<template>
  <div ref="content" class="content"> // 父盒子--滾動(dòng)區(qū)域
    <ul ref="child" class="child"> // 子盒子-內(nèi)容區(qū)域
      <li>1</li>
      <li>2</li>
      <li>3</li>
      <li>4</li>
      <li>5</li>
      <li>6</li>
    </ul>
  </div>
</template>

(1)class為content的div的父盒子端逼,在此區(qū)域內(nèi)滾動(dòng),需要通過ref拿到DOM污淋。
(2)ul元素是子盒子顶滩,包含若干個(gè)li元素,可以通過li元素的寬度動(dòng)態(tài)進(jìn)行計(jì)算寸爆,也可以通過ref獲取dom

  1. css
<style lang="stylus" scoped>
.content{
    touch-action: none
    padding 15px
    ul{
        li{
            width 90px
            height 90px
            display inline-block
            background  #eee
            line-height 90px
            text-align center
        }
    }
}
</style>

給li標(biāo)簽90px的寬度,確保子盒的寬度大于父盒子的寬度
3.使用better-scroll

import BScroll from 'better-scroll'
export default {
  mounted () {
    this.$nextTick(() => {
      this.leftToRightScroll()
    })
  },
  methods: {
    leftToRightScroll () {
      let liList = document.querySelectorAll('li')
      let width = liList.length * liList[0].offsetWidth // 動(dòng)態(tài)計(jì)算出內(nèi)容區(qū)域的大小
      this.$refs.child.style.width = width + 'px' // 修改子盒子區(qū)域的寬度
      this.$nextTick(() => {
        // 確保DOM已渲染
        if (!this.scroll) {
          this.scroll = new BScroll(this.$refs.content, {
            startX: 0, 
            click: true,
            scrollX: true,
            scrollY: false,
            eventPassthrough: 'vertical',
          })
        } else {
          this.scroll.refresh() // dom發(fā)生改變會(huì)刷新
        }
      })
    },
  },
}

(1) 首先拿到所有的li元素的寬度赁豆,賦值給ul元素
(2) 生成BScroll實(shí)例仅醇,其中this.$refs.content就是父盒子的DOM,在此區(qū)域內(nèi)滾動(dòng)魔种。

  1. 效果圖


    左右滾動(dòng)

實(shí)現(xiàn)上下滾動(dòng)

  1. html
<template>
  <div ref="content" class="content">  // 父盒子--滾動(dòng)區(qū)域
    <ul ref="child" class="child">  // 子盒子-內(nèi)容區(qū)域
      <li>1</li>
      <li>2</li>
      <li>3</li>
      <li>4</li>
      <li>5</li>
      <li>6</li>
    </ul>
  </div>
</template>
  1. css
<style lang="stylus" scoped>
.content{
    margin-top 200px
    height 200px
    overflow hidden
    touch-action: none
    padding 15px
    ul{
        li{
            width 90px
            height 50px
            background  #eee
            line-height 90px
            text-align center
        }
    }
}
</style>

需要給父元素一個(gè)固定的高度析二,并且overflow屬性為hidden

  1. 使用better-scroll
mounted () {
    this.$nextTick(() => {
      let contentDom = this.$refs.content
      this.scroll = new BScroll(contentDom, {})
    })
  },

4.效果圖


上下滾動(dòng)

解決better-scroll連續(xù)兩次觸發(fā)點(diǎn)擊事件

使用better-scroll后可能會(huì)出現(xiàn)點(diǎn)擊事件發(fā)生兩次的情況,這時(shí)只需要在配置參數(shù)

this.scroll = new BScroll(this.$refs.content, {
            startX: 0, 
            click: true,  // 改為false
            scrollX: true,
            scrollY: false,
            eventPassthrough: 'vertical',
          })

click改為false就可以了务嫡。
想要了解更多參數(shù)及其使用方法請(qǐng)前往:better-scroll文檔地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末甲抖,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子心铃,更是在濱河造成了極大的恐慌准谚,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,406評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件去扣,死亡現(xiàn)場(chǎng)離奇詭異柱衔,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)愉棱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,395評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門唆铐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人奔滑,你說我怎么就攤上這事艾岂。” “怎么了朋其?”我有些...
    開封第一講書人閱讀 167,815評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵王浴,是天一觀的道長(zhǎng)脆炎。 經(jīng)常有香客問我,道長(zhǎng)氓辣,這世上最難降的妖魔是什么秒裕? 我笑而不...
    開封第一講書人閱讀 59,537評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮钞啸,結(jié)果婚禮上几蜻,老公的妹妹穿的比我還像新娘。我一直安慰自己体斩,他們只是感情好梭稚,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,536評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著硕勿,像睡著了一般哨毁。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上源武,一...
    開封第一講書人閱讀 52,184評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音想幻,去河邊找鬼粱栖。 笑死,一個(gè)胖子當(dāng)著我的面吹牛脏毯,可吹牛的內(nèi)容都是我干的闹究。 我是一名探鬼主播,決...
    沈念sama閱讀 40,776評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼食店,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼渣淤!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起吉嫩,我...
    開封第一講書人閱讀 39,668評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤价认,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后自娩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體用踩,經(jīng)...
    沈念sama閱讀 46,212評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,299評(píng)論 3 340
  • 正文 我和宋清朗相戀三年忙迁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了脐彩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,438評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡姊扔,死狀恐怖惠奸,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情恰梢,我是刑警寧澤佛南,帶...
    沈念sama閱讀 36,128評(píng)論 5 349
  • 正文 年R本政府宣布梗掰,位于F島的核電站,受9級(jí)特大地震影響共虑,放射性物質(zhì)發(fā)生泄漏愧怜。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,807評(píng)論 3 333
  • 文/蒙蒙 一妈拌、第九天 我趴在偏房一處隱蔽的房頂上張望拥坛。 院中可真熱鬧,春花似錦尘分、人聲如沸猜惋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,279評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽著摔。三九已至,卻和暖如春定续,著一層夾襖步出監(jiān)牢的瞬間谍咆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,395評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工私股, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留摹察,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,827評(píng)論 3 376
  • 正文 我出身青樓倡鲸,卻偏偏與公主長(zhǎng)得像供嚎,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子峭状,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,446評(píng)論 2 359