vue3 自定义图片放大器效果的示例代码


Posted in Vue.js onJuly 23, 2022

效果

vue3 自定义图片放大器效果的示例代码

具体代码实现

创建商品图片展示的vue页面:ProductPicShow.vue

<script lang="ts" setup>
import { ref, computed } from 'vue'
import { useMouseInElement } from '@vueuse/core'

defineProps<{
  images: string[]
}>()
// 当前显示的图片索引
let active = ref(0)
// ref 获取 DOM 元素的位置
const target = ref(null)
// isisOutside为 true 的时候代表鼠标未进入目标元素,为 false 时代表鼠标进入目标元素
const { elementX, elementY, isOutside } = useMouseInElement(target)
// 遮罩半透明图在商品大图中的坐标位置
const position = computed(() => {
  let x = elementX.value - 100
  let y = elementY.value - 100
  if (x <= 0) x = 0
  if (x >= 200) x = 200
  if (y <= 0) y = 0
  if (y >= 200) y = 200
  return { x, y }
})
</script>
<template>
  <div class="product-image">
    <!-- 放大镜的大盒子 -->
    <div
        class="large"
        :style="[
        {
          backgroundImage: `url(${images[active]})`,
          backgroundPosition: `-${position.x * 3}px -${position.y * 3}px`
        }
      ]"
        v-show="!isOutside"
    ></div>
    <div ref="target" class="middle">
      <img :src="images[active]" alt="" />
      <!-- 鼠标移动时的遮罩层 -->
      <div
          class="layer"
          v-show="!isOutside"
          :style="{ left: `${position.x}px`, top: `${position.y}px` }"
      ></div>
    </div>
    <ul class="small">
      <li
          v-for="(item, index) in images"
          :key="item"
          :class="{ active: index === active }"
          @mouseenter="active = index"
      >
        <img :src="item" alt="" />
      </li>
    </ul>
  </div>
</template>

<style scoped lang="less">
.product-image {
  width: 480px;
  height: 400px;
  position: relative;
  display: flex;
  z-index: 500;
  .large {
    position: absolute;
    top: 0;
    left: 412px;
    width: 600px;
    height: 600px;
    box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
    background-repeat: no-repeat;
    background-size: 200% 200%;
    background-color: #f8f8f8;
  }
  .middle {
    width: 400px;
    height: 400px;
    background: #f5f5f5;
    position: relative;
    cursor: move;
    .layer {
      width: 200px;
      height: 200px;
      background: rgba(0, 0, 0, 0.2);
      left: 0;
      top: 0;
      position: absolute;
    }
  }
  .small {
    width: 80px;
    li {
      width: 68px;
      height: 68px;
      margin-left: 12px;
      margin-bottom: 15px;
      cursor: pointer;
      &:hover,
      &.active {
        border: 2px solid #27BA9B;
      }
    }
  }
}
</style>

使用:Product.vue

<template>
  <div class="product-info">
    <div class="media">
      <ProductPicShow :images="slidePics"/>
    </div>
  </div>
</template>
<script setup lang="ts">
import ProductPicShow from "@/views/product/components/ProductPicShow.vue"
</script>
<style scoped lang="less">
.product-info {
  min-height: 600px;
  background: #fff;
  display: flex;

  .media {
    width: 580px;
    height: 600px;
    padding: 30px 50px;
  }
}
</style>

