better-scroll滾動排坑

zhanzhan_wu發表於2018-02-06

BetterScroll號稱目前最好用的移動端滾動外掛,因此它的強大之處肯定是存在的。要不...哈哈。個人感覺還是很好用的。這篇文章不是籠統的講BetterScroll,而是單講滾動,想要深入瞭解它,請移步或者這裡

  • 滾動原理

結構圖

綠色部分為 wrapper,也就是父容器,它會有固定的高度。黃色部分為 content,它是父容器的第一個子元素,它的高度會隨著內容的大小而撐高。那麼,當 content 的高度不超過父容器的高度,是不能滾動的,而它一旦超過了父容器的高度,我們就可以滾動內容區了。橫向滾動的原理一致就是將固定高度改為固定寬度。(這裡就不囉嗦了)

  • 縱向滾動

    廢話不多說,我們直接上程式碼。

    <template>
      <div class="wrapper" ref="wrapper">
          <ul>
            <li v-for="item in 8">{{item}}</li>
          </ul>
      </div>
    </template>
    <script>
      import BScroll from 'better-scroll';
        export default {
          mounted() {
            this.$nextTick(() => {
              this.scroll = new BScroll(this.$refs.wrapper);
            });
          }
        };
    </script>
    <style type="text/css">
      .wrapper{
        overflow:hidden;
        height:100vh;
      }
      ul li{
        height:400px;
      }
    </style>
    複製程式碼

    這是一個Vue BetterScroll縱向滾動demo,這裡需要注意的有兩點。

    • 只能有一層父級div,也就是容器
    • 父級div要設定溢位隱藏,並且固定高度
  • 橫向滾動

    橫向滾動,相比縱向滾動需要動態的去獲取滾動區的寬度,直接上程式碼。

    <template>
      <div class="tab" ref="tab">
        <ul class="tab_content" ref="tabWrapper">
          <li class="tab_item" v-for="item in itemList" ref="tabitem">
              {{item.title}}
          </li>
        </ul>
      </div>
      </template>
      <script>
      import BScroll from 'better-scroll';
        export default {
          data() {
            return{
              itemList:[
              {
                'title':'關注'
              },
              {
                'title':'推薦'
              },
              {
                'title':'深圳'
              },
              {
                'title':'視訊'
              },
              {
                'title':'音樂'
              },
              {
                'title':'熱點'
              },
              {
                'title':'新時代'
              },
              {
                'title':'娛樂'
              },
              {
                'title':'頭條號'
              },
              {
                'title':'問答'
              },
              {
                'title':'圖片'
              },
              {
                'title':'科技'
              },
              {
                'title':'體育'
              },
              {
                'title':'財經'
              },
              {
                'title':'軍事'
              },
              {
                'title':'國際'
              }
              ]
            }
          },
          created() {
            this.$nextTick(() => {
              this.InitTabScroll();
            });
          },
          methods:{
            InitTabScroll(){
              let width=0
              for (let  i = 0; i <this.itemList.length; i++) {
                  width+=this.$refs.tabitem[0].getBoundingClientRect().width; //getBoundingClientRect() 返回元素的大小及其相對於視口的位置
              }
              this.$refs.tabWrapper.style.width=width+'px'
              this.$nextTick(()=>{
                  if (!this.scroll) {
                    this.scroll=new BScroll(this.$refs.tab, {
                      startX:0,
                      click:true,
                      scrollX:true,
                      scrollY:false,
                      eventPassthrough:'vertical'
                    });
                  }else{
                    this.scroll.refresh()
                  }
              });
            }
          }
        };
      </script>
      <style lang="scss" scoped>
      .tab{
        width: 100vw;
        overflow: hidden;
        padding:5px;
        .tab_content{
          line-height: 2rem;
          display: flex;
          .tab_item{
            flex: 0 0 60px;
            width:60px;
          }  
        }
      }  
      </style>
    複製程式碼

    橫向滾動需要注意。

    • 只能有一層父級div,也就是容器
    • 父容器要設定溢位隱藏並固定寬度
    • 動態獲取滾動區的寬度

因為最近專案需要,所以從網上查閱了許多資料也無法解決我的問題。BetterScroll官網也沒有提供實際demo參考,所以就利用休息時間,寫了這篇文章。希望能對你們有用。需要具體demo請移步,別忘了給個star啊,寫文章不容易,給個讚唄!

tips:上文的程式碼可以直接使用,小夥伴們安裝完依賴後可以直接copy測試哦~

相關文章