ImagePreview.ts 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. export type ImagePreviewOption = {
  2. maxZoom: number
  3. minZoom: number
  4. fullScreen: boolean
  5. }
  6. class ImagePreview {
  7. private currentX: number = 0
  8. private currentY: number = 0
  9. private xOffset: number = 0
  10. private yOffset: number = 0
  11. private initialX: number = 0
  12. private initialY: number = 0
  13. private maxZoom: number = 6
  14. private minZoom: number = 0.5
  15. private initZoom: number = 1
  16. private initRotate: number = 0
  17. private isMove: boolean = false
  18. private el: HTMLElement
  19. constructor(option?: ImagePreviewOption) {
  20. this.maxZoom = option?.['maxZoom'] ?? 6
  21. this.minZoom = option?.['minZoom'] ?? 0.5
  22. }
  23. bindMouseEvent(el: HTMLElement) {
  24. this.el = el
  25. this.el.addEventListener('mousedown', (event: any) => {
  26. this.downHandler(event)
  27. })
  28. this.el.addEventListener('mousemove', (event: any) => {
  29. this.moveHandler(event)
  30. })
  31. this.el.addEventListener('mouseup', (event: any) => {
  32. this.upHandler(event)
  33. })
  34. this.el.addEventListener('mouseleave', (event: any) => {
  35. this.upHandler(event)
  36. })
  37. }
  38. downHandler(event: any) {
  39. event.preventDefault()
  40. if (event.button === 0) {
  41. this.isMove = true
  42. this.initialX = event.clientX - this.xOffset
  43. this.initialY = event.clientY - this.yOffset
  44. this.el.style.cursor = 'move'
  45. }
  46. }
  47. moveHandler(event: any) {
  48. event.preventDefault()
  49. if (this.isMove) {
  50. this.currentX = event.clientX - this.initialX
  51. this.currentY = event.clientY - this.initialY
  52. this.xOffset = this.currentX
  53. this.yOffset = this.currentY
  54. this.setTranslate()
  55. }
  56. }
  57. upHandler(event) {
  58. if (event.button === 0) {
  59. this.isMove = false
  60. this.el.style.cursor = 'pointer'
  61. }
  62. }
  63. zoomHandler(num: number) {
  64. if (num === 1 && this.initZoom >= this.maxZoom) return
  65. if (num === -1 && this.initZoom <= this.minZoom) return
  66. this.initZoom = this.initZoom + num * 0.5
  67. this.setTranslate()
  68. }
  69. rotateHandler = (num: number) => {
  70. if (num !== 0) {
  71. this.initRotate += num * 90
  72. this.setTranslate()
  73. } else {
  74. //重置
  75. this.initRotate = 0
  76. this.currentX =
  77. this.currentY =
  78. this.xOffset =
  79. this.yOffset =
  80. this.initialX =
  81. this.initialY =
  82. 0
  83. this.initZoom = 1
  84. this.el.style.transform = 'none'
  85. }
  86. }
  87. setTranslate() {
  88. this.el.style.transform = `translate3d(${this.currentX}px, ${this.currentY}px, 0) scale(${this.initZoom}) rotate(${this.initRotate}deg)`
  89. }
  90. }
  91. export default ImagePreview