js自制图片放大镜功能

yizhihongxing

下面是关于“js自制图片放大镜功能”的完整攻略。

需求分析

在网站中,我们经常需要实现图片放大功能,而放大镜效果是一种常见的实现方式。放大镜会在鼠标悬浮在图片上时,弹出一个局部放大的镜头,帮助用户更方便的查看细节。

整体思路

下面是实现放大镜效果的整体思路:

  1. 将要放大的图片进行裁剪,获得两份图片,一份是缩略图,一份是原图。
  2. 将缩略图和放大镜框上传到网站上。
  3. 初始化页面,给展示缩略图的区域绑定鼠标移动事件。
  4. 鼠标移动时,在缩略图上显示一个透明的放大镜框,并且根据鼠标移动的位置,计算出对应的位置在原图上的坐标。
  5. 根据计算出的原图上的坐标,在原图区域上显示一份对应的局部放大图。
  6. 当鼠标移出缩略图区域时,放大镜框和局部放大图都需要隐藏。

具体实现

下面是具体实现的过程:

  1. 将要展示的图片进行裁剪,得到缩略图和原图

```
// 1.1. 首先获取需要展示的图片
const img = document.querySelector('.product-detail__img img')

// 1.2. 获取图片的原始大小
const naturalWidth = img.naturalWidth
const naturalHeight = img.naturalHeight

// 1.3. 计算出图片的中心点
const centerX = naturalWidth / 2
const centerY = naturalHeight / 2

// 1.4. 计算出需要裁剪出来的位置和大小
const thumbnailSize = 150
const clipX = centerX - thumbnailSize / 2
const clipY = centerY - thumbnailSize / 2
const clipWidth = thumbnailSize
const clipHeight = thumbnailSize

// 1.5. 使用canvas裁剪出缩略图和原图
const canvas = document.createElement('canvas')
canvas.width = clipWidth
canvas.height = clipHeight

const ctx = canvas.getContext('2d')
ctx.drawImage(img, -clipX, -clipY, naturalWidth, naturalHeight)

const thumbnail = canvas.toDataURL()

canvas.width = naturalWidth
canvas.height = naturalHeight

ctx.drawImage(img, 0, 0, naturalWidth, naturalHeight)

const original = canvas.toDataURL()

// 1.6. 将缩略图和原图上传到服务器或者存储到本地
```

  1. HTML布局

```

js自制图片放大镜功能

js自制图片放大镜功能

```

  1. JS代码

```
const thumbnail = document.querySelector('.product-detail__thumbnail')
const thumbnailImg = thumbnail.querySelector('img')
const magnifier = thumbnail.querySelector('.product-detail__magnifier')

const original = document.querySelector('.product-detail__original')
const originalImg = original.querySelector('img')

const handleMouseMove = event => {
const rect = thumbnail.getBoundingClientRect()
const offsetX = event.clientX - rect.left
const offsetY = event.clientY - rect.top

 const magnifierSize = 150
 const magnifierX = Math.max(0, Math.min(thumbnail.offsetWidth - magnifierSize, offsetX - magnifierSize / 2))
 const magnifierY = Math.max(0, Math.min(thumbnail.offsetHeight - magnifierSize, offsetY - magnifierSize / 2))

 magnifier.style.left = magnifierX + 'px'
 magnifier.style.top = magnifierY + 'px'

 const scale = originalImg.naturalWidth / thumbnailImg.offsetWidth

 original.style.backgroundPosition = `-${magnifierX * scale}px -${magnifierY * scale}px`

 magnifier.style.display = 'block'
 original.style.display = 'block'

}

const handleMouseLeave = event => {
magnifier.style.display = 'none'
original.style.display = 'none'
}

thumbnail.addEventListener('mousemove', handleMouseMove)
thumbnail.addEventListener('mouseleave', handleMouseLeave)
```

示例说明

这里提供两个关于实现放大镜功能的示例:

示例一

中寻花园荟的“小程序”页面,实现了商品图片的放大和查看功能。用户可以通过手势控制图片的缩放和移动,查看商品的细节。具体的流程如下:

  1. 在网页中设置要显示的大图片的路径,生成缩略图,并将缩略图保存在图片服务器中。
  2. 启动微信内置的图片浏览器,将缩略图的路径传入,达到快速浏览效果。
  3. 在放大镜的实现上,利用小程序框架提供的移动手势监听事件以及图片的scale和translate,实现手势缩放和移动。

因此,对于一张较大的商品图片,可以通过以上三个步骤达到快速浏览和放大查看的效果。

示例二

