原生js代码实现图片放大境效果


Posted in Javascript onOctober 30, 2016

今天我给大家分享一下自己用js写的一个图片放大器效果,我做了两种效果的放大,其实它们的原理都差不多,都是采用了两张图片给两张图片设定相应的尺寸,最后显示在不同位置,最终实现放大效果。

第一种是我仿照淘宝购物页面的一个放大镜效果,当鼠标移动到商品图片上时,图片上会出现一个矩形区域,而这个区域就是你要放大的区域,然后商品图片的右侧会出现一个放大后的商品图片。这种放大方式只需要你计算好放大的比例,然后通过修改放大区域的scrollLeft和scrollTop值实现相应的放大效果。

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>图片放大器</title>
<style media="screen">
*{
margin: 0;
padding: 0;
}
/*可视区域的父级标签*/
.wrap{
width: 400px;
height:auto;
border: 1px solid black;
display: inline-block;
position: absolute;
left: 0;
top: 0;
}
.wrap>img{
width: 100%;
height: auto;
}
/*锁定放大的矩形区域*/
.box{
border: 1px solid black;
width: 100px;
height: 100px;
background: rgba(0, 0, 0, 0.5);
opacity: 0.8;
position: absolute;
cursor: pointer;
display: none;
}
/*要显示放大图片的父级*/
.main{
width: 700px;
height: 700px;
margin-left: 420px;
overflow:hidden;
display:none;
position: absolute;
top: 0;
}
.main>img{
width:2800px;
height:auto;
}
</style>
</head>
<body>
<div class="wrap">
<img src="dog.jpg" alt="" />
<div class="box"></div>
</div>
<div class="main">
<img src="dog.jpg"alt="" />
</div>
<script type="text/javascript">
//获取四个对象
var wrap=document.querySelector('.wrap');
var box=document.querySelector('.box');
var main=document.querySelector('.main');
var mainImg=document.querySelector('.main img');
//添加移动事件
wrap.onmousemove=function(){
//鼠标移入可视图片后出现 锁定放大区域及放大图片
box.style.display='block';
main.style.display='block';
var event=window.event || event;
//获取鼠标距离可视区域边缘的偏移量
var disx=event.clientX-box.offsetWidth/2;
var disy=event.clientY-box.offsetHeight/2;
//矩形区域的最大可移动范围
var distanceMaxX=wrap.offsetWidth-box.offsetWidth;
var distanceMaxY=wrap.offsetHeight-box.offsetHeight;
// 判断让锁定放大的矩形区域不能出框
if (disx<=0) {
disx=0;
}
if (disy<=0) {
disy=0;
}
if(disx>=distanceMaxX) {
disx=distanceMaxX;
}
if(disy>=distanceMaxY) {
disy=distanceMaxY;
}
box.style.left=disx+'px';
box.style.top=disy+'px';

//获取放大比例
var scalex=box.offsetLeft/distanceMaxX;
var scaley=box.offsetTop/distanceMaxY;
main.scrollLeft=(mainImg.clientWidth-main.clientWidth)*scalex;
main.scrollTop=(mainImg.clientHeight-main.clientHeight)*scaley;
}

//添加移出事件
wrap.onmouseout=function(){
box.style.display='none';
main.style.display='none';
}
</script>
</body>
</html>

效果预览:

原生js代码实现图片放大境效果

第二种是直接在原图上放大,像放大镜在上面一样,这是在第一种上的一个扩展,前面的方法没有什么区别,只是最后不需要给它放置一个可视区域,直接在你原来所定放大的区域上显示放大图片,当你修改放大区域的left和top值时同时自动修改图片相应的left和top值,实现同步放大效果

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>放大镜</title>
<style type="text/css">
.main{
width: 500px;
height: 570px;
border: 2px solid black;
position: relative;
/*overflow: hidden;*/
}
#img1{
width: 100%;
height: 100%;
}
.box{
width: 200px;
height: 200px;
border-radius: 200px;
/*border: 1px solid black;*/
display: none;
position: absolute;
overflow: hidden;
cursor:move;
}
//放大图片 给绝对定位让移动时它也能跟着移动
实现和我们锁定的区域同步
#img2{
width: 1200px;
height: 1400px;
position: absolute;
/*left: 0;
top: 0;*/
/*display: none;*/
}
</style>
</head>
<body>
<div class="main">
<img id="img1" src="dog.jpg"/>
<div class="box">
<img id="img2" src="dog.jpg"/>
</div>
</div>
</body>
</html>
<script type="text/javascript">
var main=document.querySelector('.main');
var box=document.querySelector('.box');
var boximg=document.querySelector('#img2');
//添加鼠标移动事件
main.addEventListener('mousemove',move,false);
function move(){
//显示放大的圆形区域
box.style.display='block';
var event=window.event||event;
//获取鼠标距离可视区域边缘的偏移量
var disx=event.clientX-box.offsetWidth/2;
var disy=event.clientY-box.offsetHeight/2;
var dismax=main.offsetWidth-box.offsetWidth;
var dismay=main.offsetHeight-box.offsetHeight;
//矩形区域的最大可移动范围
if (disx<=0) {
disx=0;
}
if (disx>=dismax) {
disx=dismax-2;
}
if(disy<=0){
disy=0;
}
if(disy>=dismay){
disy=dismay-2;
}
//当你移动的时候修改圆形区域的left以及 top值。
box.style.left=disx+'px';
box.style.top=disy+'px';
// var scalx=main.offsetWidth/box.offsetWidth
// var scaly=main.offsetHeight/box.offsetHeight;
//同理当你移动时放大的图片它的图片也要修改left和top值
boximg.style.left=-event.clientX*2+'px';
boximg.style.top=-event.clientY*2+'px';
// box.scrollLeft=(boximg.offsetWidth-box.offsetWidth);
// box.scrollTop=(boximg.offsetHeight-box.offsetHeight);
}
// 添加鼠标移出事件
main.addEventListener('mouseout',out,false);
function out(){
box.style.display='none';
}
</script>

