微信小程序实现竖排slider效果

本文实例为大家分享了微信小程序实现竖排slider效果的具体代码,供大家参考,具体内容如下

js:

Component({
  properties: {
    blockColor: {
      type: String,
      value: "#ffffff"
    },
    blockSize: {
      type: Number,
      value: 28
    },
    backgroundColor: {
      type: String,
      value: "#e9e9e9"
    },
    activeColor: {
      type: String,
      value: "#1aad19"
    },
    step: {
      type: Number,
      value: 1
    },
    min: {
      type: Number,
      value: 0
    },
    max: {
      type: Number,
      value: 100
    },
    value: {
      type: Number,
      value: 0
    },
    disabled: {
      type: Boolean,
      value: false
    },
    showValue: {
      type: Boolean,
      value: false
    },
  },
  observers: {
    'blockSize': function(blockSize) {
      if (blockSize > 28) {
        this.setData({
          blockSize: 28
        })
      } else if (blockSize < 12) {
        this.setData({
          blockSize: 12
        })
      }
    },
    'showValue': function(){
      this.queryHeight() // 由于显示数字后,滑动区域变化,需要重新查询可滑动高度
    }
  },
  data: {
    totalTop: null,
    totalHeight: null,
    currentValue: 0,
  },
  methods: {
    setCurrent: function(e){
      this.setData({
        currentValue: e.value
      })
    },
    queryHeight: function(){
      wx.createSelectorQuery().in(this).select('.slider-container').boundingClientRect((res) => {
        this.setData({
          totalTop: res.top,
          totalHeight: res.height
        })
      }).exec()
    },
    empty: function(){},
  }
})

json:

{
  "component": true,
  "usingComponents": {}
}

wxml:

<wxs module="eventHandle" src="./SliderVertical.wxs"></wxs>
<view class="slider" catchtouchmove="empty">
  <view class="slider-append" data-percent="0" bindtap="{{eventHandle.tapEndPoint}}"></view>
  <view class="slider-container" change:prop="{{eventHandle.propsChange}}" prop="{{ {max,min,step,value,totalTop,totalHeight,disabled} }}" >
    <view class="slider-lower" id="lower" catchtap="{{eventHandle.tap}}">
      <view class="slider-lower-line" style="background-color: {{activeColor}}"></view>
    </view>
    <view class="slider-middle">
      <view 
        class="slider-block" 
        style="background-color:{{blockColor}};box-shadow:{{blockColor=='#ffffff'?'0 0 2px 2px rgba(0,0,0,0.2)':'none'}};width:{{blockSize}}px;height:{{blockSize}}px" 
        catchtouchstart="{{eventHandle.start}}" 
        catchtouchmove="{{eventHandle.move}}"
        catchtouchend="{{eventHandle.end}}"
        ></view>
    </view>
    <view class="slider-upper" id="upper" catchtap="{{eventHandle.tap}}">
      <view class="slider-upper-line" style="background-color: {{backgroundColor}}"></view>
    </view>
  </view>
  <view class="slider-append" data-percent="1" bindtap="{{eventHandle.tapEndPoint}}"></view>
  <view class="slider-value" wx:if="{{showValue}}">{{currentValue}}</view>
</view>

wxs:

var notInt = function(num) {
  return num !== parseInt(num)
}
/*
 * state:共享临时数据对象
 * state.max:最大值
 * state.min:最小值
 * state.offset:当前高度,即value-min的值(未按照step纠正的值)
 * state.step:步长
 * ins:页面或组件实例
 */
var calculate = function(instance,state,changeCallback){
  var max = state.max
  var min = state.min
  var offset = state.offset
  var step = state.step
  // 1、计算 offset 按照 step 算应该是几个。
  // Math.round(offset % step / step) 计算的是 offset 对 step 取模后剩下的长度四舍五入,就是多出来的部分是否该算一步
  // Math.floor(offset / step) 计算的是 offset 中包含多少个完整的 step
  var stepNum = Math.round(offset % step / step) + Math.floor(offset / step)
  // 2、纠正后的当前高度
  var current = stepNum * step

  // 3、当前高度所占比例,由于 offset 的大小已经在进方法前经过了修正,所以这里不需要再判断是否小于0或者大于100了
  var percent = current * 100 / (max - min)

  instance.selectComponent("#upper").setStyle({
    height: (100 - percent) + "%"
  })
  instance.selectComponent("#lower").setStyle({
    height: percent + "%"
  })
  if(state.current !== current){
    state.current = current
    changeCallback(current+min)
  }
}

