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中使用mockjs代码实例
Nov 25 Vue.js
基于vue项目设置resolves.alias: '@'路径并适配webstorm
Dec 02 Vue.js
vue使用echarts画组织结构图
Feb 06 Vue.js
vue如何使用rem适配
Feb 06 Vue.js
vue响应式原理与双向数据的深入解析
Jun 04 Vue.js
Vue鼠标滚轮滚动切换路由效果的实现方法
Aug 04 Vue.js
Vue h函数的使用详解
Feb 18 Vue.js
深入讲解Vue中父子组件通信与事件触发
Mar 22 Vue.js
vue cli4中mockjs在dev环境和build环境的配置详情
Apr 06 Vue.js
vue中的可拖拽宽度div的实现示例
Apr 08 Vue.js
关于vue-router-link选择样式设置
Apr 30 Vue.js
vue使用watch监听属性变化
Apr 30 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中路径问题的解决方案
2006/10/09 PHP
php 编写安全的代码时容易犯的错误小结
2010/05/20 PHP
destoon之一键登录设置
2014/06/21 PHP
PHP 只允许指定IP访问(允许*号通配符过滤IP)
2014/07/08 PHP
以实例全面讲解PHP中多进程编程的相关函数的使用
2015/08/18 PHP
浅谈PHP中的数据传输CURL
2016/09/06 PHP
laravel自定义分页效果
2017/07/23 PHP
PHP的静态方法与普通方法用法实例分析
2019/09/26 PHP
event.srcElement 用法笔记e.target
2009/12/18 Javascript
关于用Jquery的height()、width()计算动态插入的IMG标签的宽高的问题
2010/12/08 Javascript
去掉gridPanel表头全选框的小例子
2013/07/18 Javascript
node.js中的querystring.unescape方法使用说明
2014/12/10 Javascript
Node.js连接postgreSQL并进行数据操作
2016/12/18 Javascript
简单实现JS上传图片预览功能
2017/04/14 Javascript
jquery中有哪些api jQuery主要API
2017/11/20 jQuery
vue-cli3.0如何使用CDN区分开发、生产、预发布环境
2018/11/22 Javascript
JavaScript基础之静态方法和实例方法分析
2018/12/26 Javascript
微信小程序缓存过期时间的使用详情
2019/05/12 Javascript
原生js实现贪食蛇小游戏的思路详解
2019/11/26 Javascript
Python基础之函数用法实例详解
2014/09/10 Python
Python2.x和3.x下maketrans与translate函数使用上的不同
2015/04/13 Python
举例讲解Linux系统下Python调用系统Shell的方法
2015/11/07 Python
python3实现ftp服务功能(服务端 For Linux)
2017/03/24 Python
Python3实现爬取简书首页文章标题和文章链接的方法【测试可用】
2018/12/11 Python
[机器视觉]使用python自动识别验证码详解
2019/05/16 Python
使用Filter过滤python中的日志输出的实现方法
2019/07/17 Python
基于python实现操作git过程代码解析
2020/07/27 Python
罗马尼亚购物网站:Vivantis.ro
2019/07/20 全球购物
前台接待岗位职责
2013/12/03 职场文书
预备党员党课思想汇报
2014/01/13 职场文书
户籍证明的格式
2014/01/13 职场文书
赔偿协议书范本
2014/04/15 职场文书
环保倡议书怎么写
2014/05/16 职场文书
汽车服务工程专业自荐信
2014/09/02 职场文书
国家税务局领导班子对照检查材料思想汇报
2014/10/04 职场文书
学校2015年纠风工作总结
2015/05/15 职场文书