이동 단 JS 드래그 두 가지 방법 분석

4778 단어 이동 단JS끌다
이동 단 항목 은 항상 제스처 라 이브 러 리 를 도입 하여 끌 어 당 긴 다.
그러나 한두 페이지 만 끌 어 다 놓 으 면 제스처 라 이브 러 리 를 하나 더 도입 하 는 것 은 수지 가 맞지 않 는 다.
최근 프로젝트 에 이런 수요 가 있 습 니 다.

이 한 곳 만 끌 어야 하기 때문에 나 는 제3자 고 를 도입 하지 않 았 다.
이동 단의 드래그 는 두 가지 주류 의 실현 방안 이 있다.
1.요 소 를 고정 위치 로 설정 한 다음 끌 때 포 지 셔 닝 을 수정 하여 끌 어 당 기 는 효 과 를 실현 합 니 다.
2.transform 의 평이 translate 속성 을 사용 하여 드래그 합 니 다.
프로젝트 1:고정 포 지 셔 닝 fixed
이 방안 의 핵심 은 요소 에 고정 포 지 셔 닝 position:fixed 를 추가 하 는 것 입 니 다.
그러나 포 지 셔 닝 후 요 소 는 문서 흐름 에서 벗 어 나 원래 의 레이아웃 에 영향 을 줄 수 있 습 니 다.
따라서 드래그(touch start 이벤트 트리거)를 시작 할 때 원래 요소 A 를 복사 해 야 합 니 다(cloneNode().
새로운 요소 A2 에 포 지 셔 닝 을 추가 하고 원래 요소 A 에 visibility:hidden 을 설정 합 니 다.숨 기 고 자리 잡기
1.1 마스크 만 들 기
먼저 마스크 를 만 드 는 방법 을 밀봉 하여 복사 한 요 소 를 설치 하고 오 작 동 을 방지 합 니 다.

createModal (id) {
 let modal = document.getElementById(id)
 if (!modal) { //             
  modal = document.createElement('div')
  modal.id = id
  modal.style.cssText = `position: fixed; left: 0; top: 0; right: 0; bottom: 0; z-index: 999;`
  document.body.appendChild(modal)
 }
},
1,2 드래그 시작
touch start 이 벤트 를 실행 할 때 먼저 마스크 를 만 듭 니 다.
또한 getBoundingClient Rect()방법 을 통 해 요소 A 의 좌 표를 얻 고 출발점 정 보 를 기록 합 니 다.
시작 정 보 를 기록 하기 위해 서 는 data 에서 대상 source 를 만 들 고 클릭 한 위치 client 와 초기 위치 좌표 start 를 기록 해 야 합 니 다.

handleTouchstart (e) { //     
 //      
 this.createModal(this.modalID) // modalID     id,     
 let element = e.targetTouches[0]
 let target = e.target.cloneNode(true) //       
 target.id = this.copyID // copyID      id,     
 //          client,        
 this.source.client = {
  x: element.clientX,
  y: element.clientY
 }
 //            
 let disX = this.source.start.left = element.target.getBoundingClientRect().left
 let disY = this.source.start.top = element.target.getBoundingClientRect().top
 target.style.cssText = `position: fixed; left: ${disX}px; top: ${disY}px;`
 //            
 document.getElementById(this.modalID).appendChild(target)
},
1.3 드래그 처리
드래그 할 때 터치 모 브 사건 을 감청 합 니 다.
[현재 마우스 포인트 위치]에서[초기 클릭 위치]를 빼 고 이동 하 는 거 리 를 얻 습 니 다.
초기 좌표 정 보 를 결합 하여 드래그 요소 의 좌 표를 업데이트 합 니 다.

handleTouchmove (e) { //    
 let element = e.targetTouches[0]
 let target = document.getElementById(this.copyID)
 //          client       
 let left = this.source.start.left + element.clientX - this.source.client.x
 let top = this.source.start.top + element.clientY - this.source.client.y
 //       
 target.style.left = `${left}px`
 target.style.top = `${top}px`
},
1.4 드래그 끝
드래그 끝 날 때 종점 위 치 를 기록 하고 마스크 를 삭제 합 니 다.

handleTouchend (e) { //     
 let end = {
  x: e.changedTouches[0].clientX,
  y: e.changedTouches[0].clientY
 }
 //      
 let modal = document.getElementById(this.modalID)
 document.body.removeChild(modal)
 //     
 this.doingSth(end)
},
그러나 위의 코드 는 끌 어 당 기 는 기능 만 실 현 했 을 뿐 목표 요소 A 를 표시/숨 기 는 동작 은 하지 않 았 습 니 다.
업무 장면 에 따라 자체 적 으로 추가 하거나 방안 2 를 참고 할 수 있다.
프로젝트 2:애니메이션 번역
이 방안 은 더 간단 합 니 다.추가 DOM 요 소 를 만 들 필요 가 없습니다.
원본 요소 에 transform 속성 만 추가 하고 transition 속성 도 필요 없습니다.
그리고 드래그 하 는 과정 에서 transform:translate(X,Y)에서 x,y 의 좌표 정 보 를 실시 간 으로 업데이트 하여 드래그 를 실현 합 니 다.
2.1 끌 기 시작
끌 기 시작 할 때,기점 좌표 만 기록 해 야 한다

handleTouchstart (e) { //     
 let element = e.targetTouches[0]//      client   ,        
 this.source.client = {
  x: element.clientX,
  y: element.clientY
 }
},
끌 어 당 기 는 과정 에서 오 작 동 하지 않도록 프로젝트 1 의 createModal()방법 으로 마스크 를 만 드 는 것 을 권장 합 니 다.
2.2 처리 드래그
현재 좌표 와 기점 좌표 에 따라 거 리 를 계산 한 다음 translate 의 좌 표를 업데이트 합 니 다.

handleTouchmove (e) { //    
 let element = e.targetTouches[0]
 //      client         
 let x = element.clientX - this.source.client.x
 let y = element.clientY - this.source.client.y
 //       
 element.target.style.cssText = `transform: translate(${x}px, ${y}px);`
},
2,3 드래그 끝
드래그 완료 후 이동 애니메이션 제거

handleTouchend (e) { //     
 //       
 e.target.style.cssText = `transform: none;`
},
소결:
프로젝트 1 은 대상 요소 의 좌표 정 보 를 가 져 올 때 getBoundingClient Rect()방법 을 사용 합 니 다.
그러나 이 방법 은 성능 이 높 지 않 으 니 적 게 써 야 한다.
그리고 이 방법 을 즉시 사 용 했 습 니 다.마지막 에 얻 은 left 와 top 도 정확 하지 않 습 니 다.touch start 를 할 때 요소 가 뚜렷하게 반 짝 입 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기