某电商网站“商品详情页”的图片放大效果,采用了独立开发方式实现。选中商品时,通过Ajax请求获取商品的详细信息,包括商品的缩略图和原图的地址。当鼠标移动到缩略图上时,获取鼠标在缩略图中的位置,并显示一个透明的放大镜框。根据鼠标在缩略图中的位置计算出在原图上的坐标,并在原图区域上显示一个具有相应大小的局部放大图。鼠标离开缩略图则隐藏放大镜和局部放大图。此外,为了避免过度频繁地请求图片,该功能还实现了缓存机制,在第一次加载图片后,将对应的图片保存在浏览器缓存中,下次再需要时则可以直接从浏览器缓存中读取,提高了效率。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:js自制图片放大镜功能 - Python技术站

(0)
上一篇 2023年6月9日
下一篇 2023年6月9日

相关文章

  • CSS3的Border-radius轻松制作圆角

    当我们需要对一个html元素添加圆角时,可以使用CSS3的Border-radius属性。以下是该属性的语法: border-radius: value; 其中,value可以是一个或多个数值,数值的含义如下: 如果只给定一个值,那么四个圆角的大小相同。 如果给定两个值,第一个值为水平方向上的圆角半径,第二个值为垂直方向上的圆角半径。 如果给定四个值,则分别…

    css 2023年6月10日
    00
  • 利用css设置元素垂直居中的解决方法汇总

    下面我将详细讲解如何利用 CSS 设置元素垂直居中的解决方法汇总。 什么是垂直居中 在 CSS 中,垂直居中指的是将一个元素在垂直方向上居中对齐。垂直居中比较常用的场景包括父元素和子元素高度不一致、子元素固定高度等。 方法一:利用 flexbox 利用 Flexbox 布局可以非常简单地实现垂直居中。首先需要设定父元素的 display 属性为 flex,然…

    css 2023年6月10日
    00
  • vue实现竖屏滚动公告效果

    下面是详细讲解“vue实现竖屏滚动公告效果”的完整攻略: 1. 需求分析 首先,我们需要明确需求,也就是实现竖屏滚动公告效果。具体来说,我们需要在页面的某一个位置上显示一个公告栏,公告栏支持竖向滚动,并且滚动速度适中、不太快。 2. 技术方案 针对这个需求,我们可以选择使用vue.js框架来实现。我们需要用到vue.js的组件化、生命周期钩子、动画等相关技术…

    css 2023年6月10日
    00
  • CSS样式去除input和textarea点击选中框

    要去除input和textarea在点击时出现的选中框,可以通过CSS样式来实现。以下是实现的方法: 方法一:使用outline 可以使用CSS属性outline:none来清除input和textarea在点击时出现的选中框。 例如,我们可以设置一个class为text-input,然后用CSS样式去掉选中框: .text-input:focus { ou…

    css 2023年6月10日
    00
  • Vue使用Swiper的案例详解

    Vue使用Swiper的案例详解 介绍 Vue.js 是一个渐进式 JavaScript 框架,可以轻易地建立单页面应用程序(Single Page Application)。 Swiper 是一款轻量级的移动端(支持 PC 端)触摸滑动插件,用于实现轮播图、图片切换等效果。 在本文中,我们将讲解如何在 Vue 项目中使用 Swiper 插件来实现轮播图效果…

    css 2023年6月9日
    00
  • 第一次接触神奇的Bootstrap菜单和导航

    下面是详细讲解“第一次接触神奇的Bootstrap菜单和导航”的完整攻略。 什么是Bootstrap菜单和导航 Bootstrap是一个流行的前端CSS框架,它提供了一系列的组件,方便开发者们快速搭建网站,其中菜单和导航是非常重要的组件之一。Bootstrap的菜单和导航可以帮助用户快速浏览和定位网站内容,同时也能增加网站的美观性。 如何使用Bootstra…

    css 2023年6月11日
    00
  • JavaScript原型对象原理与应用分析

    JavaScript原型对象原理与应用分析 什么是JavaScript原型对象 在JavaScript中,每个函数都有一个prototype属性,我们称之为“原型对象”。原型对象是一个普通的对象,它有自己的属性和方法。通常情况下,我们为了让某个函数变成一个构造函数,会将它的prototype属性设置为一个新对象。 例如,以下代码定义了一个构造函数Person…

    css 2023年6月9日
    00
  • css控制文本框宽度的方法

    以下是关于“CSS控制文本框宽度的方法”的完整攻略,包含两个示例说明。 方法一:使用width属性 可以使用CSS的width属性来控制文本框的宽度。可以按照以下步骤操作: 在CSS文件中,使用width属性来设置文本框的宽度。例如: input[type="text"] { width: 300px; } 上述代码将设置文本框的宽度为3…

    css 2023年5月18日
    00
合作推广
合作推广
分享本页
返回顶部