今天练习一个小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 图片放大镜的更多相关文章

  1. jquery.jqzoom.js图片放大镜

    jqzoom插件实现图片放大镜效果 1. jquery.jqzoom.js //************************************************************ ...

  2. js 图片放大镜功能

    原理:放置两张相同的图片,一张作为主图片(图片1),另一张作为用来裁剪并放大的图片(图片2)          鼠标移动时,计算鼠标在图片1的位置(距离图片1左上角的x,y距离),以此决定在图片2开始 ...

  3. js图片放大镜特效代码

    <script language="JavaScript"> <!-- var srcX = 1024; //原图长宽 var srcY = 768; var b ...

  4. js图片放大镜 可动态更换图片

    现仅已.NET为例,HTML代码如下 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > & ...

  5. js图片放大镜

    <!doctype html><html><head><meta charset="utf-8"><style>#sma ...

  6. [js开源组件开发]图片放大镜

    图片放大镜 一般情况下,手机由于屏幕太小,会有图片上看不清的问题,所以我就做了一个放大镜的js效果,支持pc和移动端.它的原理是利用的backgroundsize来实现的,所以你的浏览器首先要支持这个 ...

  7. Magnifier.js - 支持鼠标滚轮缩放的图片放大镜效果

    Magnifier.js 是一个 JavaScript 库,能够帮助你在图像上实现放大镜效果,支持使用鼠标滚轮放大/缩小功能.放大的图像可以显示在镜头本身或它的外部容器中.Magnifier.js 使 ...

  8. 原生JS实现图片放大镜插件

      前  言 我们大家经常逛各种电商类的网站,商品的细节就需要用到放大镜,这个大家一定不陌生,今天我们就做一个图片放大镜的插件,来看看图片是如何被放大的…… 先看一下我们要是实现的最终效果是怎么样的  ...

  9. JS实现图片放大镜

    将一个小图放置在一个小盒子里,当鼠标在小盒子里移动时,出现一个移动块,右侧出现一个大盒子,显示出小盒子中移动块所在区域的等比例放大的图片内容.需要实现的效果如下: 基本实现思路为:右侧大盒子为一个可视 ...

随机推荐

  1. How To Install and Use Redis

    https://www.digitalocean.com/community/tutorials/how-to-install-and-use-Redis About Redis redis, dev ...

  2. 人脸姿态校正算法 附完整C++示例代码

    在一些特殊情况下,经常需要依据图像中的人脸,对图片进行倾斜矫正. 例如拍照角度幅度过大之类的情况,而进行人工矫正确实很叫人头大. 那是不是可以有一种算法,可以根据人脸的信息对图片进行角度的修复呢? 答 ...

  3. Java开源生鲜电商平台-商品表的设计(源码可下载)

    Java开源生鲜电商平台-商品表的设计(源码可下载) 任何一个电商,无论是B2C还是B2B的电商,商品表的设计关系到整个系统架构的核心. 1. 商品基本信息表:用单词:goods做为商品表 2. 商品 ...

  4. 使图片自适应div大小

    <img src=“” onload="javascript:if(this.height>MaxHeight)this.height=MaxHeight;if(this.wid ...

  5. kibana-Request Timeout after 30000ms故障解决

    etc在日志系统搭建起来后大半年一直没有出现大的问题,在上个月的某段时间,我慢慢发现有这个问题的存在了,首先是自己遇到过,后面也有人反应这个问题.于是就开始对这个问题进行分析: 1.因为服务器是放在国 ...

  6. python爬虫入门(五)Selenium模拟用户操作

    爬虫(Spider),反爬虫(Anti-Spider),反反爬虫(Anti-Anti-Spider) 之间恢宏壮阔的斗争... 小莫想要某站上所有的电影,写了标准的爬虫(基于HttpClient库), ...

  7. Jupyter-notebook 导出时不显示Input[]代码

    参考: https://stackoverflow.com/questions/34818723/export-notebook-to-pdf-without-code    1. 第一个方式是直接在 ...

  8. 指针超强汇总(谨记优先级:() > [] > *)

    参考:http://blog.chinaunix.net/uid-20120277-id-5760985.html C语言所有复杂的指针声明,都是由各种声明嵌套构成的.如何解读复杂指针声明呢?右左法则 ...

  9. activemq+Zookeper高可用集群方案配置

    在高并发.对稳定性要求极高的系统中,高可用的是必不可少的,当然ActiveMQ也有自己的集群方案.从ActiveMQ 5.9开始,ActiveMQ的集群实现方式取消了传统的Master-Slave方式 ...

  10. SSM-SpringMVC-06:SpringMVC关于静态资源无法展示的问题

     ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 按照之前的那种方式一路走下来,或许你没发觉有问题,只是你没有使用到而已 css,js,图片等无法正常使用怎么 ...