module.exports = {
  propsChange: function(newValue, oldValue, ins) {
    var state = ins.getState()
    var step = newValue.step;
    var min = newValue.min;
    var max = newValue.max;
    var value = newValue.value;
    if (notInt(step) || notInt(min) || notInt(max) || notInt(value)) {
      console.log("你不把 step min max value 设成正整数,我没法做啊")
      return
    }
    if (min > max) {
      min = oldValue.min
      max = oldValue.max
    }
    if (value > max) {
      console.log("value的值比max大,将value强制设为max")
      value = max
    } else if (value < min) {
      console.log("value的值比min小,将value强制设为min:"+min)
      value = min
    }
    if (step <= 0 || (max - min) % step != 0) {
      console.log("step只能是正整数且必须被(max-min)整除,否则将step强制设为1")
      step = 1
    }
    state.min = min
    state.max = max
    state.step = step
    state.offset = value - min
    state.disabled = newValue.disabled
    state.totalTop = newValue.totalTop
    state.totalHeight = newValue.totalHeight
    if (newValue.totalTop !== null && newValue.totalHeight !== null) {
      calculate(ins, state, function(currentValue){
        ins.callMethod("setCurrent", {value: state.current + state.min})
      })
    }
  },
  tapEndPoint: function(e, ins){
    var state = ins.getState()
    if (state.disabled) return
    var percent = e.currentTarget.dataset.percent
    state.offset = (state.max - state.min) * percent
    calculate(ins, state, function (currentValue) {
      ins.triggerEvent("change", {
        value: currentValue
      })
      ins.callMethod("setCurrent", {value: currentValue})
    })
  },
  tap: function(e, ins) {
    var state = ins.getState()
    if (state.disabled) return
    // (总高度+头部高度-点击点高度)/ 总高度 = 点击点在组件的位置
    // 点击事件只在线条上,所以percent是不可能小于0,也不可能超过100%,无需另加判断
    var percent = ( e.changedTouches[0].pageY - state.totalTop) / state.totalHeight
    state.offset = (state.max - state.min) * percent
    calculate(ins, state, function(currentValue){
      ins.triggerEvent("change", {
        value: currentValue
      })
      ins.callMethod("setCurrent", {value: currentValue})
    })
  },
  start: function(e, ins) {
    var state = ins.getState()
    if (state.disabled) return
    state.startPoint = e.changedTouches[0]
    // 本次滑动之前的高度px = 当前高度value / (最大值-最小值) * 最大高度
    var currentPx = state.current / (state.max - state.min) * state.totalHeight
    state.currentPx = currentPx
  },
  move: function(e, ins) {
    var state = ins.getState()
    if (state.disabled) return
    var startPoint = state.startPoint
    var endPoint = e.changedTouches[0]
    // 当前的高度px = 滑动之前的高度px + 起始点高度 - 当前点高度
    var currentPx = state.currentPx + endPoint.pageY - startPoint.pageY
    var percent = currentPx / state.totalHeight
    // 由于可能滑出slider范围,所以要限制比例在 0-1之间
    percent = percent>1?1:percent
    percent = percent<0?0:percent
    state.offset = (state.max - state.min) * percent
    calculate(ins, state, function(currentValue){
      ins.triggerEvent("changing", {
        value: currentValue
      })
      ins.callMethod("setCurrent", {value: currentValue})
    })
  },
  end: function(e, ins) {
    var state = ins.getState()
    if (state.disabled) return
    ins.triggerEvent("change", {
      value: state.current + state.min
    })
  }
}

wxss:

.slider {
  height: 100%;
  padding: 30rpx 0;
  box-sizing: border-box;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: space-around;
}
.slider-container {
  flex: 1;
  margin: 0 20px;
  width: 0;
  display: flex;
  flex-direction: column;
  align-items: center;
}
.slider-upper {
  flex-shrink: 0;
  height: 100%;
}
.slider-lower {
  flex-shrink: 0;
  height: 0%;
}
.slider-upper-line {
  height: 100%;
  margin: 0 12px;
  width: 2px;
}
.slider-lower-line {
  height: 100%;
  margin: 0 12px;
  width: 2px;
}
.slider-middle {
  flex-shrink: 0;
  width: 0;
  height: 0;
  display: flex;
  align-items: center;
  justify-content: center;
}
.slider-block {
  flex-shrink: 0;
  width: 20rpx;
  height: 20rpx;
  border-radius: 50%;
  position: relative;
  z-index: 1;
}
.slider-value {
  flex-shrink: 0;
  pointer-events: none;
}
.slider-append {
  flex-shrink: 0;
  height: 10px;
  padding: 0 20px;
}

