原生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 相关文章推荐
javascript 框架小结 个人工作经验
Jun 13 Javascript
编写可维护面向对象的JavaScript代码[翻译]
Feb 12 Javascript
jQuery 2.0.3 源码分析之core(一)整体架构
May 27 Javascript
Javascript核心读书有感之词法结构
Feb 01 Javascript
Vue.js 表单校验插件
Aug 14 Javascript
node.js利用redis数据库缓存数据的方法
Mar 01 Javascript
jQuery实现的回车触发按钮事件功能示例
Mar 25 jQuery
微信小程序动态生成二维码的实现代码
Jul 25 Javascript
微信小程序表单验证WxValidate的使用
Nov 27 Javascript
vue-property-decorator用法详解
Dec 12 Javascript
Vue+Node服务器查询Mongo数据库及页面数据传递操作实例分析
Dec 20 Javascript
js get和post请求实现代码解析
Feb 06 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
BBS(php &amp; mysql)完整版(七)
2006/10/09 PHP
PHP常用的文件操作函数经典收藏
2013/04/02 PHP
mac下Apache + MySql + PHP搭建网站开发环境
2014/06/02 PHP
Fedora下安装php Redis扩展笔记
2014/09/03 PHP
Js控制弹窗实现在任意分辨率下居中显示
2013/08/01 Javascript
Jquery实现搜索框提示功能示例代码
2013/08/13 Javascript
判断输入是否为空,获得输入类型的JS代码
2013/10/30 Javascript
jQuery拖拽 &amp; 弹出层 介绍与示例
2013/12/27 Javascript
jquery统计用户选中的复选框的个数
2014/06/06 Javascript
JavaScript运行机制之事件循环(Event Loop)详解
2014/10/10 Javascript
jQuery form插件的使用之处理server返回的JSON, XML,HTML数据
2016/01/26 Javascript
bootstrap网页框架的使用方法
2016/05/10 Javascript
js中动态创建json,动态为json添加属性、属性值的实例
2016/12/02 Javascript
js图片轮播手动切换特效
2017/01/12 Javascript
基于angular2 的 http服务封装的实例代码
2017/06/29 Javascript
微信小程序 POST请求的实例详解
2017/09/29 Javascript
JS实现左边列表移到到右边列表功能
2018/03/28 Javascript
Vue 获取数组键名的方法
2018/06/21 Javascript
JavaScript实现电灯开关小案例
2020/03/30 Javascript
Element Steps步骤条的使用方法
2020/07/26 Javascript
vue使用canvas实现移动端手写签名
2020/09/22 Javascript
Python入门篇之文件
2014/10/20 Python
Python中用于转换字母为小写的lower()方法使用简介
2015/05/19 Python
ubuntu环境下python虚拟环境的安装过程
2018/01/07 Python
python matlibplot绘制多条曲线图
2021/02/19 Python
python3 webp转gif格式的实现示例
2019/12/10 Python
通过一张图教会你CSS3倒影的实现
2017/09/26 HTML / CSS
html5利用canvas绘画二级树形结构图的示例
2017/09/27 HTML / CSS
Linux不知道文件后缀名怎么判断文件类型
2012/04/26 面试题
三年级数学教学反思
2014/01/31 职场文书
甜品蛋糕店创业计划书范文
2014/02/06 职场文书
拓展策划方案
2014/06/03 职场文书
机关作风建设工作总结
2014/10/23 职场文书
2015年党风廉政承诺书
2015/01/22 职场文书
2016大学迎新晚会开场白
2015/11/24 职场文书
导游词之贵州百里杜鹃
2019/10/29 职场文书