效果预览:

原生js代码实现图片放大境效果

结语:大家也看到了,其实两种放大方式其实没有什么区别,首先你要获取要放大的区域也就是刚才说的锁定放大区域的矩形和圆形。然后把要放大的图片给定一个区域显示。希望这两段代码对大家有所帮助,谢谢!!!

Javascript 相关文章推荐
jQuery TextBox自动完成条
Jul 22 Javascript
javascript实现des解密加密全过程
Apr 03 Javascript
推荐10个2014年最佳的jQuery视频插件
Nov 12 Javascript
jquery性能优化高级技巧
Aug 24 Javascript
浅谈javascript函数式编程
Sep 06 Javascript
javascript执行环境及作用域详解
May 05 Javascript
jQuery实现的省市联动菜单功能示例【测试可用】
Jan 13 Javascript
解决vue中修改export default中脚本报一大堆错的问题
Aug 27 Javascript
JS中appendChild追加子节点无效的解决方法
Oct 14 Javascript
JS实现获取数组中最大值或最小值功能示例
Mar 02 Javascript
Vue 防止短时间内连续点击后多次触发请求的操作
Nov 11 Javascript
一行JavaScript代码如何实现瀑布流布局
Dec 11 Javascript
Angular2 多级注入器详解及实例
Oct 30 #Javascript
Javascript 跨域知识详细介绍
Oct 30 #Javascript
jquery.validate[.unobtrusive]和Bootstrap实现tooltip错误提示问题分析
Oct 30 #Javascript
JS触摸屏网页版仿app弹窗型滚动列表选择器/日期选择器
Oct 30 #Javascript
js模式化窗口问题![window.dialogArguments]
Oct 30 #Javascript
Chrome不支持showModalDialog模态对话框和无法返回returnValue问题的解决方法
Oct 30 #Javascript
原生JS版和jquery版实现checkbox的全选/全不选/点选/行内点选(Mr.Think)
Oct 29 #Javascript
You might like
Laravel多用户认证系统示例详解
2018/03/13 PHP
firefox中用javascript实现鼠标位置的定位
2007/06/17 Javascript
用ASP将SQL搜索出来的内容导出为TXT的代码
2007/07/27 Javascript
遍历jquery对象的代码分享
2011/11/02 Javascript
让你的博客飘雪花超出屏幕依然看得见
2013/01/04 Javascript
用正则表达式替换图片地址img标签
2013/11/22 Javascript
js获取UserControl内容为拼html时提供方便
2014/11/02 Javascript
Javascript核心读书有感之表达式和运算符
2015/02/11 Javascript
JavaScript中instanceof运算符的使用示例
2016/06/08 Javascript
通过V8源码看一个关于JS数组排序的诡异问题
2017/08/14 Javascript
基于Vue2.X的路由和钩子函数详解
2018/02/09 Javascript
Vue+mui实现图片的本地缓存示例代码
2018/05/24 Javascript
JS实现将对象转化为数组的方法分析
2019/01/21 Javascript
详解vue中使用微信jssdk
2019/04/19 Javascript
layui.tree组件的使用以及搜索节点功能的实现
2019/09/26 Javascript
js实现消灭星星(web简易版)
2020/03/24 Javascript
vue+iview分页组件的封装
2020/11/17 Vue.js
NestJs使用Mongoose对MongoDB操作的方法
2021/02/22 Javascript
python 字典修改键(key)的几种方法
2018/08/10 Python
windows下cx_Freeze生成Python可执行程序的详细步骤
2018/10/09 Python
python操作日志的封装方法(两种方法)
2019/05/23 Python
Python Pandas中根据列的值选取多行数据
2019/07/08 Python
django-rest-framework解析请求参数过程详解
2019/07/18 Python
解决Jupyter Notebook开始菜单栏Anaconda下消失的问题
2020/04/13 Python
Canvas与Image互相转换示例代码
2013/08/09 HTML / CSS
Big Green Smile德国网上商店:提供各种天然产品
2018/05/23 全球购物
美国购买韩国护肤和美容产品网站:Althea Korea
2020/11/16 全球购物
安全施工责任书
2014/08/25 职场文书
讲文明知礼仪演讲稿
2014/09/13 职场文书
中秋客户感谢信
2015/01/22 职场文书
2015年社区中秋节活动总结
2015/03/23 职场文书
团委工作总结2015
2015/04/02 职场文书
2015年设计师个人工作总结
2015/04/25 职场文书
环保守法证明
2015/06/24 职场文书
安全知识竞赛主持词
2015/06/30 职场文书
个人工作总结(管理人员)范文
2019/08/13 职场文书