今天花了点时间,复习了下使用原生JS实线放大镜的效果。在制作过程中,也是很到了一些问题,在这里总结下。

HTML代码如下:

 <div id="preview">
<div id="mediumDiv">
<img id="mImg" src="data:images/products/product-s1-m.jpg"/>//这是中级图片层
<div id="mask"></div>//这是遮罩
<div id="superMask"></div>//这是超级遮罩,作用是鼠标进入,1. 显示遮罩区域和图片放大区域;2提供鼠标移动区域
</div>
<div id="largeDiv"></div>//图片放大区域;
<h1>
<a class="backward disabled"></a>
<a class="forward"></a>//这里注意类的书写,有类名后面有多余的空格容易导致出错,一定要注意。
<ul id="icon_list">
<li><img src="data:images/products/product-s1.jpg" /></li>
<li><img src="data:images/products/product-s2.jpg" /></li>
<li><img src="data:images/products/product-s3.jpg" /></li>
<li><img src="data:images/products/product-s4.jpg" /></li>
<li><img src="data:images/products/product-s1.jpg" /></li>
<li><img src="data:images/products/product-s2.jpg" /></li>
<li><img src="data:images/products/product-s3.jpg" /></li>
<li><img src="data:images/products/product-s4.jpg" /></li>
</ul>
</h1>
</div>

CSS代码如下:


       #preview {position:absolute;top:;left:;width: 352px;}
#mediumDiv {border:1px solid #ddd;width: 350px;margin-bottom: 5px;text-align:center;position: relative;}
#mediumDiv img { vertical-align:middle;width:350px;height:350px;}
#mask {position:absolute;width: 175px;height: 175px;background: #ffa;opacity: 0.5;
top:;left:;display: none;}
#superMask {position: absolute;width: 350px;height: 350px;opacity:;left:;top:;cursor: move;}
#largeDiv {position: absolute;top:;left:351px;width: 400px;height: 400px;border:1px solid #ddd;z-index:;background: #fff;display: none;}
#preview h1 {width: 352px;overflow: hidden;position:relative;height: 54px;}
#preview .backward ,#preview .forward{height: 54px;width: 17px;background-repeat: no-repeat;background: url(Images/iconlist_1.png);display: block;position: absolute; top:;z-index:}
#preview .backward {background-position:0 -139px;left:; }
#preview .forward {background-position: -17px -139px;right:;}
#preview .backward:hover {background-position: -34px -139px;}
#preview .forward:hover {background-position: -51px -139px;}
#preview .backward.disabled {background-position: -68px -139px;}
#preview .forward.disabled {background-position: -85px -139px;}
#icon_list {position: absolute;left:25px;width: 496px;}
#icon_list li {float:left;border:1px solid #ddd;margin-right: 8px;width: 50px;height: 50px;text-align:center;padding:1px;}
#icon_list li:hover {border:2px solid #e4393c;padding:;}
#icon_list li img {width: 100%;height: 100%;}
JS代码:
         // 放大镜
