<template>
<div class="page">
<div class="demo">
<img id="demoImg" :src="require('../../assets/newimages/code.png')" class="demo-img" />
</div>
</div>
</template>
<script>
import Hammer from 'hammerjs'
import {setTimeout} from 'timers'
export default {data () {
return {config: {},
id: null,
mc: null,
timer: false,
translateX: 0,
translateY: 0,
scale: 1,
firstTouch: true,
relateX: 0,
relateY: 0,
oldX: 0,
oldY: 0,
oldScale: 1
}
},
mounted () {this.$nextTick(() => {this.picInit()
})
},
methods: {picInit () {this.id = document.getElementById('demoImg')
this.mc = new Hammer(this.id)
this.relateX = (document.body.clientWidth - this.id.offsetWidth) / 2
this.relateY = (document.body.clientHeight - this.id.offsetHeight) / 2
this.mc.add(new Hammer.Pan({
direction: Hammer.DIRECTION_ALL,
threshold: 0,
pointers: 0
}))
this.mc.add(new Hammer.Pinch({threshold: 0})).recognizeWith(this.mc.get('pan'))
this.mc.on('hammer.input', this.isFinal)
this.mc.on('panstart panmove', this.onPan)
this.mc.on('pinchstart pinchmove', this.onPinch)
this.setPosition()},
isFinal (ev) {if (ev.isFinal) {
this.oldX = this.translateX
this.oldY = this.translateY
this.oldScale = this.scale
}
},
// 初始化图片地位及缩放
setPosition () {
this.selfPosition({
translateX: this.relateX,
translateY: this.relateY,
scale: this.scale
})
},
// 单点触发 - 利落
onPan (ev) {// console.log(this.firstTouch)
if (this.firstTouch) {
this.oldX = this.relateX
this.oldY = this.relateY
}
// console.log(this.oldX)
// console.log(this.oldY)
this.translateX = this.oldX + ev.deltaX
this.translateY = this.oldY + ev.deltaY
const position = {
translateX: this.translateX,
translateY: this.translateY,
scale: this.scale
}
this.selfPosition(position)
this.firstTouch = false
},
// 多点触发 - 缩放
onPinch (ev) {
this.scale = this.oldScale * ev.scale
this.selfPosition({
translateX: this.translateX,
translateY: this.translateY,
scale: this.scale
})
// this.selfPosition(this.position)
},
selfPosition (pos) {return this.picAnimate()(() => this.tempPos(pos))
},
tempPos (pos) {
let style = [`translate3d(${pos.translateX}px, ${pos.translateY}px, 0)`,
`scale(${pos.scale}, ${pos.scale})`
// `scale(${pos.scale > 1.2 ? 1.2 : pos.scale}, ${pos.scale > 1.2 ? 1.2 : pos.scale})`
]
style = style.join(' ')
this.id.style.transform = style
},
picAnimate () {return window[Hammer.prefixed(window, 'requestAnimationFrame')] || function (callback) {setTimeout(callback, 1000 / 60)
}
}
}
}
</script>
<style lang="less">
.page {
width: 375px;
height: 100vh;
background: url('../../assets/newimages/bg.png') center center no-repeat;
background-size: 100% 100%;
}
.demo {position: absolute;}
.demo-img {
width: 260px;
height: 260px;
display: block;
overflow: hidden;
}
</style>