【微信原生小程序】手写双向slider滑块

这篇具有很好参考价值的文章主要介绍了【微信原生小程序】手写双向slider滑块。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

官方自带的以及vant weapp组件都是只有单向的slider
【微信原生小程序】手写双向slider滑块

双向的slider,网上抄了几篇文章,代码量巨大而且还有各种bug,相当难用,chatGPT写的也没法用,没办法,只能自己手写一个了

【微信原生小程序】手写双向slider滑块

实现了的几个细节(别的文章里大部分存在这些bug)

一、当左滑块拖动的范围超过父容器最左边时,赋值为0;
右边同理赋值为最大值
二、当右滑块向左滑,并且试图越过左滑块时,右边赋值与左边相等,并且无法越过左边(最多就是两个圆圈紧挨着)
三、可重置

父组件代码(很简单)

<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() {
          // 在组件实例进入页面节点树时执行
            const res = wx.getSystemInfoSync()
            this.setData({
                ratio: 750 / res.windowWidth
            })
          
        },
        detached: function() {
          // 在组件实例被从页面节点树移除时执行
        },
    },
    /**
     * 组件的属性列表
     */
    properties: {

    },

    /**
     * 组件的初始数据
     */
    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,如果要设计成最小值最大值从父组件传进来可以自己稍作修改。
其他参数同理(颜色,圆圈样式等等)

存在的问题

父容器写死了width: 684rpx;减去两个圆圈刚好是600rpx;所以js里很多计算都是直接用600进行计算。

优化方案:可以改成父容器里写width: 100%;然后在js里先调用方法来获取他的宽度文章来源地址https://www.toymoban.com/news/detail-482306.html

到了这里,关于【微信原生小程序】手写双向slider滑块的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++ Qt开发:Slider滑块条组件

    Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍 Slider 滑块条组件的常用方法及灵活运用。 当涉及到C++ Qt开发中的 Slider 滑块条

    2024年02月04日
    浏览(40)
  • 16.鸿蒙HarmonyOS App(JAVA)滑块组件Slider与评级组件Rating

      16.鸿蒙HarmonyOS App(JAVA)滑块组件Slider与评级组件Rating  ability_main.xml     MainAbilitySlice.java  

    2024年01月19日
    浏览(38)
  • 微信小程序手写签名

    wxml js wxss 开启横屏 json

    2024年02月08日
    浏览(41)
  • 微信小程序手写签字版

    在这里插入图片描述 请在下面的白框中签名 重置 提交 # js Page({ data: { signPath: [], cardNo: \\\'\\\', preX: \\\'\\\', preY: \\\'\\\', }, onLoad(options) { this.setData({ cardNo: options.cardNo }) wx.createSelectorQuery().select(\\\'#myCanvas\\\').fields({ node: true, size: true }).exec(this.init.bind(this)) }, init(data) { console.log(data); const width = dat

    2024年02月12日
    浏览(35)
  • 微信小程序实现双向绑定

    简易双向绑定 在 WXML 中,普通的属性的绑定是单向的。例如: 如果需要在用户输入的同时改变 this.data.value ,需要借助简易双向绑定机制。此时,可以在对应项目之前加入 model: 前缀: 用于双向绑定的表达式有如下限制: 只能是一个单一字段的绑定,如: 目前,尚不能 data

    2024年02月06日
    浏览(39)
  • 微信小程序-----input数据双向绑定

    这里介绍两种获取的方式: 1、用户每输入一个字节就获取一个字节 2、用户全部输入结束了之后,再一起获取整个input输入框的值 注意:第二种方式会比较节省内存资源 第一种方式:         原理:我们使用bindinput事件来获取input的输入值,然后根据dataset获取要跟 data数组里

    2024年02月08日
    浏览(41)
  • 基于Taro + React 实现微信小程序半圆滑块组件、半圆进度条、弧形进度条、半圆滑行轨道(附源码)

    1、四个档位 2、可点击加减切换档位 3、可以点击区域切换档位 4、可以滑动切换档位 给大家提供一些实现思路,找了一圈,一些文章基本不能直接用,错漏百出,代码还藏着掖着,希望可以帮到大家 ts的写法风格 index.tsx      index.module.less 防抖的工具函数debounce 的详细代码

    2024年02月06日
    浏览(53)
  • 微信小程序实现双向滑动快捷选择价格(价格区间)

    实现样子 提示:效果可以自己自定义,自己将文字样式更改为自己项目属性即可 实现达到方法 1、左边为最低价,右边为最高价格,可以拖动左边最低价选择价格。拖动右边为最高价。 2、当两个价格重合时,继续拖动,向左边,左边最低价会跟着变低,直到为边端,反之右

    2024年02月12日
    浏览(42)
  • 微信小程序form页面数据双向绑定data路径

    在开发过程中数据经常以对象方式组织,对页面修改数据进行保存时使用this.data.obj无法获取修改后数据。 1.只能是一个单一字段的绑定 2.目前,尚不能 data 路径,如 这通常不满足我们日常开发需要 通过在input框中设置 name 属性, 然后在函数中使用 e.detail.value 获取form数据 网上

    2024年02月13日
    浏览(45)
  • 微信小程序动态生成表单来啦!你再也不需要手写表单了!

    由于我们在小程序上涉及到数据采集业务,需要经常使用表单,微信小程序的表单使用起来非常麻烦,数据和表单是分离的,每个输入框都需要做数据处理才能实现响应式数据,所以我开发了 dc-vant-form ,针对原生微信小程序+ vant 组件构建的自定义表单,开发者可以通过表单

    2024年01月17日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包