到此这篇关于vue3 自定义图片放大器的文章就介绍到这了,更多相关vue3 图片放大器内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Vue.js 相关文章推荐
Vue项目利用axios请求接口下载excel
Nov 17 Vue.js
vue打开其他项目页面并传入数据详解
Nov 25 Vue.js
vue表单验证之禁止input输入框输入空格
Dec 03 Vue.js
vue使用element-ui实现表单验证
Dec 13 Vue.js
vue使用require.context实现动态注册路由
Dec 25 Vue.js
vue使用vue-quill-editor富文本编辑器且将图片上传到服务器的功能
Jan 13 Vue.js
Vue实现多页签组件
Jan 14 Vue.js
vue form表单post请求结合Servlet实现文件上传功能
Jan 22 Vue.js
vue引入Excel表格插件的方法
Apr 28 Vue.js
vue点击弹窗自动触发点击事件的解决办法(模拟场景)
May 25 Vue.js
Vue3.0中Ref与Reactive的区别示例详析
Jul 07 Vue.js
vue使用refs获取嵌套组件中的值过程
Mar 31 Vue.js
vue递归实现树形组件
Jul 15 #Vue.js
VUE递归树形实现多级列表
Jul 15 #Vue.js
Vue2项目中对百度地图的封装使用详解
vue如何在data中引入图片的正确路径
Jun 05 #Vue.js
Vue Mint UI mt-swipe的使用方式
Jun 05 #Vue.js
vue @ ~ 相对路径 路径别名设置方式
Jun 05 #Vue.js
vue css 相对路径导入问题级踩坑记录
Jun 05 #Vue.js
You might like
PHP函数utf8转gb2312编码
2006/12/21 PHP
PHP 简易输出CSV表格文件的方法详解
2013/06/20 PHP
PHP+AjaxForm异步带进度条上传文件实例代码
2017/08/14 PHP
在IE6下发生Internet Explorer cannot open the Internet site错误
2010/06/21 Javascript
JavaScript 验证码的实例代码(附效果图)
2013/03/22 Javascript
javascript获取网页中指定节点的父节点、子节点的方法小结
2013/04/24 Javascript
比较新旧两个数组值得增加和删除的JS代码
2013/10/30 Javascript
Javascript字符串对象的常用方法简明版
2014/06/26 Javascript
JavaScript实现鼠标滑过图片变换效果的方法
2015/04/16 Javascript
JS实现的不规则TAB选项卡效果代码
2015/09/18 Javascript
jQuery遍历DOM元素与节点方法详解
2016/04/14 Javascript
微信小程序 图片宽度自适应的实现
2017/04/06 Javascript
jQuery读取本地的json文件(实例讲解)
2017/10/31 jQuery
Vue的移动端多图上传插件vue-easy-uploader的示例代码
2017/11/27 Javascript
Node.js使用Koa搭建 基础项目
2018/01/08 Javascript
iview table高度动态设置方法
2018/03/14 Javascript
详解Vue webapp项目通过HBulider打包原生APP
2018/06/29 Javascript
玩转Koa之koa-router原理解析
2018/12/29 Javascript
js设置默认时间跨度过程详解
2019/07/17 Javascript
nodejs+express最简易的连接数据库的方法
2020/12/23 NodeJs
python实现可以断点续传和并发的ftp程序
2016/09/13 Python
Python编程实现使用线性回归预测数据
2017/12/07 Python
Python Numpy:找到list中的np.nan值方法
2018/10/30 Python
python 利用文件锁单例执行脚本的方法
2019/02/19 Python
pyqt5数据库使用详细教程(打包解决方案)
2020/03/25 Python
django执行数据库查询之后实现返回的结果集转json
2020/03/31 Python
python模块如何查看
2020/06/16 Python
matplotlib 画双轴子图无法显示x轴的解决方法
2020/07/27 Python
Python远程方法调用实现过程解析
2020/07/28 Python
美国巧克力喷泉品牌:Sephra
2019/05/05 全球购物
德国滑雪和户外用品网上商店:XSPO
2019/10/30 全球购物
Myprotein亚太地区:欧洲第一在线运动营养品牌
2020/12/20 全球购物
治超工作实施方案
2014/05/04 职场文书
开展党的群众路线教育实践活动个人对照检查材料
2014/11/05 职场文书
退休教师欢送会致辞
2015/07/31 职场文书
酒桌上的祝酒词
2015/08/12 职场文书