(function(){
const LIWIDTH = 62;//li的宽度
const OFFSET = 25;//ul的其实left
const MSIZE =175;//mask的大小
const SMIZE =350;//supermask的大小
var count = document.querySelectorAll('#icon_list>li').length,//li的个数
moved =0,//左移的个数;
aBackward = document.querySelector('#preview a.backward'),//按钮
aForward = document.querySelector('#preview a.forward');//按钮
aForward.addEventListener('click',move);
aBackward.addEventListener('click',move);
function move(){
if (this.className.indexOf('disabled')==-1) {////如果当前a的class中没有disabled,这里是说没有disabled才移动,有disabled的话就不运行下面的
if (this.className =='forward') //代码
moved++;
else
moved--;
console.log(moved)//这里注意类的书写,如果类后面有多余的空格导致出错
this.parentNode.lastElementChild.style.left = -moved*LIWIDTH+OFFSET+'px';
if (moved==0) {aBackward.className +=' disabled';}
else if(moved == count-5) aForward.className +=' disabled';
else {
aForward.className ='forward';
aBackward.className='backward';
}
}
}
var Image = document.getElementById('mImg');
//为id为icon_list的ul绑定鼠标进入事件:
document.getElementById('icon_list').addEventListener('mouseover',function(e){
if (e.target.nodeName.toLowerCase() =='img') {//此处利用冒泡事件,给每个img元素绑定了鼠标移入事件
var src = e.target.src.split('.')[0]+'-m.jpg';
Image.src = src; }
})
var sm=document.getElementById("superMask")
mask=document.getElementById("mask"),
lgDiv=document.getElementById("largeDiv"); sm.addEventListener('mouseover',function(){
mask.style.display="block";
lgDiv.style.display="block";
var src = Image.src;
var i = src.lastIndexOf('.');
src = src.slice(0,i-1)+'l'+src.slice(i);
lgDiv.style.backgroundImage = 'url('+ src+')';
})
sm.addEventListener("mouseout",
function(){
mask.style.display="";
lgDiv.style.display="";
}
);
//为sm绑定鼠标移动事件
var MAX=SMIZE-MSIZE;
sm.addEventListener('mousemove',function(e){
var x = e.offsetX,y = e.offsetY;
var top = y-MSIZE/2,left = x-MSIZE/2;
if(top <0) top =0;
else if(top >MAX) top =MAX;
if (left <0) left =0;
else if (left >MAX) left =MAX;
mask.style.cssText=
"display:block; left:"+left+"px; top:"+top+"px";
lgDiv.style.backgroundPosition=
-left*16/7+"px "+ -top*16/7+"px";
})
 

用JS实线放大镜的效果的更多相关文章

  1. 用js实现放大镜的效果

    第一次发博客,还有点小激动,本人现在正在天津上大学,希望以后从事前端这一行业,学习的时间不长,写博客为了记录自己的学习过程和收获,当然也算是巩固.可能写的东西不会像大牛那样高大上,只是一些基本的内容, ...

  2. js实现放大镜的效果

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  3. 原生js实现放大镜效果

    今天做任务的时候,有一个任务就是让实现电商网站常用的放大镜效果,类似于这样的效果,之前并没有做过这种放大镜效果,刚开始的思路是对图片进行裁剪,但是后来发现实在是难以实现,于是求助了万能的谷歌,发现一个 ...

  4. JS 图片放大镜

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

  5. 原生JS封装简单动画效果

    原生JS封装简单动画效果 一致使用各种插件,有时候对原生JS陌生了起来,所以决定封装一个简单动画效果,熟悉JS原生代码 function animate(obj, target,num){ if(ob ...

  6. JS实现回到顶部效果

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. [JS,NodeJs]个人网站效果代码集合

    上次发的个人网站效果代码集合: 代码集合: 1.彩色文字墙[鼠标涟漪痕迹] 2.彩色旋转圆环 [模仿http://www.moma.org/interactives/exhibitions/2012/ ...

  8. turn.js实现翻书效果

    JS插件网 http://www.ijquery.cn/?p=173 描述:Turn.js 是一个轻量级的 (15kb) jQuery/html5 插件用来创建类似书本和杂志翻页效果,支持触摸屏设备. ...

  9. 面向对象原生js幻灯片代淡出效果

    面向对象原生js幻灯片代淡出效果 下面是代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" & ...

随机推荐

  1. linux php5.4安装phalcon

    PHP版本5.6以上,安装可参考.https://blog.csdn.net/happysdh/article/details/51450654 在phalcon3.0以后就不支持php5.4了. 要 ...

  2. redis-cli启动问题

    首先需要找到redis的所在目录,然后将redis.conf复制到/etc/redis.conf 另外需要将redis.conf文件中的 daemonize no 设置为 daemonize yes. ...

  3. 用 vue 脚手架 vue-cli 初始化(新建)项目

    前提:已经安装 node.js 和 git 1.在需要创建的文件夹中,右击 -> Git  Bush Here ,然后输入命令 vue init webpack "文件名"( ...

  4. tensorflow中张量的理解

    自己通过网上查询的有关张量的解释,稍作整理. TensorFlow用张量这种数据结构来表示所有的数据.你可以把一个张量想象成一个n维的数组或列表.一个张量有一个静态类型和动态类型的维数.张量可以在图中 ...

  5. 部分树形DP的优化

    ural1018. Binary Apple Tree 题目大意 有一棵n个节点的树,树上每个节点有一个值,选择m个节点使这些节点值的和最大 要求:如果选当前节点,则必须选它的父节点 解法: 我们设d ...

  6. UVA11613 Acme Corproation

    UVA11613 Acme Corproation 生产销售计划 题目大意 A公司生产一种元素,给出该元素在未来M个月中每个月的单位售价,最大生产量,生产成本,最大销售量和最大存储时间,和每月存储代价 ...

  7. LA3905 Meteor

    https://vjudge.net/problem/UVALive-3905 计算出每个点在相框中的时间段,扫描线做即可 关键在如何快速计算每个点在相框中的时间段.对每个点进行运动分解,进入的时间L ...

  8. Liferay 7:Liferay DXP解决方案

    分享是美德,欢迎探讨技术 这个作者很厉害呀,写的博客都是解决很刁钻问题的.强烈推荐 http://www.liferaysolution.com/2017/06/captcha-recaptcha-w ...

  9. Django项目:CRM(客户关系管理系统)--51--42PerfectCRM实现AJAX全局账号注册

    #urls.py """PerfectCRM URL Configuration The `urlpatterns` list routes URLs to views. ...

  10. Thinkphp 错误集锦

    1.无法加载控制器 开始还跑TP核心文件中找错误,结果没找到什么结果.最后还是用程序新建模块才发现问题. 问题是命名空间名字写错了.比如书:本来是Report模块下的IndexContrller,但是 ...