如何写一个滑块区间选择控件

2018-09-18  本文已影响0人  文子产品笔记
最近要写一个滑块人数区间选择的控件,其实本来不算难,知识由于刚接触小程序,很多都语法不太熟所以花了点时间琢磨了下,具体效果看下面图: WechatIMG29.jpeg

整个滑块样式分为三部分,上面刻度,中间线条,下边滑块,所以只要对css样式熟练点就能写出来,另外需要监听滑块的move事件,代码如下:

wcss代码:

.content{
  display: flex;
  flex-direction: column;
  margin-left: 30px;
  margin-right: 30px;
}

.filter_content{
  display: flex;
  flex-direction: column;
  justify-content: center;
}

.barview{
  display: flex;
  height: 30px;
  justify-content: center;
}

.bar{
  position: relative;
  width: 100%;
  height: 30px;
}

.btn1{
  position: absolute;
}

.person{
  display: flex;
  height: 30px;
  justify-content: center;
}

.line-img{
  background: gray;
  width: 100%;
  height: 1px;
}

.line{
  display: flex;
  justify-content: center;
}

.kedus{
  width: 24px;
  line-height: 50rpx;
  text-align: center;
  background-size: 24px 30px;
  padding-top: 5rpx;
}

.no_sel_text{
  color: gray;
  font-size: 12px;
}

.sel_text{
  color: #fff;
  font-size: 9px;
}

.kedu{
  display: flex;
  width: 100%;
  justify-content: space-between;
  position: relative;
}

.kedu_img{
  width: 24px;
  height: 50rpx;
}

.showview{
  display: flex;
  justify-content: center;
}

.showtext{
  color: #ff0000;
}

wxml代码:

<view class='filter_content'>
      <!-- 刻度 -->
      <view class='person'>
        <view class='kedu'>
          <block wx:for="{{kedu}}" wx:key="{{index}}">
            <view class="kedus {{(index==start_index||index == end_index)?'sel_text':'no_sel_text'}}'"   style="background-image: url({{(index == start_index || index == end_index)?'http://p157c6vbr.bkt.clouddn.com/person_sel_point.svg':''}});">{{item}}</view>
          </block>
        </view>
      </view>

      <!-- 线条 -->
      <view class='line'>
        <image class='line-img'></image>
      </view>

      <!-- 滑动条 -->
      <view class='barview'>
        <view class='bar'>
          <image class='btn1' src="../../images/screen_number.svg" style="width:24px;height:30px; margin-left:{{ballLeft}}px;" bindtouchmove='movestart' bindtouchend='moveend'></image>
          <image class='btn1' src="../../images/screen_number.svg" style="width:24px;height:30px; right:{{ballLeft1}}px;" bindtouchmove='movestart1' bindtouchend='moveend1'></image>
        </view>
      </view>
    </view>

js代码:

  data: {
    screenHeight: null,
    screenWidth: null,
    ballLeft: 0,
    ballLeft1: 0,
    kedu: [1, 4, 6, 10, 12, 20, 50, 200, 300],
    kedutext1: 1,
    kedutext2: 300,
}
  onLoad: function (options) {
    var _this = this;
    wx.getSystemInfo({
      success: function (res) {
        _this.setData({
          screenHeight: res.windowHeight,
          screenWidth: res.windowWidth,
        });
      }
    });
  },


  movestart: function (e) {
    var touchs = e.touches[0];
    var pageX = touchs.pageX;
    var pageY = touchs.pageY;

    // //防止坐标越界,view宽高的一般  
    if (pageX < 0) return;
    if (pageX > this.data.screenWidth) return;

    //这里用right和bottom.所以需要将pageX pageY转换  
    var x = pageX;
    var y = pageY;
    var a = x / this.data.screenWidth;
    var index = parseInt(this.data.kedu.length * a);

    var ke = ((this.data.screenWidth - 60) - (this.data.kedu.length*24)) / (this.data.kedu.length - 1);
    var x1 = index * (ke+24);
    if (this.data.kedu[index] >= this.data.kedutext2 - 1){
    }else{
      this.setData({
        ballLeft: x1,
        kedutext1: this.data.kedu[index], 
        start_index: index
      });
    }
  },

  
  movestart1: function (e) {
    var touchs = e.touches[0];
    var pageX = touchs.pageX;
    var pageY = touchs.pageY;

    // //防止坐标越界,view宽高的一般  
    if (pageX < 0) return;
    if (pageX > this.data.screenWidth) return;
    //这里用right和bottom.所以需要将pageX pageY转换  
    var x = this.data.screenWidth - pageX;
    var y = this.data.screenHeight - pageY;
    var a = x / this.data.screenWidth;
    var index = parseInt(this.data.kedu.length * a);

    var ke = ((this.data.screenWidth - 60) - (this.data.kedu.length * 24)) / (this.data.kedu.length - 1);
    var x1 = index * (ke + 24);
    if (this.data.kedu[this.data.kedu.length - index - 1] <= this.data.kedutext1 + 1) {
    } else {
      this.setData({
        ballLeft1: x1,
        kedutext2: this.data.kedu[this.data.kedu.length - index - 1],
        end_index: this.data.kedu.length - index - 1
      });
    }
  },
  
  //块1滑动结束
  moveend:function(e){
    this.loadUIData();
  },

  //块2滑动结束
  moveend1: function (e) {
    this.loadUIData();
  },

因为没有写独立demo,所以没有把js代码整部分贴上来,不过核心代码就是movestart计算这块了。

上一篇下一篇

猜你喜欢

热点阅读