使用react完成图片放大功能(淘宝放大镜)
文章目录
- 效果
- 引用组件
- 实现原理
- CSS部分
- React JS部分
- 参考文章
- Github源码
效果
引用组件
import React from 'react';
import ImageMagnifier from "./ImageMagnifier";
class ImgDemo extends React.Component{constructor(props) {super(props);this.state={// 略缩图:minImg:"./small.jpg",// 高清图maxImg:"./large.jpg",}}render(){const {minImg,maxImg} = this.state;return(<ImageMagnifier minImg={minImg} maxImg={maxImg}/>)}
}
export default ImgDemo;
实现原理
在左边的盒子中放入图片的缩略图,右边的盒子只有在鼠标放上去时显示,并且放置的是对应图片的大图,这个大图只在右边盒子中显示出局部。
鼠标放在左边缩略图的时候,会出现一个遮罩层(mask),这个mask覆盖缩率图的位置会在右边的盒子中“局部放大”显示。(只显示右边图片的局部)。
遮罩层大小 / 缩略图大小 = 放大部分 / 图片原始大小。
当鼠标在左边缩略图中移动时,会带着这个遮罩层移动。获取遮罩层(mask)在小图中的位置,然后改变对应大图在右边盒子中局部显示的位置。
当遮罩层向下移动的时候,这个大图向上等比例移动。只需要把溢出的部分隐藏(overflow:hidden)即可达到放大效果。
大图宽度/缩略图显示的宽度 = 图片移动的距离 / mask移动的距离
CSS部分
注意事项:
遮罩层和图片放大镜容器应该设置为 绝对定位absolute
而且起始是 隐藏的, 父元素相对定位 relative,这样遮罩层可以在父元素中移动。
关于css position可以看阮一峰的css定位详解
React JS部分
获取mask在盒子中的坐标:
- 获取鼠标在整个页面的位置;
- 获取盒子在浏览器左上角的位置;
- 鼠标在缩略图区域的坐标(localX & localY)= 鼠标在整个页面的位置 - 盒子在浏览器左上角的位置
- 再用
localX
、localY
减去mask宽高的一半,即为遮罩层左上角的坐标。
然后把遮罩层加到页面上,但需要判断是否溢出——即mask左上角坐标是否在盒子中,如果溢出,就改变左上角坐标使得盒子与边界部分重叠。——到达边界时,鼠标可以在遮罩层的靠近边界区域随意移动,而遮罩层不动。
最后进行等比例移动大图。
calculationBlock(offsetx,offsety){let cssStyle = JSON.parse(JSON.stringify(this.state.cssStyle))let offsetX = offsetx - 50; // 鼠标在盒子中的位置 - mask宽的一半let offsetY = offsety - 50; // 鼠标在盒子中的位置 - mask高的一半/*block position*/// 防止鼠标移动过快导致计算失误,只要小于或大于对应值,直接设置偏移量等于最小或最大值// left 取值为 大于 0, 小于 盒子的宽 - mask的宽if(offsetX < 0){offsetX = 0;}if(offsetX > 350){offsetX = 350;}// top 取值为 大于0 ,小于 盒子的高 - mask的高if(offsetY< 0){offsetY = 0;}if(offsetY > 350){offsetY = 350;}// 移动maskcssStyle.mouseBlock.left = parseFloat(offsetX) +"px";cssStyle.mouseBlock.top = parseFloat(offsetY ) + "px";/*计算图片放大位置*/// 右侧大图片,等比例移动// 大图片走的距离 / mask 走的距离 = 大图片 / 小图片let bigImg = document.querySelector(".big img")// <img className={'small img'} style={cssStyle.imgStyle} src={minImg}/> let smallImg = document.querySelector('.small img')let ratio = bigImg.offsetWidth / smallImg.offsetWidth;cssStyle.imgStyle2.left = - parseFloat( (offsetX) * ratio) +"px";cssStyle.imgStyle2.top = - parseFloat((offsetY) *ratio) + "px";this.setState({cssStyle:cssStyle,});}
参考文章
放大器组件
react写一个仿淘宝图片放大器
Github源码
源码地址
使用react完成图片放大功能(淘宝放大镜)相关推荐
- java下载图片到本地,例如从网上下载图片,下载淘宝图片,下载百度图片等
java下载图片到本地,例如从网上下载图片,下载淘宝图片,下载百度图片. 直接上代码如下: public static void download(String url,String saveFile ...
- jQuery插件Magnify放大镜实现javascript图片放大功能
jQuery插件Magnify放大镜实现javascript图片放大功能 博客所有文章均属原创作品,如有转载,请注明作者:biuuu,来源:http://www.biuuu.com/?p=459 有时 ...
- h5 - PhotoSwipe图片放大功能集成和使用
说明: PhotoSwipe图片放大功能的简单demo. 重要代码: 1.html中引入js和css文件,和一段固定的代码 <!-- PhotoSwipe styles --& ...
- vue仿淘宝放大镜插件 vue-piczoom的使用问题
vue仿淘宝放大镜插件 vue-piczoom npm install vue-piczoom--save //下载放大镜插件 使用的话就是直接引入 import picZoom from 'vue- ...
- 用iSee图片专家制作淘宝店标教程
普通的淘宝店铺都会有店标.店标都显示在店铺首页的显现位置,买家在逛淘宝店的时候,一眼都会瞄到店标.因此,如果可以制作一个专属于自己店铺的店标,可以吸引买家的眼光,也更好地宣传了店铺. 下面就用iSee ...
- angular仿微信图片放大功能
近期要写一个移动端两个手指图片放大的功能,由于我们项目是angular框架.一时间没有思路只能百度找一些angualr的文档,果然一下就出来了,而且非常实用.我用根据自己的需求改动了一下,最后完成的效 ...
- html css3不拉伸图片显示效果,类似淘宝的
1.利用transform属性不拉伸显示图片,(路径问题需要按需求修改): html: <div id="surface-div1"> <img :src=&qu ...
- winform窗体上图片放大功能
今天遇到点击图片,所点部位实现放大的功能,网上也有很多资料,记录下自己写的. 窗体上放置两个pictureBox控件,第一个添加image,属性SizeMode设置为StretchImage.可以开始 ...
- 小程序富文本图片放大功能
// 富文本图片放大 function richImg(txt) {//txt 指的是接口返回的富文本// 主要代码let imgarr = [];let regex = new RegExp(/&l ...
最新文章
- (原创)JAVA注解应用——实现属性的自动检测
- 不完全恢复分类与命令
- 新装WINDOWS XP系统 必须安装的十大高危漏洞补丁
- php 去掉url中的index.php,php 去掉url中的index.php
- [导入]存储过程-分隔符号-多条件查询
- 60-170-040-使用-Time-Flink时间系统系列之实例讲解-如何做定时输出
- 如何在Android中设置铃声+震动
- CentOS Bash 命令补全增强软件包 bash-completion
- 22个开源的PHP框架
- vi编辑文件时如何批量替换字符串
- linux超出频率限制黑屏,linux suse 超出频率限制 问题
- 教育培训机构拼团招生小程序公众号
- 这一年,我“生病”了
- C语言绘图示例-调色板
- 《小猫猫大课堂》1——小喵是如何开启敲代码之路的?
- LLVM中的pass及其管理机制
- matlab两条曲线方程求交点_帮忙matlab求两条曲线交点程序,不知问题出在哪里。...
- vsCode好用插件记录
- 《算法之美》-- 读书笔记(4)-- 2019
- 百度Sugar BI 数据可视化里的标签页组件如何实现