Vue第六篇:电商网站图片放大镜功能

news2024/11/27 23:51:37

本文参考:https://blog.csdn.net/liushi21/article/details/127497487

效果如下:

 

功能实现分解如下:

(1)商品图区域:主要是浏览图片,根据图片的url显示图片。当鼠标离开此区域时"放大镜区域"不需要显示。

(2)鼠标放大区块。主要处理两个事情:

1)mouseenter:鼠标进入时,放大镜区域根据url显示图片

2)mousemove:鼠标移动时,鼠标的遮罩块区域跟着移动,同时放大镜区域的图片跟着切换(显示遮罩块的放大效果)

(3)商品图总览:鼠标over时,切换商品图区域的url图片。

 放大效果的实现方式:

主要是通过CSS的translate方法实现的。

放大镜区域其实放着一个大图,当鼠标在商品图区域移动时,放大镜区域的大图相向移动。

代码:

1、css代码:

#page{
    position: relative;
    height: 700px;
    width: 1246px;
    left: 19.3%;
    top: 111px;
    background-color: aqua;
}

/* 商品图 */
#goodsPics{
    width: 452px;
    height: 626px;
    background-color: blue;
    position: relative;
    top: 10px;
}

/*当前所查看的图片,也即所需要局部放大查看的图片*/
.imgNow{
    position: relative;
    top: 15px;
    left: 37px;
}

.imgNow li{
    display: block;
    float: left;
    height: 54px;
    width: 54px;
    margin-left: 15px;
    border: 2px solid transparent;
}

.imgNow li:hover, #sign{
    border: 2px solid red;
}

/* 图片放大后的div区块 */
#seeDetail{
    position: absolute;
    background-color: aliceblue;
    width: 600px;
    height: 600px;
    top: 0%;
    left: 101%;
    overflow: hidden;
    border: 2px solid #f90;
    background-position: 0 0;
    background-repeat: no-repeat;
}

/* 图片放大后的div区块下的img区块 */
#seeDetail img{
    position: absolute;
    top: 0;
    left: 0;
    background-repeat: no-repeat;
    width: 1800px;
    height: 1800px;
}

/* 鼠标查看区域 */
.move{
    position: absolute;
    left: 0;
    top: 0;
    width: 150px;
    height: 150px;
    cursor: move;
    background: rgba(142, 223, 255, 0.407);
}

/* 覆盖在放大图的原图表面上的一个遮罩层 */
.topMask{
    width: 452px;
    height: 452px;
    position: absolute;
    top: 0;
    left: 0;
    z-index: 5;
}

2、home.vue代码:

<script>
  export default{
    data(){
      return{
        url: require('@/assets/images/01.jpg'),
        Bigurl: require('@/assets/images/01.jpg'),
        urlIndex: -1, //urlIndex用于图片列表中
        isShow: 0,
        cursorMask: {transform: ''},
        imgMove: {transform: ''},
        goodsImgs: [
          {
            id:0,
            src: require('@/assets/images/01.jpg')
          },{
            id:1,
            src: require('@/assets/images/02.jpg')
          },{
            id:2,
            src: require('@/assets/images/03.jpg')
          }
        ]
      }
    },

    methods: {
      seeThis(index){
        this.url = this.goodsImgs[index].src;
        this.urlIndex = index;
      },
      move(e){
        var x = e.offsetX - 75;
        var y = e.offsetY - 75;

        // 防止鼠标预览区域移动到原图区域左边以外
        if(x < 0){
          x = 0;
        }else if(x > 300){
          // 防止预览区域移动到右边以外
          x = 300;
        }

        if(y < 0){
          y = 0;
        }else if(y > 300){
          y = 300;
        }

        this.cursorMask.transform = `translate(${x}px, ${y}px)`;
        this.imgMove.transform = `translate(-${4*x}px, -${4*y}px)`;
      },
      seeBegin(){
        this.Bigurl = this.url;
        this.isShow = 1;
      },
      seeEnd(){
        this.Bigurl = "";
        this.left = 0;
        this.top = 0;
        this.isShow = 0;
      }
    }
  }
</script>

