微信小程序滑动标尺/刻度尺

项目需要,开发了一个滑动标尺的组件,炒鸡好用的哦~~~

本来是想用touchmove,touchend来通过translate位移实现效果,事实证明,这种方式也是可行的。但是别忘了小程序中还有一个好用的组件 scroll-view ,利用属性bindscroll 轻轻松松获取滚动信息。下面直接上代码吧。

组件

组建目录:


组件目录.png
<!-- 标尺 -->
<view id="ruler" class="{{type}}">
    <view class="cur_val">
        <text>{{curVal}}</text>
        <text class="unit">{{unit}}</text>
    </view>

    <view class="box">
        <text class="cursor"></text>
        <scroll-view scroll-x="true" scroll-left="{{salNum}}" scroll-with-animation='true' catchscroll="bindscroll" throttle="{{false}}">
            <view class="scroller" style="width:{{scaleWidth}};" >
                <text wx:for="{{count}}" wx:key="{{index}}" class="{{((item+min)*step) % bigStep == 0 ? 'big':((item+min)*step) % middleStep == 0 ? 'middle' : ''}}">
                    <text wx:if="{{(item+min)%10==0}}" class="scale_txt">{{item + min}}</text>

                </text>
            </view>
        </scroll-view>
    </view>
</view>

如上,scroll-view为滑动区域,利用catchscroll监听滚动事件获取移动距离e.detail.scrollLeft;bigStep和middleStep是控制刻度尺样式 10个小格最长,5个小格中等长。

properties: {
        min:{
            type: Number,
            value: 0
        },
        max:{
            type: Number,
            value: 100
        },
        def:{
            type: Number,
            value: 30
        },
        unit:{
            type: String,
            value: ''
        }
    },

    /**
    * 组件的初始数据
    */
    data: {
        curVal: 0,//当前值
        step: 1,//步长 每格代表的值
        middleStep: 5,
        bigStep: 10,
        cellW: 10
    },
    created: function(){
        //组件实例被创建,此时不能使用setData

    },
    ready: function(){
        //初始化
        var _this = this;
        var _this_ = this.data;
        //一共有多少格
        var count = Math.ceil((_this_.max - _this_.min) / _this_.step) + 1;
        _this.setData({
            count: count,
            scaleWidth: (count * _this_.cellW) + 'px', //尺子总长度
            salNum: (_this_.def - _this_.min) / _this_.step *  _this_.cellW
        });

        //初始值
        _this.setVal(_this_.salNum);
    },
 methods:{
        bindscroll: function(e){
            // 移动距离
            let left = e.detail.scrollLeft;

            this.setVal(left);

        },
        setVal: function(left){

            let curVal = Math.round(  left / this.data.cellW / this.data.step ) + this.data.min;
            this.setData({
                curVal: curVal > this.data.max ? this.data.max : (curVal < this.data.min ? this.data.min : curVal),
                // salNum: left
            });

            this.triggerEvent('slide',{"curVal":this.data.curVal});
        },
        setDefVal: function(){
            //初始值
            var _this = this;
            this.setData({
                salNum: (_this.data.curVal - this.data.min) * this.data.cellW * this.data.step
            });
        }
    }

如上,data中cellW为小格子宽度(wxss里面宽度+边框的值);methods中通过 this.triggerEvent('slide',{"curVal":this.data.curVal}) 触发slide自定义事件把值传递。

.scroller>text{
    font-size: 20rpx;
    color: #333;
    display: inline-block;
    width: 9px;                      /*刻度尺宽度用px*/
    border-left: 1px solid #333;
    border-bottom: 1px solid #333;
    height: 20rpx;
    vertical-align: bottom;
    position: relative;
}

wxss里面主要强调一点,刻度尺的宽度需要用px来设置,因为不同手机分辨率不一样,如果用rpx的话,再换算成px移动距离精度不准确。
组件大致构成就是这了,那怎么用呢?看下面

具体使用

index.wxml : 传入最大值max,最小值min,默认值def

<view>
    <slide id="rule" min="0" max="100" def="30" bind:slide="slideTrigger"></slide>
</view>

<view>当前滑动值:{{val}}</view>

index.json : 根据你自己的目录引入

{
    "navigationStyle":"default",
    "navigationBarBackgroundColor": "#fff",
    "navigationBarTitleText": "刻度尺",
    "navigationBarTextStyle": "black",
    "disableScroll": true,
    "usingComponents": {
         "slide": "../components/slide/slide"
    }
}

index.js : 方法slideTrigger返回值为当前选择的值

Page({
    data: {

    },
    onLoad: function (options) {

    },
    slideTrigger: function(e){
        var that = this;
        that.setData({
            val: e.detail.curVal
        });
        console.log('当前选择的值',e.detail.curVal);
    }
})

好了,最后呈现出来的效果就是这样纸啦~


演示.gif

这是第一次写文章,如果有不明白的随时问我,我们一起进步学习!
具体的详细代码在这里哦~

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,504评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,434评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,089评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,378评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,472评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,506评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,519评论 3 413
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,292评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,738评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,022评论 2 329
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,194评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,873评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,536评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,162评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,413评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,075评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,080评论 2 352

推荐阅读更多精彩内容