vue实现在固定区域内鼠标轮滚放大缩小图片组件

<template>
    <div style="width: 100%;position: relative;overflow: hidden;text-align: center;border: 6px solid #f1f2f3;">
        <el-button size='mini' circle type="primary" @click="toBIgChange(0.25)" icon="el-icon-plus"
            style="position: absolute;top: 2px ;left: 2px;z-index: 999;"></el-button>
        <el-button size='mini' circle type="primary" @click="toSmallChange(0.25)" icon="el-icon-minus"
            style="position: absolute;top: 2px ;left: 30px;z-index: 999;"></el-button>
        <el-button size='mini' circle type="primary" @click="toRotateChange" icon="el-icon-refresh-right"
            style="position: absolute;top: 2px ;left: 64px;z-index: 999;"></el-button>
        <img id="img" :src="src" alt="" @mousedown.prevent="dropImage" @wheel.prevent="wheelFn"
            :style="{ transform: 'scale(' + multiples + ') rotate(' + deg + 'deg)' }">
    </div>
</template>
  
<script>
export default {
    props: ['src'],
    data() {
        return {
            multiples: 1,
            odiv: null,
            deg: 0
        }
    },
    mounted() {
        this.dropImage();


    },
    watch: {
        src(newValue, oldValue) {
            this.multiples = 1
            if (this.odiv !== null) {
                this.odiv.style.left = '0px';
                this.odiv.style.top = '0px';
            }
        },
    },
    methods: {
        wheelFn(e) {
            if (e.deltaY > 0) {
                // 鼠标向下滚动,图片缩小
                this.toSmallChange(0.1)
            } else {
                // 鼠标向上滚动,图片放大
                this.toBIgChange(0.1)
            }
            return false
        },
        toBIgChange(power) {
            if (this.multiples >= 2) {
                return;
            }
            this.multiples += power;
        },
        toRotateChange() {
            this.deg += 90
        },
        // 缩小
        toSmallChange(power) {
            if (this.multiples <= 0.75) {
                return;
            }
            this.multiples -= power;
        },
        // 拖拽
        dropImage(e) {
            console.log("拖拽", e);
            if (e === null) {
                return
            }

            this.odiv = e.target;  //获取目标元素  
            console.log('odiv',this.odiv)
            //算出鼠标相对元素的位置
            let disX = e.clientX - this.odiv.offsetLeft;
            let disY = e.clientY - this.odiv.offsetTop;

            document.onmousemove = (e) => {       //鼠标按下并移动的事件

                //用鼠标的位置减去鼠标相对元素的位置,得到元素的位置
                let left = e.clientX - disX;
                let top = e.clientY - disY;

                //绑定元素位置到positionX和positionY上面
                this.positionX = top;
                this.positionY = left;

                //移动当前元素
                this.odiv.style.left = left + 'px';
                this.odiv.style.top = top + 'px';

            };

            document.onmouseup = (e) => {
                document.onmousemove = null;
                document.onmouseup = null;
            };
        },

    }
}
</script>

<style scoped>
img {
    width: 100%;
    position: relative;
    cursor: move;
}
</style>

 

posted @ 2023-04-04 09:55  青幽草  阅读(496)  评论(0编辑  收藏  举报