更新记录

2.0.0(2026-09-23) 下载此版本

2.0.0(2026-09-23)

修复

  • 小程序端 computed 返回对象样式不生效,改为字符串样式
  • 多实例同一毫秒挂载导致 canvas id 重复而空白,改为自增唯一 id,并支持 canvasId 手动指定
  • 微信小程序 canvas 层级最高、遮挡弹窗、滑动卡顿,改用 Canvas 2D 同层渲染
  • App 端 canvas 触摸事件缺少 clientX 导致值为 NaN
  • App 端 .prevent 修饰符在 canvas 事件上报错
  • App 端旧版 canvas 不支持 top 基线导致刻度文字与刻度重叠
  • 纵向拖动被页面滚动抢占、touchcancel 被误判为点击
  • 小数 step 浮点误差
  • 停顿后松手仍产生惯性
  • 容器不可见时初始化无限重试

新增

  • direction 纵向模式,reverse 反转方向,scalePosition 刻度生长位置
  • Vue2 / Vue3 v-model 全兼容,realtime 滑动中实时同步
  • clickable 点击跳转,vibrate 震动反馈
  • mediumStep 中刻度,labelStep 文字间隔
  • activeScaleColor / activeTextColor 已选区间高亮
  • formatter / valueFormatter 格式化函数
  • inertia / bounce / friction / snapDuration / maxVelocity 物理参数
  • showIndicator / showLabel / showMask / maskWidth / labelOffset / fontFamily / minorLineWidth / majorLineWidth
  • value 作用域插槽,scrollStart / ready 事件,getValue() 方法
  • H5 鼠标拖拽,窗口 resize 自动刷新
  • decimalPlaces 默认按 step 自动推断

性能

  • App / H5 改用 renderjs:触摸、惯性、绘制全部在渲染层执行,无跨层通信
  • 核心算法抽离为 lf-slide-rule-core.js,各端共用
  • 缓冲画布 + CSS 位移,滑动过程不重绘;已选高亮独立画布 + CSS 裁切,同样零重绘
  • 惯性按真实时间衰减,速度加权平滑,高刷新率屏幕手感一致
  • 震动仅在手指拖动阶段触发并限频

破坏性变更

  • 目录迁移至 uni_modules/lf-slide-rule,easycom 自动引入
  • App-nvue 不再声明支持
  • 详见 UPGRADE.md

1.0.0

  • 首次发布

1.0.0(2025-12-23) 下载此版本


平台兼容性

uni-app(5.26)

Vue2 Vue3 Chrome Safari app-vue app-nvue Android iOS 鸿蒙
- × - -
微信小程序 支付宝小程序 抖音小程序 百度小程序 快手小程序 京东小程序 鸿蒙元服务 QQ小程序 飞书小程序 小红书小程序 快应用-华为 快应用-联盟
- - - - - - - - - - -

lf-slide-rule 滑动刻度尺

高性能可滑动刻度尺组件,适用于身高、体重、温度、时长、金额等数值选择场景。

特性

  • 高性能:App / H5 在渲染层(renderjs)完成触摸、物理与绘制;缓冲画布一次绘制 3 倍视口,滑动只做 CSS 位移
  • 微信小程序同层渲染:Canvas 2D,无层级遮挡与卡顿问题
  • 横向 / 纵向:一个属性切换方向,刻度生长位置可选
  • 完整手感:惯性、回弹、吸附、点击跳转、震动反馈,均可独立开关
  • 多级刻度:小 / 中 / 大刻度,已选区间可高亮
  • 高度可定制:刻度与当前值格式化函数、指示器插槽、当前值作用域插槽
  • Vue2 / Vue3 v-model 全兼容,H5 支持鼠标拖拽

兼容性

Vue2 Vue3 App-vue App-nvue H5 微信小程序 其他小程序
未测试

微信小程序要求基础库 ≥ 2.9.0。

安装

插件市场(推荐):在插件页点击「使用 HBuilderX 导入插件」,导入后直接使用,无需注册。

手动:将 uni_modules/lf-slide-rule 复制到项目根目录 uni_modules 下。

快速开始

<template>
  <lf-slide-rule v-model="height" :min="100" :max="220" unit="cm" />
</template>

<script>
export default {
  data() {
    return { height: 170 };
  },
};
</script>

Vue2 与 Vue3 均使用 v-model。Vue3 中 v-model:value 也可用。

Props

值与范围

属性 类型 默认值 说明
v-model / modelValue / value Number - 当前值
min Number 0 最小值
max Number 100 最大值
step Number 1 步进值,支持小数
majorStep Number 10 大刻度间隔(step 的倍数)
mediumStep Number 0 中刻度间隔(step 的倍数),0 不启用
labelStep Number 0 文字间隔(step 的倍数),0 跟随 majorStep
decimalPlaces Number -1 小数位数,-1 按 step 自动推断

布局

属性 类型 默认值 说明
direction String horizontal horizontal / vertical,纵向默认自下而上增大
reverse Boolean false 反转数值方向
height Number 140 组件高度(px)
scalePosition String auto 刻度生长位置 bottom / top / left / right,auto 为横向 bottom、纵向 right
canvasId String '' canvas id,留空时自动生成实例唯一 id,一般无需设置

刻度