<template>
  <div id="goodsPics">
    <!-- 当前查看商品图区域 -->
    <div id="imgPre" style="position: relative;" @mouseleave="seeEnd">
      <div ref="imgPre">
        <img :src="url" alt="picNow">
      </div>

      <div class="topMask" @mouseenter="seeBegin($event)" @mousemove="move($event)">
        <!-- 鼠标放大镜模块 -->
        <div ref="move" v-show="isShow" class="move" :style="cursorMask">
        </div>
      </div>

      <!-- 商品图总览,就是一排的小图 -->
      <ul class="imgNow">
        <li v-for="(item, index) in goodsImgs" :key="item.id" @mouseover="seeThis(index)" :id="urlIndex == index ? sign : ''">
          <img style="width: 54px; height: 54px;" :src="item.src" alt="pics">
        </li>
      </ul>

      <!-- 放大镜区域,查看商品图放大后的效果 -->
      <div v-if="isShow" id="seeDetail" ref="bigImg">
        <img :src="Bigurl" alt="" :style="imgMove">
      </div>
    </div>
  </div>
</template>

<style scoped>

</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/780064.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HTTP中GET请求和POST请求的区别

前言 HTTP&#xff08;超文本传输协议&#xff09;是用于在 Web 浏览器和 Web 服务器之间传输数据的协议。在 HTTP 中&#xff0c;GET 和 POST 是两种常见的请求方法。一般我们在浏览器输入一个网址访问网站都是 GET 请求&#xff1b;在 FORM 表单中&#xff0c;可以通过设置 …

Mac端简单好用的程序创建工具:VMware InstallBuilder Enterprise

VMware InstallBuilder Enterprise for Mac是一款用于为台式机和服务器软件构建跨平台安装程序的开发工具。使用InstallBuilder&#xff0c;您可以从单个项目文件和构建环境中为Linux&#xff0c;Windows&#xff0c;Mac OS X&#xff0c;Solaris和其他平台快速创建动态&#x…

Windows下mosquitto服务端和MQTT.fx客户端搭建模拟环境

第一部分 Mosquitto安装测试 一、概念梳理 1、Mosquitto是一款实现了消息推送协议MQTT 3.1的开源消息代理软件&#xff0c;提供轻量级的、支持可订阅/可发布的消息推送模式&#xff0c;是设备与设备之间的短消息通信变得简单&#xff0c;广泛应用于低功耗传感器、手机&#xff…

django跨域设置

