小程序按鈕滑動(dòng)案例

一.先看東西

滑動(dòng)前
滑動(dòng)后

二.再上代碼

index.wxml

<view class="content">
    <view class="sliderContent">
        <input placeholder="驗(yàn)證碼" placeholder-class="input-placeholder" disabled="{{disabled}}" />
        <view class="slider" bindtouchstart="moveSendBtnStart" bindtouchend="moveSendBtnEnd" bindtouchmove="moveSendBtn" style="left:{{moveSendBtnLeft}}rpx;background-color:{{SendBtnColor}}">發(fā)送</view>
    </view>
</view>

index.wxss


.content {
    margin-top: 100rpx;
    font-size: 24rpx;
}

.sliderContent{
    position: relative;
    margin: 0 auto;
    margin-bottom: 50rpx;
    padding-left: 60rpx;
    width: 425rpx;
    box-sizing: border-box;
    height: 70rpx;
    line-height: 70rpx;
    border-radius: 60rpx;
    background-color: #fff;
    color: #289adc;
    box-shadow: 0px 4px 6px 0px rgba(37, 114, 219, 0.3);
}

.sliderContent input {
    line-height: 70rpx;
    height: 70rpx;
    box-sizing: border-box;
    padding-left: 40rpx;
    width: 250rpx;
}

.input-placeholder {
    text-align: center;
    color: #289adc;
}


 .slider {
    position: absolute;
    top: 0;
    left: 0;
    width: 150rpx;
    border-radius: 60rpx;
    text-align: center;
    background-color: #7f7f7f;
    color: #fff;
    box-shadow: 0px 4px 6px 0px rgba(37, 114, 219, 0.3);
}

index.js


Page({
    data: {
        moveStartX: 0, //起始位置
        moveSendBtnLeft: 0, //發(fā)送按鈕的left屬性
        moveEndX: 0, //結(jié)束位置
        screenWidth: 0, //屏幕寬度
        moveable: true, //是否可滑動(dòng)
        disabled: true,//驗(yàn)證碼輸入框是否可用,
        SendBtnColor: "#7f7f7f" //滑動(dòng)按鈕顏色
    },

    onLoad: function () {
        var that = this;
        // 獲取屏幕寬度
        wx.getSystemInfo({
            success: function (res) {
                that.setData({
                    screenWidth: res.screenWidth
                })
            },
        })
    },
    //   開(kāi)始移動(dòng)
    moveSendBtnStart: function (e) {
        if (!this.data.moveable) {
            return;
        }
        console.log("start");
        console.log(e);
        this.setData({
            moveStartX: e.changedTouches["0"].clientX
        })
    },
    //移動(dòng)發(fā)送按鈕
    moveSendBtn: function (e) {
        if (!this.data.moveable) {
            return;
        }
        var that = this;
        // console.log(e.touches[0]);
        var left = ((e.touches[0].clientX - that.data.moveStartX) / (that.data.screenWidth / 750))
        console.log(left)
        if (left <= 275.5) {
            this.setData({
                moveSendBtnLeft: left
            })
        } else {

            this.setData({
                moveSendBtnLeft: 275.5
            })
        }
    },
    // 結(jié)束移動(dòng)
    moveSendBtnEnd: function (e) {
        console.log("end");
        var that = this;
        var left = ((e.changedTouches[0].clientX - that.data.moveStartX) / (that.data.screenWidth / 750))
        console.log(left);
        if (left < 275.5) {
            for (let i = left; i >= 0; i--) {

                that.setData({
                    moveSendBtnLeft: i
                })
            }
        } else {
            that.setData({
                moveEndX: e.changedTouches[0].clientX,
                moveable: false,
                disabled: false,
                SendBtnColor: "#289adc"
            })
        }
    }


})

三.順便說(shuō)說(shuō)

1.按鈕滑動(dòng)事件

bindtouchstart //按鈕開(kāi)始滑動(dòng)
bindtouchend //按鈕結(jié)束滑動(dòng)
bindtouchmove //按鈕正在滑動(dòng)

在按鈕開(kāi)始滑動(dòng)是記錄開(kāi)始的位置
滑動(dòng)結(jié)束時(shí)要判斷按鈕是否已經(jīng)滑動(dòng)到最右側(cè),如果只滑動(dòng)到中間,則彈回

滑動(dòng)過(guò)程中要計(jì)算與初始位置的距離,然后計(jì)算并改變button的left屬性值

2.按鈕滑動(dòng)的距離計(jì)算

因?yàn)榛瑒?dòng)事件返回的數(shù)值都是以px作為單位,而我們?cè)诮缑嬖O(shè)計(jì)時(shí)使用的是rpx,在這里我們要進(jìn)行數(shù)值計(jì)算
在onLoad中,我們獲取到當(dāng)前設(shè)備的寬度
rpx作為單位時(shí),認(rèn)為當(dāng)前設(shè)備的邏輯寬度為750rpx
假設(shè)屏幕實(shí)際寬度為400px,那么1px = 400/750 rpx
那么滑動(dòng)的距離 = 實(shí)際互動(dòng)距離 / (400/750) rpx
經(jīng)過(guò)換算后,我們就可以得到以rpx作為單位的滑動(dòng)距離

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 問(wèn)答題47 /72 常見(jiàn)瀏覽器兼容性問(wèn)題與解決方案? 參考答案 (1)瀏覽器兼容問(wèn)題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補(bǔ)...
    _Yfling閱讀 13,784評(píng)論 1 92
  • ¥開(kāi)啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開(kāi)一個(gè)線程,因...
    小菜c閱讀 6,497評(píng)論 0 17
  • WXML WXML(WeiXin Markup Language)是微信的一套標(biāo)簽語(yǔ)言,結(jié)合基礎(chǔ)組件、事件系統(tǒng),可...
    許劍鋒閱讀 6,908評(píng)論 3 51
  • 懷念上學(xué)的日子 無(wú)憂無(wú)慮,沒(méi)心沒(méi)肺 六點(diǎn)半起床,風(fēng)雨不誤 邁著希望的“一二一” 懷念食堂的大姐 為我留下的可口飯菜...
    小板凳槿沐閱讀 306評(píng)論 2 2
  • 首先我們來(lái)看看MVC架構(gòu)的示意圖: 和訪問(wèn)者交互的是控制層(Controller層),控制器(controller...
    php紅薯閱讀 283評(píng)論 0 0