JS 图片放大镜
今天练习一个小demo, 从本地读取图片,
然后实现类似淘宝放大镜的效果,
再加两个需求
1 .可以调节缩放比例,默认放大两倍
2 . 图片宽高自适应, 不固定宽高
话不多说先看效果:

原理:1, 右侧放大区域的大小等于左侧半透明滑块大小乘以缩放倍数
2, 右侧放大区域图片的原始尺寸要和
左侧图片一样,不能随右侧的宽高变化
3, 计算滑块位置
上代码: 基本每行都有注释
HTML:
<!--放大镜-->
<div class="preview">
<div class="preview-header">
<!--选择本地图片-->
<div class="choose-image">
<lable for="fileInput">选择图片</lable>
<input type="file" id="fileInput">
</div>
<!--调整缩放倍数-->
<div class="scale">
<lable for="scaleNum">设置放大倍数</lable>
<input type="number" id="scaleNum" value="2">
</div>
</div>
<!--预览区域-->
<div class="preview-content">
<!--原图-->
<div class="origin">
<img src="" alt="" id="origin-image">
<!--滑块-->
<div class="scale-section"></div>
</div>
<!--放大后的图片-->
<div class="target">
<img src="" alt="" id="target-image">
</div>
</div>
</div>
CSS:
/*图片放大镜*/
/*头部*/
.preview-header{
display: flex;
padding: 10px;
}
/*预览区域*/
.preview-content{
display: none;
align-items: flex-start;
}
/*原始图片*/
.preview-content .origin{
max-width: 350px;
margin: 30px 0px 0px 10px;
position: relative;
box-shadow:3px 3px 10px 0 #111111; /*给图片施加阴影效果 */
-webkit-box-shadow: 3px 3px 10px 0 #111111; /*兼容性处理*/
-moz-box-shadow: 3px 3px 10px 0 #111111;
overflow: hidden;
}
.preview-content .origin img{
width: 100%;
}
/*滑块*/
.origin .scale-section{
display: none; /*初始隐藏*/
position:absolute;
top:0;
left:0;
width:175px;
height:175px;
background:#000;
opacity: 0.3;
cursor:move; /*改变鼠标的形状*/
} /*右侧放大区域的宽高是和滑块成比例的*/
.preview-content .target{
display: none;/*初始隐藏*/
width: 350px;
height: 350px;
margin: 30px 0px 0px 30px;
position: relative;
box-shadow:3px 3px 10px 0 #111111; /*给图片施加阴影效果 */
-webkit-box-shadow: 3px 3px 10px 0 #111111; /*兼容性处理*/
-moz-box-shadow: 3px 3px 10px 0 #111111;
overflow: hidden;
}
/*放大后的图片*/
.target img{
position: absolute;
top: 0;
left: 0;
transform-origin: top left;
}
JS:
// 获取dom
// 原始图片
const originImage = document.getElementById('origin-image'),
// 左侧图片区域
origin = document.getElementsByClassName('origin')[0],
// 放大后的图片
targetImage = document.getElementById('target-image'),
// 放大图片区域
target = document.getElementsByClassName('target')[0],
// 整个图片区域
previewContent = document.getElementsByClassName('preview-content')[0],
// 滑块
scaleSection = document.getElementsByClassName('scale-section')[0],
// 文件选择框
fileInput = document.getElementById('fileInput'),
// 放大倍数框
scaleNum = document.getElementById('scaleNum');
// 放大的倍数
let scale = scaleNum.value;
// 左侧图片的宽高
let originWidth,originHeight; // 注册事件
// 选择文件
fileInput.addEventListener('change',chooseImage,false);
// 改变倍数
scaleNum.addEventListener('change',scaleChange,false);
// 鼠标在左侧区域移动移动
origin.addEventListener('mousemove',(e) => {
// 事件兼容
const event = e || window.event;
// 计算滑块以及右边放大图片的位置
calculatePosition(event.clientX, event.clientY);
scaleSection.style.display = 'block';
target.style.display = 'block';
}, false);
// 鼠标离开左侧图片区域
origin.addEventListener('mouseleave',() => {
scaleSection.style.display = 'none';
target.style.display = 'none';
}, false); // 选择要缩放的图片
function chooseImage(e) {
// 使用file Reader获取URL
// 不懂fileReader的可以参考我之前写的本地图片预览
if (e.target.files[0].type.indexOf('image') === -1) {
alert('请选择图片');
return
}
const reader = new FileReader();
reader.onload = () => {
// promise是为了等图片加载完毕取宽高
const P1 = () => {
return new Promise((resolve, reject) => {
originImage.onload = () => {
resolve(originImage);
};
originImage.src = reader.result;
})
};
const P2 = () => {
return new Promise((resolve, reject) => {
targetImage.onload = () => {
resolve(targetImage);
};
targetImage.src = reader.result;
})
};
// 获取左侧原图的大小,
// 初始化放大区域的图片大小
Promise.all([P1(), P2()]).then((data) => {
originWidth = data[0].width;
originHeight = data[0].height;
data[1].style.width = originWidth * scale + 'px';
data[1].style.height = originHeight * scale + 'px';
});
previewContent.style.display = 'flex';
};
reader.readAsDataURL(e.target.files[0]);
} function calculatePosition(x,y) {
// 设置边界
const minTop = 0,
minLeft = 0,
maxTop = origin.offsetHeight - scaleSection.offsetHeight,
maxLeft = origin.offsetWidth - scaleSection.offsetWidth;
// 计算滑块的位置
const sectionX = x - origin.offsetLeft - scaleSection.offsetWidth/2;
const sectionY = y - origin.offsetTop - scaleSection.offsetHeight/2;
// 滑块的真实位置
// 用于计算右侧放大图片的位置
let realTop = sectionY, realLeft = sectionX;
// 左右边界
if (sectionX < minLeft) {
scaleSection.style.left = minLeft + 'px';
realLeft = minLeft;
} else if (sectionX >= maxLeft) {
scaleSection.style.left = maxLeft + 'px';
realLeft = maxLeft;
} else {
scaleSection.style.left = sectionX + 'px';
}
// 上下边界
if (sectionY <= minTop) {
scaleSection.style.top = minTop + 'px';
realTop = minTop;
} else if (sectionY >= maxTop) {
scaleSection.style.top = maxTop + 'px';
realTop = maxTop;
} else {
scaleSection.style.top = sectionY + 'px';
}
// 计算右侧放大图片的位置
// 滑块移动多少, 右侧图片就向反方向移动scale的倍数
targetImage.style.top = -realTop*scale + 'px';
targetImage.style.left = -realLeft*scale + 'px';
}
// 缩放比例改变
function scaleChange(e) {
scale = e.target.value;
targetImage.style.width = originWidth * scale + 'px';
targetImage.style.height = originHeight * scale + 'px';
target.style.width = 175 * scale + 'px';
target.style.height = 175 * scale + 'px';
}
还是那句话,新手自己多动手写写,
不然容易一看就会,一写就懵逼,
感谢观看!!!
JS 图片放大镜的更多相关文章
- jquery.jqzoom.js图片放大镜
jqzoom插件实现图片放大镜效果 1. jquery.jqzoom.js //************************************************************ ...
- js 图片放大镜功能
原理:放置两张相同的图片,一张作为主图片(图片1),另一张作为用来裁剪并放大的图片(图片2) 鼠标移动时,计算鼠标在图片1的位置(距离图片1左上角的x,y距离),以此决定在图片2开始 ...
- js图片放大镜特效代码
<script language="JavaScript"> <!-- var srcX = 1024; //原图长宽 var srcY = 768; var b ...
- js图片放大镜 可动态更换图片
现仅已.NET为例,HTML代码如下 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > & ...
- js图片放大镜
<!doctype html><html><head><meta charset="utf-8"><style>#sma ...
- [js开源组件开发]图片放大镜
图片放大镜 一般情况下,手机由于屏幕太小,会有图片上看不清的问题,所以我就做了一个放大镜的js效果,支持pc和移动端.它的原理是利用的backgroundsize来实现的,所以你的浏览器首先要支持这个 ...
- Magnifier.js - 支持鼠标滚轮缩放的图片放大镜效果
Magnifier.js 是一个 JavaScript 库,能够帮助你在图像上实现放大镜效果,支持使用鼠标滚轮放大/缩小功能.放大的图像可以显示在镜头本身或它的外部容器中.Magnifier.js 使 ...
- 原生JS实现图片放大镜插件
前 言 我们大家经常逛各种电商类的网站,商品的细节就需要用到放大镜,这个大家一定不陌生,今天我们就做一个图片放大镜的插件,来看看图片是如何被放大的…… 先看一下我们要是实现的最终效果是怎么样的 ...
- JS实现图片放大镜
将一个小图放置在一个小盒子里,当鼠标在小盒子里移动时,出现一个移动块,右侧出现一个大盒子,显示出小盒子中移动块所在区域的等比例放大的图片内容.需要实现的效果如下: 基本实现思路为:右侧大盒子为一个可视 ...
随机推荐
- Django用普通user对象登录的必须准备步骤
zt from http://segmentfault.com/q/1010000000343563 在stackoverflow找到了解答(http://stackoverflow.com/ques ...
- 8人/天,小记一次 JAVA(APP后台) 项目改造 .NET 过程(后台代码已完整开源于 Github)
Github: https://github.com/iccb1013/Jade.Net 我们只消耗了8人/天的时间,完成了全部工作,基于我们 Jade.Net 的开源后台代码,任何小规模的后台管理系 ...
- 人脸姿态校正算法 附完整C++示例代码
在一些特殊情况下,经常需要依据图像中的人脸,对图片进行倾斜矫正. 例如拍照角度幅度过大之类的情况,而进行人工矫正确实很叫人头大. 那是不是可以有一种算法,可以根据人脸的信息对图片进行角度的修复呢? 答 ...
- 智能指针之 shared_ptr
std::shared_ptr 是通过指针保持对象共享所有权的智能指针.多个 shared_ptr 对象可占有同一对象大概实现了一下,主要实现原理为,共享指针内部持有堆资源 的指针以及引用计数的指针 ...
- VMWare的网络
1.VMWare的网络连接方式区别 连接方式 宿主机和虚拟机 虚拟机对外网的访问 外网对虚拟机的访问 Host-Only 可以相互访问 不能直接访问 不能直接访问 NAT 虚拟机可以访问宿主机 可以( ...
- OOP编程七大原则
OCP(Open-Closed Principle),开放封闭原则:软件实体应该扩展开放.修改封闭.实现:合理划分构件,一种可变性不应当散落在代码的很多角落里,而应当被封装到一个对象里:一种可变性不应 ...
- spring boot -Properties & configuration
72. Properties & configuration72.1 Automatically expand properties at build timeRather than hard ...
- php curl_errno 60
问题描述 使用curl进行微信统一下单,curl 错误 curl_errno 60 错误码60 因为使用了证书配置项,所以要配置curl证书 解决方法 下载证书并配置php.ini ,配置curl证书 ...
- DOM元素的Attribute(特性)和Property(属性) 【转载】
1.介绍: 上篇js便签笔记http://www.cnblogs.com/wangfupeng1988/p/3626300.html最后提到了dom元素的Attribute和Property,本文简单 ...
- 14.app后端如何设计api
app和后端的交互,一般都是通过后端提供的api实现.api的设计,估计很多刚进入app后端的小伙伴会一无头绪,不知道怎么入门.下面根据自己3年的app后端经验,总结出下几个api设计原则,给小伙伴参 ...