css=====================================
movable-view { display: flex; align-items: center; justify-content: center; height: 100rpx; width: 1rpx; background: transparent; color: #fff; position: relative;}movable-view view { position: absolute; top: -40rpx; background: #799AF4; z-index: 10; /* height: 100%; */ width: 150rpx; text-align: center;}movable-area { height: 30rpx; width: 500rpx; margin: 50rpx; background: linear-gradient(to right,#FFC025 33%, #56DBBD 33%, #56DBBD 66%,#FB8D82 66%,#FB8D82); /* overflow: hidden; */}input { margin: 0 auto; border: 1rpx solid #000; width: 150rpx; height: 50rpx; text-align: center;}.max { width: 600rpx; height: 600rpx;}.page-section{ width: 100%; margin-bottom: 60rpx;}.page-section:last-child{ margin-bottom: 0;}.page-section-title{ font-size: 28rpx; color: #999999; margin-bottom: 10rpx; padding-left: 30rpx; padding-right: 30rpx;}
html========================================
<view class="container"><view class="page-body"> <view class="page-section"> <view class="page-section-title first">movable-view区域小于movable-area</view> <input type="text" value="{{val}}" bindblur="onBlur"></input> <movable-area id="area"> <movable-view id="areaView" x="{{x}}" y="{{y}}" direction="horizontal" bindchange="onChange"><view>莫挨老子</view></movable-view> </movable-area> </view> <view bindtap="onAdd">加1</view> <view bindtap="onSub">减1</view></view></view>
js===================================
Page({ onShareAppMessage() { return { title: 'movable-view', path: 'page/component/pages/movable-view/movable-view' } }, onLoad() { this.initDomX(); }, data: { x: 0, // x轴 y: 0, // y轴 val:60, // 输入框值 min: 60, // 最小值 max: 150, // 最大值 areaVal: 90, // max - min domX:0, // 砝码的总长 }, initDomX() { let _this = this; const query = wx.createSelectorQuery(); query.select('#area').boundingClientRect(); query.select('#areaView').boundingClientRect(); query.exec((res) => { _this.setData({ domX: res[0].width - res[1].width }) }) }, onChange(e) { let _this = this; this.setData({ // 取整 // val: Math.round(_this.data.min + (_this.data.areaVal * ((Math.round(e.detail.x / _this.data.domX * 10000) / 100)/100))) // 保留两位小数 val: (_this.data.min + (_this.data.areaVal * ((e.detail.x / _this.data.domX * 10000) / 100) / 100)).toFixed(1) }) }, onBlur(e) { let _this = this; let val = e.detail.value - 0; this.setData({ x: (_this.data.domX * ((val - _this.data.min) / _this.data.areaVal)), // val: val.toFixed(2) }) console.log((_this.data.domX * ((val - _this.data.min) / _this.data.areaVal))); // this.setData({ // 取整 // val: Math.round(e.detail.value), // x: Math.round(_this.data.domX * ((val - _this.data.min) / _this.data.areaVal)) // 保留两位小数 // val: val.toFixed(2), // x: _this.data.domX * ((val - _this.data.min) / _this.data.areaVal) // }) }, onAdd(e) { let _this = this; let val = (_this.data.val-0) + 1; console.log(val); this.setData({ // val: val, x: (_this.data.domX * ((val - _this.data.min) / _this.data.areaVal)), }) }, onSub(e) { let _this = this; let val = (_this.data.val-0) - 1; this.setData({ // val: val, x: (_this.data.domX * ((val - _this.data.min) / _this.data.areaVal)), }) console.log(this.data.x); }})
成果:莫挨老子是拖动的节点,款式轻易写的