| ¶Ô±ÈÐÂÎļþ |
| | |
| | | /** |
| | | * ä½¿ç¨æ®éç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') |
| | | } |
| | | } |
| | | } |