1.安装 (venv) ***\data_analyse_web>pip install django-cors-headers 2.添加应用 :在settings.py中添加应用,放到任意位置都行 INSTALLED_APPS {# ...corsheaders,# ... } 3. 设置中间层&#xff0c;在settings.py中添加中间层&#xff0c;放到最前面 MIDDLEWARE [c…

【设计模式】23种设计模式——原型模式Prototype(原理讲解+应用场景介绍+案例介绍+Java代码实现)

原型模式 介绍 原型模式指用通过拷贝原型实例创建新的实例&#xff0c;新实例和原型实例的属性完全一致原型模式是一种创建型设计模式工作原理是通过调用原型实例的 clone()方法来完成克隆&#xff0c;原型实例需要实现Cloneable接口&#xff0c;并重写clone()方法需要为每个…

WSR-88D天气雷达工作模式、监测目标、反射率含义讲解

一、WSR-88D 简介 WSR-88D是天气监视多普勒雷达之一。自 1988 年首次建造和测试以来,它已在包括阿拉斯加和夏威夷在内的美国 160 多个地点安装和使用。WSR-88D也已安装在波多黎各和太平洋的几个岛屿。 WSR-88D雷达发射功率为750000瓦(平均灯泡只有75瓦)!这种功率使雷达产…

03. 自定义镜像 Dockerfile

目录 1、前言 2、构建镜像的方式 2.1、docker commit 2.1.1、先查看下当前的容器 2.1.2、生成该容器镜像 2.1.3、查看镜像列表 2.2、Dockerfile 2.2.1、创建Dockerfile文件 2.2.2、编写Dockerfile文件 2.2.3、构建镜像 2.2.4、使用该镜像生成容器 3、Dockerfile 3…

Docker 网络、资源控制

Docker 网络、资源控制 一、Docker 网络1、Docker 网络实现原理2、Docker 的网络模式&#xff1a;1&#xff0e;host模式2&#xff0e;container模式3&#xff0e;none模式4&#xff0e;bridge模式5&#xff0e;自定义网络 二、资源控制1&#xff0e;CPU 资源控制&#xff08;1…

用echarts绘制流程图

getEchart1() {echarts.init(document.getElementById(echart1)).dispose();var chartDom document.getElementById(echart1);this.myChart echarts.init(chartDom);var charts {nodes: [ // 节点{name: 开始, value: [0, 500],label: {borderWidth: 1, // 边框宽度borderRa…

【CMU15-445 FALL 2022】Project #1 - Buffer Pool

About 实验官网 Project #1 - Buffer Pool在线评测网站 gradescope Lab Task #1 - Extendible Hash Table 详见——【CMU15-445 FALL 2022】Project #1 - Extendable Hashing 如果链接失效&#xff0c;请查看当前平台我之前发布的文章。 Task #2 - LRU-K Replacement Polic…

flink Mysql CDC(动态加表)、postgresqlCDC 和 CDC无锁算法

flinkCDC - 功能验证记录 flink 与cdc 版本使用搭配&#xff1a;flink cdc参数说明原理分析&#xff08;DBLog&#xff09;无锁算法论文 mysql cdccdc api 动态加表flink cdc sql 性能压测flink cdc api 性能压测 PostgreSqlCDC执行更新语句&#xff0c;会出现 2 种情况 cdc si…

【数据挖掘】bytewax 与 ydata工具可实时了解您的数据

一、说明 在这篇博文中&#xff0c;我们将介绍如何将开源流式处理解决方案 bytewax 与 ydata 分析相结合并加以利用&#xff0c;以提高流式处理流的质量。 STream 处理支持在传输中和存储之前对数据进行实时分析&#xff0c;并且可以是有状态的&#xff0c;也可以是无状态的。 …

[STL]vector使用介绍

[STL]vector使用介绍 注&#xff1a;文内代码均在Visual Studio 2013下进行测试&#xff0c;不同的编译器下在扩容大小等方面可能有所不同&#xff0c;但不影响各接口函数的使用。 文章目录 [STL]vector使用介绍1. vector介绍2. 构造函数3. 迭代器相关函数begin函数和end函数的…

实现点击复制到剪切板功能

该功能使用VueUse实现 什么是 VueUse VueUse不是Vue.use&#xff0c;它是为Vue 2和3服务的一套Vue Composition API的常用工具集&#xff0c;是目前世界上Star最高的同类型库之一。它的初衷就是将一切原本并不支持响应式的JS API变得支持响应式&#xff0c;省去程序员自己写相…

jmeter常用的提取器(正则表达式和JSON提取器)

jmeter常用的后置处理器有两种提取数据&#xff1a; 1、JSON提取器 获取后可以将变量token引用到其他所需要的地方 &#xff08;正则表达式和JSON提取器&#xff09;:2023接口自动化测试框架必会两大神器:正则提取器和Jsonpath提取器_哔哩哔哩_bilibilihttps://www.bilibili.…

uniapp实战

上面是tab栏&#xff0c;下面是swiper&#xff0c;&#xff0c;tab和swiper和 红色滑块 动态变化&#xff0c;&#xff0c; 遇到的问题&#xff1a; 往下滚动 tab栏 吸顶&#xff1a; position:sticky; z-index:99; top:0;swiper切换触发 change 事件&#xff0c; :current …

SOMEIP协议--第四节[ SOME/IP](someip概述与行为)

SOMEIP协议–第四节[ SOME/IP](someip概述与行为) 文章目录 SOMEIP协议--第四节[ SOME/IP](someip概述与行为)1、概述2、someip的行为2.1 基础传输2.2 SOME/IP-TP传输:2.3 someip参数(client)2.4 someip参数(server)1、概述 Method | Event | Field是上层设计的三个概念…

【C++】优先级队列和反向迭代器 模拟笔记

文章目录 优先级队列仿函数适配器模式堆知识储备 反向迭代器代码&#xff08;反向迭代器&#xff09;代码&#xff08;优先级队列&#xff09; 优先级队列 仿函数 仿函数&#xff0c;它不是函数&#xff08;其实是个类&#xff09;&#xff0c;但用法和函数一样。既然是个类&a…

子类化QThread来实现多线程,moveToThread函数的作用

子类化QThread来实现多线程&#xff0c; QThread只有run函数是在新线程里的&#xff0c;其他所有函数都在QThread生成的线程里。正确启动线程的方法是调用QThread::start()来启动。 一、步骤 子类化 QThread&#xff1b;重写run&#xff0c;将耗时的事件放到此函数执行&#…

轻量级Web报表工具ActiveReportsJS全新发布v4.0,支持集成更多前端框架!

ActiveReportsJS 是一款基于 JavaScript 和 HTML5 的轻量级Web报表工具&#xff0c;采用拖拽式设计模式&#xff0c;不需任何服务器和组件支持&#xff0c;即可在 Mac、Linux 和 Windows 操作系统中&#xff0c;设计多种类型的报表。ActiveReportsJS 同时提供跨平台报表设计、纯…