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 表单输入框不支持focus及blur事件的解决方案
Nov 17 Vue.js
vue实现表格合并功能
Dec 01 Vue.js
Vue实现点击当前行变色
Dec 14 Vue.js
Vue——解决报错 Computed property &quot;****&quot; was assigned to but it has no setter.
Dec 19 Vue.js
vue使用过滤器格式化日期
Jan 20 Vue.js
vite2.0+vue3移动端项目实战详解
Mar 03 Vue.js
vue中data改变后让视图同步更新的方法
Mar 29 Vue.js
如何理解Vue前后端数据交互与显示
May 10 Vue.js
Vue通过懒加载提升页面响应速度
May 10 Vue.js
Axios代理配置及封装响应拦截处理方式
Apr 07 Vue.js
vue代码分块和懒加载非必要资源文件
Apr 11 Vue.js
分享一个vue实现的记事本功能案例
Apr 11 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
NO3第三帝国留言簿制作过程
2006/10/09 PHP
需要发散思维学习PHP
2009/06/29 PHP
PHP实现下载功能的代码
2012/09/29 PHP
表单提交错误后返回内容消失问题的解决方法(PHP网站)
2015/10/20 PHP
php 无限分类 树形数据格式化代码
2016/10/11 PHP
用JavaScript将从数据库中读取出来的日期型格式化为想要的类型。
2009/08/15 Javascript
用js实现层随着内容大小动态渐变改变 推荐
2009/12/19 Javascript
!DOCTYPE声明对JavaScript的影响分析
2010/04/12 Javascript
JS localStorage实现本地缓存的方法
2013/06/22 Javascript
JQuery写动态树示例代码
2013/07/31 Javascript
js window.open弹出新的网页窗口
2014/01/16 Javascript
jQuery制作效果超棒的手风琴折叠菜单
2015/04/03 Javascript
JavaScript实现的encode64加密算法实例分析
2015/04/15 Javascript
javascript中动态函数用法实例分析
2015/05/14 Javascript
JavaScript生成图形验证码
2020/08/24 Javascript
jquery 回调操作实例分析【回调成功与回调失败的情况】
2019/09/27 jQuery
微信小程序使用echarts获取数据并生成折线图
2019/10/16 Javascript
[01:10:48]完美世界DOTA2联赛PWL S2 GXR vs PXG 第一场 11.18
2020/11/18 DOTA
Python机器学习之决策树算法实例详解
2017/12/06 Python
自学python的建议和周期预算
2019/01/30 Python
Python实现爬取马云的微博功能示例
2019/02/16 Python
python和php学习哪个更有发展
2020/06/17 Python
关于python tushare Tkinter构建的简单股票可视化查询系统(Beta v0.13)
2020/10/19 Python
css3中background新增的4个新的相关属性用法介绍
2013/09/26 HTML / CSS
关于canvas.toDataURL 在iOS运行失败的问题解决
2020/09/16 HTML / CSS
澳大利亚在线百货商店:Real Smart
2017/08/13 全球购物
捷克体育用品购物网站:D-sport
2017/12/28 全球购物
文科生自我鉴定
2014/02/15 职场文书
车间主任岗位职责
2014/03/16 职场文书
幼儿园家长评语大全
2014/04/16 职场文书
2014年出纳工作总结与计划
2014/12/09 职场文书
综合素质评价思想道德自我评价
2015/03/09 职场文书
运动会广播稿50字
2015/08/19 职场文书
2016年度创先争优活动总结
2016/04/05 职场文书
话题作文之关于呼唤
2019/11/29 职场文书
Hive常用日期格式转换语法
2022/06/25 数据库