保存到组件

index部分

js`:

Page({
  slider1change: function (e) {
    console.log("change:",e)
  },
  slider1changing: function (e) {
    console.log("changing:",e)
  },
})

wxml:

<view style="height: 400rpx;margin: 20px;display: flex;justify-content: space-around">
  <slider-vertical 
    block-color="#ffffff"
    block-size="28"
    backgroundColor="#e9e9e9" 
    activeColor="#1aad19" 
    bindchange="slider1change"
    bindchanging="slider1changing"
    step="1"
    min="0" 
    max="200"
    value="0"
    disabled="{{false}}"
    show-value="{{true}}"
    ></slider-vertical>
  <slider-vertical 
    block-color="#ffffff"
    block-size="28"
    backgroundColor="#e9e9e9" 
    activeColor="#1aad19" 
    bindchange="slider1change"
    bindchanging="slider1changing"
    step="5"
    min="50" 
    max="200"
    value="115"
    disabled="{{false}}"
    show-value="{{false}}"
    ></slider-vertical>
</view>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 微信小程序使用slider实现音频进度条

    众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所以就想到了用slider来实现音频的进度条显示及控制 微信小程序的slider组件,效果如图: 长的跟进度条还是蛮相似的. 下面上代码 slider是进度条,bindchange是slider的拖动事件,playtime 已播放时间,alltime 总时间 <view class='slider'>     <slider bindchange='sliderChange' activeC

  • 微信小程序使用slider设置数据值及switch开关组件功能【附源码下载】

    本文实例讲述了微信小程序使用slider设置数据值及switch开关组件功能.分享给大家供大家参考,具体如下: 1.效果展示 2.关键代码 ① index.wxml <view>微信小程序组件:滑动选择器slider</view> <slider bindchange="sliderBindchange" min="{{min}}" max="{{max}}" show-value/> <view>

  • 微信小程序(二十)slider组件详细介绍

    slider滑动组件用的不太多,在其他平台反正我是用的不多 主要属性: wxml <slider max="100" step="10" show-value="true" bindchange="listenerSlider" /> js Page({ data:{ // text:"这是一个页面" }, /** * 监听slider */ listenerSlider:function(e)

  • 微信小程序 slider的简单实例

    微信小程序 slider的简单实例 实现效果图: 微信小程序slider应用,可加减的slider控制 <view class="control-w "> <block wx:for="{{controls}}" wx:key="id" wx:for-item="v"> <view class="slide-item"> <view class="item

  • 微信小程序基于slider组件动态修改标签透明度的方法示例

    本文实例讲述了微信小程序基于slider组件动态修改标签透明度的方法.分享给大家供大家参考,具体如下: 1.效果展示 2.关键代码 index.wxml <view class="img" style="opacity:{{imgOpacity}}"></view> <slider min="0" max="1" step="0.1" show-value value=&quo

  • 微信小程序slider组件使用详解

    本文为大家分享了微信小程序slider组件的使用方法,供大家参考,具体内容如下 效果图 WXML <view class="tui-content"> <view class="tui-slider-head">设置step,当前设置步伐为5,当前值:{{slider1}}</view> <view class="tui-slider-box"> <slider bindchange=&quo

  • 微信小程序 slider 详解及实例代码

    微信小程序slider 相关文章: 微信小程序 Button 微信小程序 radio 微信小程序 slider 微信小程序 switch 微信小程序 textarea 微信小程序 picker-view 微信小程序 picker 微信小程序 label 微信小程序 input 微信小程序 form 微信小程序 checkbox 实现效果图: 滑动选择器 属性名 类型 默认值 说明 min Number 0 最小值 max Number 100 最大值 step Number 1 步长,取值必须大

  • 微信小程序图片轮播组件gallery slider使用方法详解

    本文实例为大家分享了微信小程序图片轮播组件的具体代码,供大家参考,具体内容如下 先上效果图: wxml <scroll-view scroll-y="true" style="height:200px" class="page-body" bindscrolltolower="loadMore"> <view class="swiper"> <swiper class=&quo

  • 微信小程序实现竖排slider效果

    本文实例为大家分享了微信小程序实现竖排slider效果的具体代码,供大家参考,具体内容如下 js: Component({   properties: {     blockColor: {       type: String,       value: "#ffffff"     },     blockSize: {       type: Number,       value: 28     },     backgroundColor: {       type: Stri

  • 微信小程序实现带放大效果的轮播图

    本文实例为大家分享了微信小程序实现带放大效果的轮播图,供大家参考,具体内容如下 效果如图 WXML <!-- 轮播图 --> <view class='Carousel'> <view class="recommend"> <view class="swiper-container"> <swiper class="swiper" autoplay="auto" inter

  • 微信小程序canvas写字板效果及实例

    微信小程序canvas写字板效果及实例 写字板效果:书写文字,画板重置,导出图片,导出图片前判断是否书写内容 app.json: 添加一个路由:"pages/canvas/canvas" { "pages":[ "pages/index/index", "pages/logs/logs", "pages/canvas/canvas" ], "window":{ "navigat

  • 微信小程序左滑删除效果的实现代码

    今天我们说下微信小程序左滑删除效果的实现,现在市场上很多APP都在使用这个效果,一个listView页面,向左滑动一条item时,右侧会出现一个删除或者其他的选项,用户体验非常好,操作起来十分方便,今天我们使用微信小程序来实现这个效果....... 先看效果 要实现的效果: 1,当向左滑动时,item跟随手指像左移动,同时右侧出现两个可点击的按钮 2,当滑动距离大于按钮宽度一半松开手指时,item自动滑动到左侧显示出按钮,小于一半时item自动回到原来的位置,隐藏按钮. 思路: 1,首先页面每个

  • 微信小程序顶部可滚动导航效果

    需求是小程序做头部做导航分类的效果 顶部用 scroll-view 组件横向滚动,类似tab选项卡的效果,内容用类似模板方式引用,可重复利用 <scroll-view class="scroll-view_H" scroll-x="{{true}}" style="width: 100%"> <view wx:for="{{classify}}" wx:key="id" data-type

  • 微信小程序实现跟随菜单效果和循环嵌套加载数据

    本文实例为大家分享了微信小程序实现跟随菜单效果.微信小程序循环嵌套加载数据,供大家参考,具体内容如下 效果如图: 代码如下: wxml //使用循环嵌套data数据格式写对即可 <scroll-view class="left" scroll-y> <view wx:for="{{left}}" class="leftlist {{index==_click?'yes':''}}" data-i="{{index}}&

  • 微信小程序实现tab切换效果

    微信小程序之tab切换效果,如图: 最近在学习微信小程序并把之前的公司app搬到小程序上,挑一些实现效果记录一下(主要是官方文档里没说的,毕竟官方文档只是介绍功能) .wxml代码: <view class="body"> <view class="nav bc_white"> <view class="{{selected?'red':'default'}}" bindtap="selected"

  • 微信小程序实现鼠标拖动效果示例

    本文实例讲述了微信小程序实现鼠标拖动效果.分享给大家供大家参考,具体如下: 1.效果展示 2.关键代码 index.wxml文件 <view class="view" style="left:{{left}}px;top:{{top}}px;" bindtouchmove="viewTouchMove" >使用鼠标拖动我</view> index.js文件 Page({ data:{ left:'', top:'' },

  • 微信小程序实现星星评价效果

    本文实例为大家分享了微信小程序实现星星评价效果的具体代码,供大家参考,具体内容如下 代码实现 wxml文件 <!--pages/evaluatepage/evaluatepage.wxml--> <view class='container'> <view class='evaluate_contant'> <!--外层循环控制有几个评价条目 --> <block wx:for='{{evaluate_contant}}' wx:key='' wx:f

  • 微信小程序实现蒙版弹窗效果

    本文实例为大家分享了微信小程序实现蒙版弹窗效果的具体代码,供大家参考,具体内容如下 <view class="modalDlg" wx:if="{{showModal}}"> <view class='close_mask' bindtap="close_mask">X</view> <input class='recharge_amount' type='text' placeholder='充值金额'

随机推荐