原生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插件 tabBox实现代码
Feb 09 Javascript
页面调用单个swf文件,嵌套出多个方法。
Nov 21 Javascript
createElement与createDocumentFragment的点点区别小结
Dec 19 Javascript
JQuery创建DOM节点的方法
Jun 11 Javascript
JavaScript模块化开发之SeaJS
Dec 13 Javascript
Vuejs第十篇之vuejs父子组件通信
Sep 06 Javascript
深入理解Node.js的HTTP模块
Oct 12 Javascript
百度多文件异步上传控件webuploader基本用法解析
Nov 07 Javascript
yarn的使用与升级Node.js的方法详解
Jun 04 Javascript
微信小程序控制台提示warning:Now you can provide attr &quot;wx:key&quot; for a &quot;wx:for&quot; to improve performance解决方法
Feb 21 Javascript
JS浏览器BOM常见操作实例详解
Apr 27 Javascript
vue iview实现动态新增和删除
Jun 17 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
PHP伪造referer实例代码
2008/09/20 PHP
Ajax实时验证用户名/邮箱等是否已经存在的代码打包
2011/12/01 PHP
php实现无限级分类(递归方法)
2015/08/06 PHP
Apache无法自动跳转却显示目录的解决方法
2020/11/30 PHP
PHP常见加密函数用法示例【crypt与md5】
2019/01/27 PHP
PHP模糊查询技术实例分析【附源码下载】
2019/03/07 PHP
jQuery列表拖动排列具体实现
2013/11/04 Javascript
js中arguments,caller,callee,apply的用法小结
2014/01/28 Javascript
jquery选择器大全 全面详解jquery选择器
2014/03/06 Javascript
JQuery控制radio选中和不选中方法总结
2015/04/15 Javascript
JQuery工具函数汇总
2015/06/15 Javascript
Node.js实现文件上传
2016/07/05 Javascript
javascript 将共享属性迁移到原型中去的实现方法
2016/08/31 Javascript
jQuery EasyUI Draggable拖动组件
2017/03/01 Javascript
Vue.js实战之组件之间的数据传递
2017/04/01 Javascript
JS实现复选框的全选和批量删除功能
2017/04/05 Javascript
angularjs中使用ng-bind-html和ng-include的实例
2017/04/28 Javascript
JS组件系列之MVVM组件 vue 30分钟搞定前端增删改查
2017/04/28 Javascript
Node.js dgram模块实现UDP通信示例代码
2017/09/26 Javascript
微信小程序自定义导航栏实例代码
2019/04/05 Javascript
Vue项目中配置pug解析支持
2019/05/10 Javascript
vue-resource:jsonp请求百度搜索的接口示例
2019/11/09 Javascript
jQuery HTML设置内容和属性操作实例分析
2020/05/20 jQuery
Python检测字符串中是否包含某字符集合中的字符
2015/05/21 Python
python通过文件头判断文件类型
2015/10/30 Python
python使用requests模块实现爬取电影天堂最新电影信息
2019/04/03 Python
python带参数打包exe及调用方式
2019/12/21 Python
python 如何利用argparse解析命令行参数
2020/09/11 Python
python爬取微博评论的实例讲解
2021/01/15 Python
html5移动端价格输入键盘的实现
2019/09/16 HTML / CSS
精选干货:Java精选笔试题附答案
2014/01/18 面试题
工商企业管理实习自我鉴定
2013/12/04 职场文书
大型车展策划方案
2014/02/01 职场文书
质量整改通知单
2015/04/21 职场文书
胡桃夹子观后感
2015/06/11 职场文书
Redis调用Lua脚本及使用场景快速掌握
2022/03/16 Redis