반응형
마우스 정지 후만 Vue 마우스 이동
요소를 먼저 클릭한 경우에만 마우스 이동을 트리거하려면 어떻게 해야 합니까?오디오 플레이어 타임라인에 이걸 활용하려고 합니다.
.player__time--bar(@mousedown="setNewCurrentPosition($event)")
.slider(role="slider" aria-valuemin="0" :aria-valuenow="currentPosition" :aria-valuemax="trackTotalDuration" aria-orientation="horizontal")
.player__time--bar-current-position(:style="{width: (100 / (trackTotalDuration / currentPosition)) + '%'}")
방법:
setNewCurrentPosition(e) {
let tag = e.target
// if the click is not on 'slider', grab div with class 'slider'
if (e.target.className === 'player__time--bar') tag = e.target.firstElementChild
else if (e.target.className === 'player__time--bar-current-position') tag = e.target.parentElement
const pos = tag.getBoundingClientRect()
const seekPos = (e.clientX - pos.left) / pos.width
this.currentPosition = parseInt(this.trackTotalDuration * seekPos)
// updates the time in the html
this.$refs.player.currentTime = this.currentPosition
},
원하는 것은 다음과 같습니다.mousedown
요소에서 리스너(listener)를 선택합니다.이 시작되었음을 나타내는 변수를 설정합니다.청취자를 창문에 걸어 놓아라.mouseup
변수 설정을 해제합니다.
넣을 수 있습니다.mousemove
요소 내부에서 발생하는 드래그에만 관심이 있는 경우 요소에서 해당됩니다.그 이외의 경우는,mousemove
에 대한 청취자.window
어디서든 볼 수 있어요.
new Vue({
el: '#app',
data: {
dragging: false,
x: 'no',
y: 'no'
},
methods: {
startDrag() {
this.dragging = true;
this.x = this.y = 0;
},
stopDrag() {
this.dragging = false;
this.x = this.y = 'no';
},
doDrag(event) {
if (this.dragging) {
this.x = event.clientX;
this.y = event.clientY;
}
}
},
mounted() {
window.addEventListener('mouseup', this.stopDrag);
}
});
.dragstartzone {
background-color: red;
}
<script src="//cdnjs.cloudflare.com/ajax/libs/vue/2.4.2/vue.min.js"></script>
<div id="app">
<div class="dragstartzone" @mousedown="startDrag" @mousemove="doDrag">Start dragging here</div>
<div>X: {{x}}, Y: {{y}}</div>
</div>
결국 Roy J가 제공한 코드를 사용하여 필요에 맞게 리팩트를 했습니다.여기 있어요.
템플릿:
.player__time--bar(@mousedown="startDrag($event)" @mouseup="stopDrag($event)" @mousemove="doDrag($event)")
.slider(role="slider" aria-valuemin="0" :aria-valuenow="currentPosition" :aria-valuemax="trackTotalDuration" aria-orientation="horizontal")
.player__time--bar-current-position(:style="{width: (100 / (trackTotalDuration / currentPosition)) + '%'}")
데이터:
data: () => ({
currentPosition: 0,
trackTotalDuration: 0,
dragging: false
}),
방법:
startDrag() {
this.dragging = true
},
stopDrag(event) {
this.dragging = false
this.setNewCurrentPosition(event)
},
doDrag(event) {
if (this.dragging) this.setNewCurrentPosition(event)
},
setNewCurrentPosition(e) {
let tag = e.target
// if the click is not on 'slider', grab div with class 'slider'
if (e.target.className === 'player__time--bar') tag = e.target.firstElementChild
else if (e.target.className === 'player__time--bar-current-position') tag = e.target.parentElement
const pos = tag.getBoundingClientRect()
const seekPos = (e.clientX - pos.left) / pos.width
this.currentPosition = parseInt(this.trackTotalDuration * seekPos)
// updates the time in the html
this.$refs.player.currentTime = this.currentPosition
},
언급URL : https://stackoverflow.com/questions/48152321/vue-mousemove-only-after-mousedown
반응형
'programing' 카테고리의 다른 글
Array List를 되돌리는 가장 간단한 방법은 무엇입니까? (0) | 2022.08.16 |
---|---|
ie 11에서 실행되는 Nuxt.js 설정 방법 (0) | 2022.08.16 |
Java에서 문자열 값에서 열거 값을 가져오는 방법 (0) | 2022.08.16 |
웹 팩 및 Vuejs 툴바와 함께 전체 PDF.js 뷰어를 사용하는 방법 (0) | 2022.08.16 |
모바일에서의 여백/패딩 - Quasar Framework (VueJ) (0) | 2022.08.16 |