美文网首页
基于better-scroll的轮播图组件开发一

基于better-scroll的轮播图组件开发一

作者: buctor | 来源:发表于2019-05-13 22:01 被阅读0次

轮播图组件是前端开发中,很重要的一个组件,下面我将讲述我的轮播图(下面将以slider称呼)组件开发(黄轶大神讲的)

slider组件主体html

<template>
  <div class="slider">
    <div class="slider-group">       
      <slot>                                     //负责插入的图片
      </slot>
    </div>
    <div class="dots">        //dots负责slider组件下面的dot
    </div>
  </div>
</template>

slider主体的CSS(stylus)思路

  .slider      
    min-height: 1px
    position: relative       
    .slider-group
      position: relative     
      overflow: hidden      
      white-space: nowrap          //文本不会换行,暨图片会在同一行显示
      .slider-item
        float: left                        //左浮动
        box-sizing: border-box         //盒子属性
        overflow: hidden               
        text-align: center        //居中
        a                            //slot插槽里的图片,需要用a标签包裹
          display: block
          width: 100%
          overflow: hidden
          text-decoration: none
        img
          display: block
          width: 100%

slider主体实现(vue)

当一组图片使用slider组件后,用v-for循环渲染图片,slider组件需要计算出,图片所占的宽度
暨用_setSliderWidth()方法计算
计算出宽度后,需要用better-scroll对slider(dom)对象init,用_initSlider()方法init
此时,一个可以滑动的轮播图就做好了

_setSliderWidth()方法

//使用_setSliderWidth()前,
//需要在slider,slider-group添加ref="slider",ref="sliderGroup"方便获取dom对象
    _setSliderWidth() {
      this.children = this.$refs.sliderGroup.children    //获取到传入的图片(Array)
      let width = 0
      let sliderWidth = this.$refs.slider.clientWidth    //获取浏览器宽度
      for (let i = 0; i < this.children.length; i++) {
        let child = this.children[i]                  //第i+1个图片
      //  addClass(child, 'slider-item')         //为图片dom对象,添加slider-item的类(稍后再提)
        child.style.width = sliderWidth + 'px'     //为图片dom对象,设置宽度
        width += sliderWidth                // 得到总宽度
      }
      if (this.loop) {                        //loop代表slider组件是否可以循环       
         width += 2 * sliderWidth   //因为better-scroll的机制,如果循环,需要多设置两个宽度
      }
      this.$refs.sliderGroup.style.width = width + 'px'    //为slider dom设置总宽度
    }

_initSlider()方法

 //需要引用BScroll
//在vue实例前引用引用格式为
//import BScroll from 'better-scroll'
    _initSlider() {
      this.slider = new BScroll(this.$refs.slider, {      
        scrollX: true,          //横向滚动
        scrollY: false,         //纵向不滚动
        momentum: false,         //默认为true
//当快速在屏幕上滑动一段距离的时候,会根据滑动的距离和时间计算出动量, 
//并生成滚动动画
        snap: {       //高级选项snap
          loop: this.loop,      //支持循环
          threshold: 0.3,       //表示可滚动到下一个的阈值
          speed: 400        //速度
        },
        click: true       //BScroll默认阻止click原生的点击事件,需要设置click为true
      })

这样就完成了一个简单的轮播图组件,但还有一些功能没有完成,如自动轮播,下面的dots,详细的addClass()方法,及props中的默认属性设置及类型

相关文章

网友评论

      本文标题:基于better-scroll的轮播图组件开发一

      本文链接:https://www.haomeiwen.com/subject/rzjdaqtx.html