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自定义插件封装,实现简易的elementUi的Message和MessageBox的示例
Nov 20 Vue.js
vue单元格多列合并的实现
Nov 26 Vue.js
Vue router传递参数并解决刷新页面参数丢失问题
Dec 02 Vue.js
vue实现图书管理系统
Dec 29 Vue.js
vue+element UI实现树形表格
Dec 29 Vue.js
vue中父子组件的参数传递和应用示例
Jan 04 Vue.js
Vue 实现可视化拖拽页面编辑器
Feb 01 Vue.js
Vue和Flask通信的实现
May 19 Vue.js
Vue中foreach数组与js中遍历数组的写法说明
Jun 05 Vue.js
vite+vue3.0+ts+element-plus快速搭建项目的实现
Jun 24 Vue.js
vue2的 router在使用过程中遇到的一些问题
Apr 13 Vue.js
vue elementUI批量上传文件
Apr 26 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 5.3.0 安装分析心得
2009/08/07 PHP
使用php判断浏览器的类型和语言的函数代码
2013/02/28 PHP
求帮忙修改个php curl模拟post请求内容后并下载文件的解决思路
2015/09/20 PHP
PHP加密3DES报错 Call to undefined function: mcrypt_module_open() 如何解决
2016/04/17 PHP
PHP实现mysqli批量执行多条语句的方法示例
2017/07/22 PHP
使用laravel和ajax实现整个页面无刷新的操作方法
2019/10/03 PHP
Laravel 将数据表的数据导出,并生成seeds种子文件的方法
2019/10/09 PHP
论坛特效代码收集(落伍转发-不错)
2006/12/02 Javascript
CSS+Jquery实现页面圆角框方法大全
2009/12/24 Javascript
SeaJS 与 RequireJS 的差异对比
2014/12/08 Javascript
JS正则表达式比较常见用法
2016/01/26 Javascript
Bootstrap每天必学之标签页(Tab)插件
2020/08/09 Javascript
功能强大的Bootstrap效果展示(二)
2016/08/03 Javascript
bootstrap提示标签、提示框实现代码
2016/12/28 Javascript
node安装--linux下的快速安装教程
2017/03/21 Javascript
node.js 模块和其下载资源的镜像设置的方法
2018/09/06 Javascript
Vue 封装防刷新考试倒计时组件的实现
2020/06/05 Javascript
解决qrcode.js生成二维码时必须定义一个空div的问题
2020/07/09 Javascript
vue实现PC端分辨率适配操作
2020/08/03 Javascript
[15:35]教你分分钟做大人:天怒法师
2014/10/30 DOTA
Python程序中的观察者模式结构编写示例
2016/05/27 Python
Python的Django框架中使用SQLAlchemy操作数据库的教程
2016/06/02 Python
浅谈Python中函数的参数传递
2016/06/21 Python
Python简单检测文本类型的2种方法【基于文件头及cchardet库】
2016/09/18 Python
详解Python进程间通信之命名管道
2017/08/28 Python
Python装饰器语法糖
2019/01/02 Python
Jupyter Notebook的连接密码 token查询方式
2020/04/21 Python
Python打印特殊符号及对应编码解析
2020/05/07 Python
Python scrapy爬取小说代码案例详解
2020/07/09 Python
HTML5之SVG 2D入门3—文本与图像及渲染文本介绍
2013/01/30 HTML / CSS
暑期实习鉴定
2013/12/16 职场文书
中式面点餐厅创业计划书
2014/01/29 职场文书
品质口号大全
2014/06/17 职场文书
2014年教师党员自我评价范文
2014/09/22 职场文书
干部作风建设个人剖析材料
2014/10/11 职场文书
Consul在linux环境的集群部署
2022/04/08 Servers