美文网首页
微信小程序scroll-bar组件

微信小程序scroll-bar组件

作者: 如风_周 | 来源:发表于2020-07-09 20:13 被阅读0次

前言

公司小程序出了一个功能需要开发一个scroll-bar组件,自己看微信API文档造轮子,在效果完成后代码发出来供大家参考,有需要的直接拿去用(不会整理文档格式,看看就好)。

功能点

支持数据动态加载
支持默认值设置,在没有默认值情况下设置默认选中第一个
支持默认默认值后 跳转到相应的选中事件位置

效果图

image

wxml

<view class="b_tabs" bind:touchstart="touchstart" bind:touchmove="touchmove" style="{{style}}">
  <view class="b_content" style="transform:translateX({{left}}px)">
    <view class="b_tabs_item" wx:for="{{dataList}}" wx:key="value" bind:tap="setSelect" data-value="{{item.value}}">
      <view class="text {{item.value == value?'b_tabs_item_active':''}}">{{item.name}}</view>
    </view>
  </view>
</view>

js

Component({
  properties: {
    dataList: {
      type: Array,
      value: [{
        name:'最新',
        value:0
      },{
        name:'西装',
        value:1
      },{
        name:'鞋子',
        value:2
      },{
        name:'外套',
        value:3
      },{
        name:'短裤',
        value:4
      },{
        name:'半身裙',
        value:5
      },{
        name:'西装',
        value:6
      },{
        name:'外套',
        value:31
      },{
        name:'短裤',
        value:422
      },{
        name:'半身裙',
        value:51
      },{
        name:'西装',
        value:61
      },]
    },
    value: {
      type: String,
      value: ''
    },
    style:String,
  },
  data: {
      left: 0,
      // 触控移动移动距离
      width: 0,
      phoneWidth:0,
      dom: {
        left: 0,
        width: 0,
      }
  },
  ready() {
    this.initTab()
  },
  methods: {

    initTab() {
      const query = wx.createSelectorQuery().in(this)

      query
        .select(".b_tabs")
        .boundingClientRect(res => {
          this.setData({
            'dom.phoneWidth':res.width
          })
          this.data.phoneWidth = res.width
        })
        .selectAll(".b_tabs_item")
        .boundingClientRect(res => {
          if(!res ||this.data.dataList.length === 0)return
          let domWidth = 0;
          let selectDomWidth = 0;
          this.data.dataList.forEach((element, index) => {
            if (this.data.value == element.value) {
              selectDomWidth = domWidth
            }
            domWidth+=res[index].width
          });
          if (this.data.value == "" || this.data.value == undefined) {
            this.triggerEvent('cb', this.data.dataList[0].value)
          }
          this.setData({
            'dom.width':domWidth
          },()=>{
            if(domWidth <= this.data.phoneWidth){
              this.setValue(0);
            }else if(domWidth  > selectDomWidth && domWidth - selectDomWidth > this.data.phoneWidth){
              // 可滑动面积大于0且可滑动面积大于滑动面积
              this.setValue(-selectDomWidth);
            }else if(domWidth > selectDomWidth && domWidth - selectDomWidth <= this.data.phoneWidth){
              // 可滑动面积大于0且可滑动面积小于滑动面积
              this.setValue(-(domWidth-this.data.phoneWidth));
            }
          })
        })
        .exec();
    },
    setSelect(e) {
      const {dataset} = e.currentTarget
      this.triggerEvent('input', dataset)
      this.triggerEvent('cb', dataset.value)
    },
    /**
     * 事件开始
     * @param e
     */
    touchstart(e) {
      const { pageX } = e.touches[0];
      // 移动的距离
      this.data.width = pageX - this.data.left;
    },
    touchmove(e) {
      const { pageX } = e.touches[0];
      this.setValue(pageX - this.data.width);
    },
    /**
     * 设置移动距离
     * @param value
     */
    setValue(value) {
      // 超出tab长度禁止滚动
      if(this.data.dom.width - this.data.phoneWidth < -value)return
      // 设置滚动距离
      this.setData({
        left:Math.max(-this.data.dom.width, Math.min(parseInt(value), 0))
      })
    }
  }
});

wxss

.b_tabs {
  width: 100%;
  overflow: hidden;
  background: #fff;
  margin-bottom: 0.02rem;
}

.b_content {
  height: 94rpx;
  display: flex;
}

.b_tabs_item {
  font-size: 30rpx;
}

.text {
  line-height: 94rpx;
  white-space: nowrap;
  color: #999;
  margin: 0 25rpx;
}

.b_tabs_item_active {
  color: #7468F2;
  font-size: 1.134em;
  font-weight: 600;
}

相关文章

  • 微信小程序scroll-bar组件

    前言 公司小程序出了一个功能需要开发一个scroll-bar组件,自己看微信API文档造轮子,在效果完成后代码发出...

  • 小程序好文集合

    组件篇 微信小程序:组件实践 整体梳理 微信小程序开发深入解读

  • 微信小程序-canvas压缩图片使用入门

    微信小程序canvas组件官方文档 微信小程序canvas组件官方文档canvas API canvas组件介绍 ...

  • 微信小程序日历组件开发

    # 微信小程序日历组件开发 微信小程序基础知识 微信小程序 框架介绍 组件文档 上述是开发小程序的基本知识。 今天...

  • 微信小程序基础

    微信小程序介绍微信小程序开发工具的使用微信小程序框架文件微信小程序逻辑层微信小程序视图层微信小程序组件介绍微信小程...

  • 微信小程序组件探究和应用

    把玩微信小程序组件 微信小程序把玩《二》:页面生命周期,模块化,数据绑定,view组件 微信小程序把玩《三》:sc...

  • 微信小程序性能优化实践

    历史回顾: 微信小程序自定义组件 - 表格组件来啦 通过微信小程序来实现 “钉钉打卡” 记一次微信小程序项目分包,...

  • 微信小程序组件化开发

    什么是组件化开发 微信小程序的组件和Vue的组件非常相似。 在微信小程序中有很多内置组件,比如button vie...

  • 小程序tab组件封装

    微信小程序tab组件封装 最近在做微信小程序的项目,下面就微信小程序中tab的tab功能封装成一个组件,在项目项需...

  • 微信小程序细节1(icon的使用)

    微信小程序官网地址如下:(11月3号晚10点之后微信小程序开始公测,但不支持发布) 微信小程序 微信小程序的组件-...

网友评论

      本文标题:微信小程序scroll-bar组件

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