属性 类型 默认值 说明
scaleWidth Number 8 刻度间距(px)
minorScaleHeight Number 18 小刻度长度(px)
mediumScaleHeight Number 26 中刻度长度(px)
majorScaleHeight Number 34 大刻度长度(px)
minorLineWidth Number 1 小 / 中刻度线宽
majorLineWidth Number 2 大刻度线宽
scaleColor String #E0E0E0 小刻度颜色
mediumScaleColor String '' 中刻度颜色,空时同 majorScaleColor
majorScaleColor String #9E9E9E 大刻度颜色
activeScaleColor String '' 已选区间刻度颜色,空不启用
activeTextColor String '' 已选区间文字颜色
textColor String #666666 刻度文字颜色
textFontSize Number 11 刻度文字大小(px)
fontFamily String sans-serif 刻度文字字体(App / H5 / 微信小程序生效)
showLabel Boolean true 显示刻度文字
labelOffset Number 4 文字与刻度间距(px)
formatter Function null 刻度文字格式化 (value) => string
backgroundColor String #FFFFFF 背景色
showMask Boolean true 显示两端渐变遮罩
maskWidth Number 40 遮罩宽度(px)

当前值

属性 类型 默认值 说明
showValue Boolean true 显示当前值
valueColor String #333333 当前值颜色
valueFontSize Number 42 当前值字号(px)
unit String '' 单位
unitColor String #999999 单位颜色
valueFormatter Function null 当前值格式化 (value) => string

指示器

属性 类型 默认值 说明
showIndicator Boolean true 显示指示器
indicatorStyle String circle circle / triangle / diamond / line
indicatorColor String #FF5722 颜色
indicatorSize Number 20 大小(px)
indicatorLineWidth Number 3 线条宽度(px)
indicatorGlow Boolean true 发光效果

交互

属性 类型 默认值 说明
disabled Boolean false 禁用
realtime Boolean true 滑动过程中实时同步 v-model。关闭后仅在停止时同步一次
clickable Boolean true 点击刻度尺跳转到对应值
vibrate Boolean false 手指拖动跨越刻度时震动(App / 小程序),惯性滑行阶段不触发
inertia Boolean true 惯性滑动。关闭后松手立即吸附到最近刻度,不再有滑行过程
bounce Boolean true 边界回弹
friction Number 0.94 惯性摩擦系数 0.8 ~ 0.99,越大滑得越远
snapDuration Number 180 吸附动画时长(ms)
maxVelocity Number 3 最大滑动速度(px/ms)

Events

事件 触发时机 参数
change 滑动停止且值与上次不同 value
scroll 滑动中每跨越一个 step(realtime 开启时 v-model 同步更新) value
scrollStart 开始触摸 value
scrollEnd 滑动或吸附结束 value
ready 初始化完成 value

Slots

插槽 说明 作用域
indicator 替换默认指示器 -
value 替换当前值区域 { value, display }

Methods

通过 ref 调用。

方法 说明
setValue(value, animated = true) 设置值,scrollToValue 为同名别名
getValue() 获取当前值
refresh() 重新测量并重绘,容器尺寸变化或 v-show 显示后调用

示例

小数步进 + 已选高亮 + 自定义当前值

<lf-slide-rule
  v-model="weight"
  :min="30" :max="150" :step="0.5" :mediumStep="2"
  activeScaleColor="#26A69A" activeTextColor="#26A69A"
  indicatorColor="#26A69A" indicatorStyle="triangle"
>
  <template #value="{ value, display }">
    <text class="big">{{ display }}</text>
    <text class="small">kg / {{ (value * 2).toFixed(1) }} 斤</text>
  </template>
</lf-slide-rule>

纵向

<lf-slide-rule
  v-model="volume"
  direction="vertical" scalePosition="left"
  :height="260" :min="0" :max="100" :mediumStep="5"
  :showValue="false"
  activeScaleColor="#2196F3" indicatorColor="#2196F3"
/>

大范围 + 格式化 + 震动

<lf-slide-rule
  v-model="money"
  :min="0" :max="100000" :step="100" :majorStep="10" :mediumStep="5"
  :scaleWidth="6" :friction="0.96" vibrate
  :formatter="v => (v >= 10000 ? v / 10000 + 'w' : v / 1000 + 'k')"
  :valueFormatter="v => '¥ ' + v"
/>

深色主题

<lf-slide-rule
  v-model="temperature"
  :min="-20" :max="50" unit="°C" scalePosition="top"
  indicatorStyle="diamond" indicatorColor="#FF9800"
  scaleColor="#555" majorScaleColor="#FF9800"
  textColor="#AAA" valueColor="#FF9800" backgroundColor="#1E1E1E"
/>

自定义指示器

<lf-slide-rule v-model="value">
  <template #indicator>
    <image src="/static/arrow.png" style="width: 24px; height: 24px" />
  </template>
</lf-slide-rule>

常见问题

组件在 tab / 弹层 / v-show 中不显示或尺寸错误 初始化时容器不可见会导致宽度为 0。组件会自动重试,若仍异常请在显示后调用 refresh()

非微信小程序平台指示器被 canvas 遮挡 这些平台仍是原生 canvas,层级最高。可关闭 showIndicator 或改用同层渲染的平台。

同页多个刻度尺是否需要不同 canvasId 不需要,组件会为每个实例自动生成唯一 id。

小数出现 0.30000000004 已按 step 自动推断小数位并做精度修正,无需处理。

开启 vibrate 后 Android 上略有顿挫 震动是系统调用,有固定开销。组件已限频并只在手指拖动时触发,追求极致流畅可关闭。

更多

隐私、权限声明

1. 本插件需要申请的系统权限列表:

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件不采集任何数据

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

许可协议

MIT协议