vue2 实现简单的放大镜功能

<template>
    <div class="img_wrapper" ref="imgWrapper">
        <img
            class="original_img"
            src="@/assets/img/2.jpeg"
            alt="测试图片"
            @mousemove="handleMouseMove"
            @mouseleave="handleMouseLeave"
            @contextmenu.prevent.stop
            @load="initImage"
            ref="refImg"
        />
        <div
            v-if="isInside"
            :style="{
                backgroundSize: `${imgRealWidth * realGlassScale}px ${
                    imgRealHeight * realGlassScale
                }px`,
                ...glassStyle,
            }"
            class="cx-cropper-selection-glass"
        >
            <div class="cx-cropper-selection-glass__line is-horizontal"></div>
            <div class="cx-cropper-selection-glass__line is-vertical"></div>
            <div class="cx-cropper-selection-glass__mark"></div>
        </div>
    </div>
</template>
 
<script>
export default {
    data() {
        return {
            isInside: false,
            imgRealWidth: 0, // 图片实际宽度
            imgRealHeight: 0, // 图片实际高度
            realGlassScale: 2,
            glassStyle: {
                // 放大镜坐标
                backgroundPosition: "0 0",
                left: 0,
                top: 0,
            },
        };
    },

    methods: {
        initImage() {
            this.$nextTick(() => {
                this.imgRealWidth = this.$refs.refImg.clientWidth;
                this.imgRealHeight = this.$refs.refImg.clientHeight;
                console.log(this.imgRealWidth, this.imgRealHeight);
            });
        },
        handleMouseMove(e) {
            this.isInside = true;
            console.log(e);
            this.setGlassPosition(e.offsetX, e.offsetY);
        },
        handleMouseLeave() {
            this.isInside = false;
        },
        setGlassPosition(left, top) {
            // const { realGlassScale } = this;
            this.glassStyle.backgroundPosition = `-${
                left * this.realGlassScale - 175
            }px -${top * this.realGlassScale - 150}px`;
            this.glassStyle.left = left + 10 + "px";
            this.glassStyle.top = top + 10 + "px";
        },
    },
};
</script>
 
<style lang="scss" scoped>
.img_wrapper {
    margin: 0 auto;
    width: 200px;
    border: 1px solid red;
    position: relative;
    .original_img {
        width: 100%;
        cursor: crosshair;
    }

    .cx-cropper-selection-glass {
        width: 350px;
        height: 300px;
        position: absolute;
        border: 1px solid #000;
        z-index: 30;
        background: url("@/assets/img/2.jpeg");
        pointer-events: none;
        background-repeat: no-repeat;
        box-sizing: border-box;
        background-color: #fff;
        .cx-cropper-selection-glass__line {
            position: absolute;
            background: rgba(#447ed9, 0.5);

            &.is-vertical {
                width: 6px;
                height: 100%;
                top: 0;
                left: 50%;
                transform: translateX(-50%);
            }

            &.is-horizontal {
                width: 100%;
                height: 6px;
                top: 50%;
                left: 0;
                transform: translateY(-50%);
            }
        }

        .cx-cropper-selection-glass__mark {
            width: 5px;
            height: 5px;
            position: absolute;
            top: 50%;
            left: 50%;
            transform: translate(-50%, -50%);
            border: 1px solid #000;
            background: #fff;
        }
    }
}
</style>

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现Vue 2的放大镜功能,你可以按照以下步骤进行操作: 1. 首先,确保你已经在项目中引入了Vue 2。 2. 在需要使用放大镜功能的组件中,定义一个data属性用于存储放大镜的状态,例如: ```javascript data() { return { zoomed: false, // 放大镜状态,默认为false mouseX: 0, // 鼠标X轴坐标 mouseY: 0, // 鼠标Y轴坐标 zoomX: 0, // 放大镜X轴坐标 zoomY: 0, // 放大镜Y轴坐标 } }, ``` 3. 在模板中,使用`v-on`指令监听鼠标移动事件,并更新鼠标坐标: ```html <template> <div @mousemove="updateMousePosition"> <!-- 图片展示区域 --> <div class="image-container"> <img src="path/to/image.jpg" alt="Image"> </div> <!-- 放大镜区域 --> <div v-if="zoomed" class="zoom-container" :style="{ left: zoomX + 'px', top: zoomY + 'px' }"> <img src="path/to/image.jpg" alt="Zoomed Image"> </div> </div> </template> ``` 4. 在方法中,实现更新鼠标坐标和放大镜位置的逻辑: ```javascript methods: { updateMousePosition(event) { this.mouseX = event.clientX; this.mouseY = event.clientY; this.updateZoomPosition(); }, updateZoomPosition() { const container = document.querySelector('.image-container'); const zoomContainer = document.querySelector('.zoom-container'); if (container && zoomContainer) { const containerRect = container.getBoundingClientRect(); const zoomContainerRect = zoomContainer.getBoundingClientRect(); // 根据鼠标坐标和图片容器位置计算放大镜位置 this.zoomX = this.mouseX - containerRect.left - zoomContainerRect.width / 2; this.zoomY = this.mouseY - containerRect.top - zoomContainerRect.height / 2; // 限制放大镜位置在图片容器内部 this.zoomX = Math.max(0, Math.min(this.zoomX, containerRect.width - zoomContainerRect.width)); this.zoomY = Math.max(0, Math.min(this.zoomY, containerRect.height - zoomContainerRect.height)); } } } ``` 5. 最后,添加一些CSS样式来定义图片容器和放大镜的样式: ```css .image-container { position: relative; } .zoom-container { position: absolute; width: 200px; /* 自定义放大镜的宽度 */ height: 200px; /* 自定义放大镜的高度 */ border: 1px solid #ccc; pointer-events: none; /* 防止放大镜影响鼠标事件 */ } ``` 这样,你就可以在Vue 2中实现一个简单放大镜功能了。当鼠标在图片上移动时,会显示一个放大的镜头,跟随鼠标移动并显示放大的图像。根据需要,你可以自定义放大镜的样式和放大倍数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值