国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【微信原生小程序】手寫雙向slider滑塊

這篇具有很好參考價值的文章主要介紹了【微信原生小程序】手寫雙向slider滑塊。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

前言

官方自帶的以及vant weapp組件都是只有單向的slider
【微信原生小程序】手寫雙向slider滑塊

雙向的slider,網(wǎng)上抄了幾篇文章,代碼量巨大而且還有各種bug,相當(dāng)難用,chatGPT寫的也沒法用,沒辦法,只能自己手寫一個了

【微信原生小程序】手寫雙向slider滑塊

實現(xiàn)了的幾個細節(jié)(別的文章里大部分存在這些bug)

一、當(dāng)左滑塊拖動的范圍超過父容器最左邊時,賦值為0;
右邊同理賦值為最大值
二、當(dāng)右滑塊向左滑,并且試圖越過左滑塊時,右邊賦值與左邊相等,并且無法越過左邊(最多就是兩個圓圈緊挨著)
三、可重置

父組件代碼(很簡單)

<my-slider bind:submit="getAge" ></my-slider>
getAge(e){
    this.setData({
         min: e.detail.min,
         max: e.detail.max,
     })
 }

子組件代碼(最重要的部分)

<view class="slider-background">
  <view class="slider" style="padding-left: {{pdLeft}}rpx;padding-right: {{pdRight}}rpx;">
    <view class="slider-circle" bindtouchstart="touchStart1" bindtouchmove="touchMove1" bindtouchend="touchEnd1"></view>
    <view class="main-slider"></view>
    <view class="slider-circle" bindtouchstart="touchStart2" bindtouchmove="touchMove2" bindtouchend="touchEnd2"></view>
  </view>
</view>

.slider-background{
  width: 684rpx;
  margin: 0 auto;
  display: flex;
  align-items: center;
  height: 8rpx;
  background-color: rgb(228, 228, 228);
}
.slider{
  width: 100%;
  padding: 0;
  display: flex;
  align-items: center;
}
.slider .main-slider{
  width: calc(100% - 84rpx);
  height: 8rpx;
  background-color: blue;
}
.slider .slider-circle{
  width:  42rpx;
  height: 42rpx;
  background-color: #fff;
  border-radius: 50%;
  box-shadow: 0 2rpx 4rpx rgba(0, 0, 0, 0.5);

}
// components/slider/index.js
Component({
    // 使用全局樣式
    options: {
        addGlobalClass: true
    },
    lifetimes: {
        attached: function() {
          // 在組件實例進入頁面節(jié)點樹時執(zhí)行
            const res = wx.getSystemInfoSync()
            this.setData({
                ratio: 750 / res.windowWidth
            })
          
        },
        detached: function() {
          // 在組件實例被從頁面節(jié)點樹移除時執(zhí)行
        },
    },
    /**
     * 組件的屬性列表
     */
    properties: {

    },

    /**
     * 組件的初始數(shù)據(jù)
     */
    data: {
        pdLeft: 0,     // 左邊滑塊的位置
        pdRight: 0,     // 右邊滑塊的位置
        ratio: 2,
        startX1: 0,     //計算左滑塊初始位置離屏幕左邊的距離
        startX2: 0,     //計算右滑塊初始位置離屏幕右邊的距離
    },

    /**
     * 組件的方法列表
     */
    methods: {
        touchStart1(e){
            // console.log("e0", e.touches[0].clientX);
            if(!this.data.startX1){
                this.setData({
                    startX1: e.touches[0].clientX
                })

            }
        },
        touchMove1(e){
            // console.log("eeee1", e.touches[0].clientX);
            let x = (e.touches[0].clientX - this.data.startX1) * this.data.ratio
            let v = x >= 0 ? x : 0               //不能超過父容器最左邊
            if(v + this.data.pdRight >= 600){    //右邊的滑塊越過左邊時
                v = 600 - this.data.pdRight
            }
            this.setData({
                pdLeft: v
            })
            this.triggerEvent('submit', {
                min: Math.round(v/5),
            })
            // console.log("this.data.pdLeft", this.data.pdLeft);
        },
        touchEnd1(){},
        touchStart2(e){
            // console.log("e0", e.touches[0].clientX);
            if(!this.data.startX2){
                this.setData({
                    startX2: e.touches[0].clientX
                })

            }
        },
        touchMove2(e){
            // console.log("eeee2", e.touches[0].clientX);
            let x = (this.data.startX2 - e.touches[0].clientX) * this.data.ratio
            let v = x >= 0 ? x : 0              //不能超過父容器最右邊
            if(v + this.data.pdLeft >= 600){    //右邊的滑塊越過左邊時
                v = 600 - this.data.pdLeft
            }
            this.setData({
                pdRight: v
            })
            this.triggerEvent('submit', {
                max: Math.round((600-v)/5),
            })
            // console.log("this.data.pdRight", this.data.pdRight);
        },
        touchEnd2(){},
        reset(){
            this.setData({
                pdLeft: 0,
                pdRight: 0,
                startX1: 0,
                startX2: 0,
            })
            this.triggerEvent('submit', {
                min: 0,
                max: 120
            })
        },
        
    }
})

備注

看js文件可以看到,我是直接在里面寫了0到120,如果要設(shè)計成最小值最大值從父組件傳進來可以自己稍作修改。
其他參數(shù)同理(顏色,圓圈樣式等等)

存在的問題

父容器寫死了width: 684rpx;減去兩個圓圈剛好是600rpx;所以js里很多計算都是直接用600進行計算。

優(yōu)化方案:可以改成父容器里寫width: 100%;然后在js里先調(diào)用方法來獲取他的寬度文章來源地址http://www.zghlxwxcb.cn/news/detail-482306.html

到了這里,關(guān)于【微信原生小程序】手寫雙向slider滑塊的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包