吉媒互动平台前端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

166 lines
4.5 KiB

<template>
<view
class="grace-slider"
:style="{
height:blockSize+'px', width:realWidth+'px'
}"
@touchmove.stop.prevent="touchmove">
<view
class="grace-slider-bar"
:style="{
backgroundColor:bgColor,
width:realWidth+'px',
height:height+'px',
top:lineTop+'px'
}"></view>
<view
class="grace-slider-active-bar"
:style="{
backgroundColor:activeColor,
width:activeWidth+'px',
height:height+'px',
marginLeft:activeLeft+'px',
top:lineTop+'px'
}"></view>
<view
class="grace-slider-block"
:style="{
backgroundColor:blockBgColor,
height:blockSize+'px',
width:blockSize+'px',
'margin-left':xMin+'px'
}"
@touchstart.stop="touchstart"
data-tag="min"></view>
<view
class="grace-slider-block"
:style="{
backgroundColor:blockBgColor,
height:blockSize+'px',
width:blockSize+'px',
'margin-left':xMax+'px'
}"
@touchstart.stop="touchstart"
data-tag="max"></view>
</view>
</template>
<script>
const _windowWidth = uni.getSystemInfoSync().windowWidth;
export default {
name : "gui-interval-slider",
data() {
return {
realWidth : 200,
realMax : 200,
xMin : 0,
left1 : 0,
xMax : 100,
currentBlock : '',
minValue : 0,
maxValue : 100,
activeWidth : 0,
activeLeft : 0,
lineTop : 0
};
},
props: {
bgColor : {type : String, default : "#F6F7F8"},
activeColor : {type : String, default : "#3688FF"},
width : {type : Number, default : 750},
height : {type : Number, default : 2},
blockBgColor : {type : String, default : "#FFFFFF"},
blockSize : {type : Number, default : 32},
min : {type : Number, default : 0},
minDefault : {type : Number, default : 0},
max : {type : Number, default : 100},
maxDefault : {type : Number, default : 100}
},
created:function(){
this.realWidth = this.upx2px(this.width);
this.left1 = (_windowWidth - this.realWidth) / 2;
this.realMax = this.realWidth - this.blockSize;
this.lineTop = (this.blockSize - this.height) / 2;
this.setSlider();
},
watch:{
minDefault : function(){
this.setSlider();
},
maxDefault : function(){
this.setSlider();
}
},
methods: {
setSlider : function(){
this.xMin = (this.minDefault - this.min) / (this.max - this.min) * this.realMax;
this.xMax = (this.maxDefault - this.min) / (this.max - this.min) * this.realMax;
this.minValue = this.minDefault;
this.maxValue = this.maxDefault;
this.activeLeft = this.xMin + 5;
this.activeWidth = this.xMax - this.xMin;
},
touchstart: function(e) {
this.currentBlock = e.target.dataset.tag;
if(this.currentBlock == 'min'){
var pageX = e.pageX || e.changedTouches[0].pageX;
pageX = pageX - this.left1;
this.xMin = pageX;
}else{
var pageX = e.pageX || e.changedTouches[0].pageX;
pageX = pageX - this.left1;
this.xMax = pageX;
}
},
touchmove: function(e) {
this.calculate(e);
},
px2upx: function(px) {
return (750 / _windowWidth ) * px;
},
upx2px : function(upx){
return (_windowWidth / 750) * upx;
},
calculate: function(e) {
var pageX = e.pageX || e.changedTouches[0].pageX;
pageX = pageX - this.left1;
if(this.currentBlock == 'min'){
var xMin = this.xMin + (pageX - this.xMin);
// 最左侧限制
if(xMin < 0){xMin = 0;}
// 最右侧限制
if(xMin >= this.realMax){xMin = this.realMax;}
this.xMin = xMin;
// 计算值
var value = this.xMin / this.realMax * (this.max - this.min);
value = parseInt(value);
value = value + this.min;
this.minValue = value;
}else{
var xMax = this.xMax + (pageX - this.xMax);
// 最左侧限制
if(xMax < 0){xMax = 0;}
// 最右侧限制
if(xMax >= this.realMax){xMax = this.realMax;}
this.xMax = xMax;
// 计算值
var value = this.xMax / this.realMax * (this.max - this.min);
value = parseInt(value);
value = value + this.min;
this.maxValue = value;
}
// 获得2个值并传递出去
if(this.maxValue >= this.minValue){
this.$emit('change', [this.minValue, this.maxValue]);
}else{
this.$emit('change', [this.maxValue, this.minValue]);
}
}
}
};
</script>
<style scoped>
.grace-slider{position:relative;}
.grace-slider-bar{position:absolute; top:0rpx;}
.grace-slider-block{position:absolute; top:0rpx; left:0; border-radius:500px; border-width:1px; border-style:solid; border-color:#F5F6F8;}
.grace-slider-active-bar{position:absolute; top:25rpx;}
</style>