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中音频wavesurfer.js的使用方法
Feb 20 Vue.js
详解vue 组件注册
Nov 20 Vue.js
详解Vue3 Teleport 的实践及原理
Dec 02 Vue.js
Vue与React的区别和优势对比
Dec 18 Vue.js
手动实现vue2.0的双向数据绑定原理详解
Feb 06 Vue.js
Vue+Bootstrap实现简易学生管理系统
Feb 09 Vue.js
Vue包大小优化的实现(从1.72M到94K)
Feb 18 Vue.js
原生JS封装vue Tab切换效果
Apr 28 Vue.js
Vue Element UI自定义描述列表组件
May 18 Vue.js
Vue3.0中Ref与Reactive的区别示例详析
Jul 07 Vue.js
Vue的过滤器你真了解吗
Feb 24 Vue.js
vue route新窗口跳转页面并且携带与接收参数
Apr 10 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设计模式之命令模式的应用详解
2013/05/21 PHP
php中error与exception的区别及应用
2014/07/28 PHP
盘点PHP和ASP.NET的10大对比!
2015/12/24 PHP
thinkPHP js文件中U方法不被解析问题的解决方法
2016/12/05 PHP
Laravel5.5以下版本中如何自定义日志行为详解
2018/08/01 PHP
Thinkphp5 自定义上传文件名的实现方法
2019/07/23 PHP
PHP实现文件上传操作和封装
2020/03/04 PHP
jQuery 位置函数offset,innerWidth,innerHeight,outerWidth,outerHeight,scrollTop,scrollLeft
2010/03/23 Javascript
jQuery判断元素是否是隐藏的代码
2011/04/24 Javascript
EasyUI 中 MenuButton 的使用方法
2012/07/14 Javascript
jquery实现固定顶部导航效果(仿蘑菇街)
2013/03/21 Javascript
微信小程序 rpx 尺寸单位详细介绍
2016/10/13 Javascript
JavaScript原生节点操作小结
2017/01/17 Javascript
Angular.js项目中使用gulp实现自动化构建以及压缩打包详解
2017/07/19 Javascript
python爬取安居客二手房网站数据(实例讲解)
2017/10/19 Javascript
jQuery 实现倒计时天,时,分,秒功能
2018/07/31 jQuery
jQuery利用FormData上传文件实现批量上传
2018/12/04 jQuery
vue 实现滚动到底部翻页效果(pc端)
2019/07/31 Javascript
详解vue-router的导航钩子(导航守卫)
2020/11/02 Javascript
[01:33]DOTA2上海特级锦标赛 LIQUID战队完整宣传片
2016/03/16 DOTA
实例讲解Python中的私有属性
2014/08/21 Python
Python中的复制操作及copy模块中的浅拷贝与深拷贝方法
2016/07/02 Python
Python字典实现简单的三级菜单(实例讲解)
2017/07/31 Python
python中利用zfill方法自动给数字前面补0
2018/04/10 Python
pycharm远程linux开发和调试代码的方法
2018/07/17 Python
Python OpenCV读取png图像转成jpg图像存储的方法
2018/10/28 Python
python命令 -u参数用法解析
2019/10/24 Python
tensorflow 利用expand_dims和squeeze扩展和压缩tensor维度方式
2020/02/07 Python
浅谈对python中if、elif、else的误解
2020/08/20 Python
Python命令行参数定义及需要注意的地方
2020/11/30 Python
CSS3实现div从下往上滑入滑出效果示例
2020/04/28 HTML / CSS
水污染治理工程专业自荐信
2014/06/21 职场文书
卖房授权委托书样本
2014/10/05 职场文书
长城导游词
2015/01/30 职场文书
信息简报范文
2015/07/21 职场文书