原生JS缩放控件

zoomUtil.js

export default class ZoomUtil {
    constructor(hottarget,target){
        this.hottarget = hottarget
        this.target = target
        this.scale = 1
        this.wheelfunc = (event)=>{
            this.onwheel(event)
        }
        this.hottarget.addEventListener('wheel', this.wheelfunc)
        this.zoomCentre = null
        this.targetWidth = this.target.offsetWidth
        this.targetHeight = this.target.offsetHeight
        this.zoomRatio = 0.05//缩放率
    }

    onwheel(event){
        event.preventDefault();
        event = event || window.event;
        if(Math.abs(event.deltaY) === 0){
            return
        }
        const zr = -Math.abs(event.deltaY)/event.deltaY*this.zoomRatio
        let sc = this.scale
        this.scale = this.scale+this.scale*zr;
        this.scale = Math.min(Math.max(.8, this.scale), 4)
        if(sc === this.scale)return
        let tw = this.target.offsetWidth
        let th = this.target.offsetHeight
        let centre = {x:this.target.offsetLeft+tw/2,y:this.target.offsetTop+th/2}
        let mx = event.clientX 
        let my = event.clientY
        const p  = this.target.parentNode 
        if(this.zoomCentre == 'mouse'){
            const x = mx - p.offsetLeft
            const y = my - p.offsetTop
            centre = {x,y}
        }else if(this.zoomCentre == 'parent'){
            const x = p.offsetWidth/2
            const y = p.offsetHeight/2
            centre = {x,y}
        }
        const sc2 = this.scale/sc

        const lx = centre.x+(this.target.offsetLeft-centre.x)*sc2
        const ly = centre.y+(this.target.offsetTop-centre.y)*sc2

        const lw = tw*sc2
        const lh = th*sc2

        this.target.style.left = lx+'px'
        this.target.style.top = ly+'px'

        this.target.style.width = lw+'px'
        this.target.style.height = lh+'px'
    }
}

使用:

const zoomUtil = new ZoomUtil(parentContainer,child)
 zoomUtil.zoomCentre = 'parent'
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值