| ¶Ô±ÈÐÂÎļþ | 
|  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * ä½¿ç¨æ®éçjsæ¹æ¡å®ç°slider | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | export default { | 
|---|
|  |  |  | watch: { | 
|---|
|  |  |  | value(n) { | 
|---|
|  |  |  | // åªæå¨éæ»å¨ç¶ææ¶ï¼æå¯ä»¥éè¿valueæ´æ°æ»åå¼ï¼è¿éçå¬ï¼æ¯ä¸ºäºè®©ç¨æ·è§¦å | 
|---|
|  |  |  | if (this.status === 'end') { | 
|---|
|  |  |  | this.updateSliderPlacement(n, true) | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | mounted() { | 
|---|
|  |  |  | this.init() | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | methods: { | 
|---|
|  |  |  | init() { | 
|---|
|  |  |  | this.getSliderRect() | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | // è·åslider尺寸 | 
|---|
|  |  |  | getSliderRect() { | 
|---|
|  |  |  | // è·åæ»åæ¡çå°ºå¯¸ä¿¡æ¯ | 
|---|
|  |  |  | setTimeout(() => { | 
|---|
|  |  |  | this.$uGetRect('.u-slider').then((rect) => { | 
|---|
|  |  |  | this.sliderRect = rect | 
|---|
|  |  |  | this.updateSliderPlacement(this.value, true) | 
|---|
|  |  |  | }) | 
|---|
|  |  |  | }, 10) | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | // æ¯å¦å¯ä»¥æä½ | 
|---|
|  |  |  | canNotDo() { | 
|---|
|  |  |  | return this.disabled | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | // è·åå½åæå¿ç¹çXè½´ä½ç§»å¼ | 
|---|
|  |  |  | getTouchX(e) { | 
|---|
|  |  |  | return e.touches[0].clientX | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | formatStep(value) { | 
|---|
|  |  |  | // ç§»å¨ç¹å æ»é¿åº¦çç¾åæ¯ | 
|---|
|  |  |  | return Math.round(Math.max(this.min, Math.min(value, this.max)) / this.step) * this.step | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | // ååºäºä»¶ | 
|---|
|  |  |  | emitEvent(event, value) { | 
|---|
|  |  |  | this.$emit(event, value || this.value) | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | // æ è®°å½åæå¿çç¶æ | 
|---|
|  |  |  | setTouchStatus(status) { | 
|---|
|  |  |  | this.status = status | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | onTouchStart(e) { | 
|---|
|  |  |  | if (this.canNotDo()) { | 
|---|
|  |  |  | return | 
|---|
|  |  |  | } | 
|---|
|  |  |  | // æ ç¤ºå½åçç¶æä¸ºå¼å§è§¦æ¸æ»å¨ | 
|---|
|  |  |  | this.emitEvent('start') | 
|---|
|  |  |  | this.setTouchStatus('start') | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | onTouchMove(e) { | 
|---|
|  |  |  | if (this.canNotDo()) { | 
|---|
|  |  |  | return | 
|---|
|  |  |  | } | 
|---|
|  |  |  | // æ»åç左边ä¸ä¸å®è·å±å¹å·¦è¾¹æ¥å£¤ï¼æä»¥éè¦å廿å¤å±ç¶å
ç´ çå·¦è¾¹å¼ | 
|---|
|  |  |  | const x = this.getTouchX(e) | 
|---|
|  |  |  | const { left, width } = this.sliderRect | 
|---|
|  |  |  | const distanceX = x - left | 
|---|
|  |  |  | // è·å¾ç§»å¨è·ç¦»å¯¹æ´ä¸ªæ»åçç¾åæ¯å¼ï¼æ¤ä¸ºå¸¦æå¤ä½å°æ°çå¼ï¼ä¸è½ç¨æ¤æ´æ°è§å¾ | 
|---|
|  |  |  | // å¦åé æéä¿¡é»å¡ï¼éè¦æ¯æ¹åä¸ä¸ªstep弿¶ä¿®æ¹ä¸æ¬¡è§å¾ | 
|---|
|  |  |  | const percent = (distanceX / width) * 100 | 
|---|
|  |  |  | this.setTouchStatus('moving') | 
|---|
|  |  |  | this.updateSliderPlacement(percent, true, 'moving') | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | onTouchEnd() { | 
|---|
|  |  |  | if (this.canNotDo()) { | 
|---|
|  |  |  | return | 
|---|
|  |  |  | } | 
|---|
|  |  |  | this.emitEvent('end') | 
|---|
|  |  |  | this.setTouchStatus('end') | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | // è®¾ç½®æ»ç¹çä½ç½® | 
|---|
|  |  |  | updateSliderPlacement(value, drag, event) { | 
|---|
|  |  |  | // å»æå°æ°é¨åï¼åæ¶ä¹æ¯å¯¹stepæ¥è¿çå¤ç | 
|---|
|  |  |  | const { width } = this.sliderRect | 
|---|
|  |  |  | const percent = this.formatStep(value) | 
|---|
|  |  |  | // è®¾ç½®ç§»å¨çå¼ | 
|---|
|  |  |  | const barStyle = { | 
|---|
|  |  |  | width: `${percent / 100 * width}px` | 
|---|
|  |  |  | } | 
|---|
|  |  |  | // ç§»å¨æé´æ éè¿æ¸¡å¨ç» | 
|---|
|  |  |  | if (drag === true) { | 
|---|
|  |  |  | barStyle.transition = 'none' | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | // éç§»å¨æé´ï¼å æå¯¹è¿æ¸¡ä¸ºç©ºç声æï¼è®©cssä¸ç声æèµ·æ | 
|---|
|  |  |  | delete barStyle.transition | 
|---|
|  |  |  | } | 
|---|
|  |  |  | // ä¿®æ¹valueå¼ | 
|---|
|  |  |  | this.$emit('input', percent) | 
|---|
|  |  |  | // äºä»¶çåç§° | 
|---|
|  |  |  | if (event) { | 
|---|
|  |  |  | this.emitEvent(event, percent) | 
|---|
|  |  |  | } | 
|---|
|  |  |  | this.barStyle = barStyle | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | onClick(e) { | 
|---|
|  |  |  | if (this.canNotDo()) { | 
|---|
|  |  |  | return | 
|---|
|  |  |  | } | 
|---|
|  |  |  | // ç´æ¥ç¹å»æ»åçæ
åµï¼è®¡ç®æ¹å¼ä¸onTouchMoveæ¹æ³ç¸å | 
|---|
|  |  |  | const { left, width } = this.sliderRect | 
|---|
|  |  |  | const value = ((e.detail.x - left) / width) * 100 | 
|---|
|  |  |  | this.updateSliderPlacement(value, false, 'click') | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|