javascript案例之放大镜效果
效果图
如何实现该效果呢?? 我们先来进行分析
实现思路
1.鼠标移入移出事件
1>移入:悬浮块和大图显示
2>移出:悬浮块和大图隐藏
2.鼠标移动(悬浮块随着鼠标移动)
1>获取鼠标当前的位置(e.clietX)
2>获取鼠标最大可以移动的距离left( left= 鼠标位置 - 悬浮块宽度/2 )这里悬浮块宽度/2是为了保持在正中间
3>判断是否碰壁(<0,则=0;>max,则=max) 这里配合上图指的是 悬浮块在div(id:left)的可视区移动距离
4>设置悬浮块的位置 ( this.style.left = left+'px') 这里this指向悬浮块
5>求比例 (分两步 => 1.求左右两边的宽高比例 2.求左右移动的距离比例)
(公式: 小图的宽/悬浮框的宽=大图的宽/right的宽)
>求出宽度比例 =小图宽度/悬浮块宽度
>求出高度比例 =小图高度/悬浮块高度
设置大图的宽高
style.width=宽度比例*right的宽
style.height=高度比例*right的高
6>左边移动 =右边移动的距离 (公式: 左边悬浮框实际走的距离/最大能够走的距离=右边实际走得距离?/右边最大能够走的距离 )
>左边的比例=鼠标最大可以移动的距离left/最大可视区(鼠标最大可以移动的距离left-悬浮块的宽度)
7>右边移动 (右边能够走的距离 = (大图的宽高-div的宽高)*左边移动的比例+"px") 注释:左边向下,右边得向上 ,故要取反 下面是代码:
css部分
<style>
body{
margin:0;
padding:0;
}
#left{
width:400px;
height:300px;
position:relative;
}
#left img{
width:400px;
height:255px;
}
#float{
width:160px;
height:120px;
background:rgba(0,0,0,0.4);
position:absolute;
left:0;
top:0;
display: none;
z-index: 3;
}
#right{
width:400px;
height:300px;
position:absolute;
left:400px;
top:0;
overflow:hidden;
border:1px solid #000;
z-index: 3;
display: none;
}
#right img{
position:absolute;
}
</style> 内容及js部分
<div id="left">
<div id="float"></div>
<img src="macbook-small.jpg" id="smallImg"/>
</div>
<div id="right">
<img src="macbook-big.jpg" id="bigImg"/>
</div>
<script>
//获取元素
var oleft=document.getElementById('left');
var oright=document.getElementById('right');
var float=document.getElementById('float');
var smallImg=document.getElementById('smallImg');
var bigImg=document.getElementById('bigImg');
//1.鼠标移入移出事件
oleft.onmouseover=function () {
float.style.display='block';
oright.style.display='block';
}
oleft.onmouseout=function () {
float.style.display='none';
oright.style.display='none';
}
//2.鼠标移动
oleft.onmousemove=function (ev) {
//1>获取鼠标当前位置
var e= ev || event;
//2>获取鼠标最大可以移动的距离left
var left=e.clientX-float.offsetWidth/2;
var top=e.clientY-float.offsetHeight/2;
//3>判断是否碰壁
if(left<0){left=0}
if(top<0){top=0}
if(left>oleft.offsetWidth-float.offsetWidth){left=oleft.offsetWidth-float.offsetWidth}
if (top>oleft.offsetHeight-float.offsetHeight) {top=oleft.offsetHeight-float.offsetHeight}
//4>设置悬浮块的位置
float.style.left=left+'px';
float.style.top=top+'px';
// 5>求比例 (分两步 => 1.求左右两边的宽高比例 2.求左右移动的距离比例)
var scaleW=smallImg.offsetWidth/float.offsetWidth;
var scaleH=smallImg.offsetHeight/float.offsetHeight;
bigImg.style.width=scaleW*oright.offsetWidth+'px';
bigImg.style.height=scaleH*oright.offsetHeight+'px'; //(右边能够走的距离 = (大图的宽高-div的宽高)*左边移动的比例) 注释:左边向下,右边得向上 ,故要取反
var scaleL=left/(oleft.offsetWidth-float.offsetWidth);
var scaleT=top/(oleft.offsetHeight-float.offsetHeight);
bigImg.style.left=-scaleL*(bigImg.offsetWidth-oright.offsetWidth)+"px";
bigImg.style.top=-scaleT*(bigImg.offsetHeight-oright.offsetHeight)+"px";
}
</script> 总结一下:这部分主要是要考虑比例关系,所以要写之前最好先画图。想清楚两者之前的关系,计算得出比例。本博主下次会退出一个淘宝的放大镜效果图,其属性跟这个实现方式差不多,所以如有需要,可以参考一下.
javascript案例之放大镜效果的更多相关文章
- 原生javascript实现图片放大镜效果
当我们在电商网站上购买商品时,经常会看到这样一种效果,当我们把鼠标放到我们浏览的商品图片上时,会出现类似放大镜一样的一定区域的放大效果,方便消费者观察商品.今天我对这一技术,进行简单实现,实现图片放大 ...
- javascript html 鼠标放大镜效果
1.鼠标放大镜效果 鼠标放大镜效果,将鼠标移入到左图片,则可以在其右边看到放大的图片,且鼠标移动滑块的大小即为右图显示图片.实际效果如下图所示: <!DOCTYPE html> < ...
- 【JavaScript】放大镜效果
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- JavaScript之放大镜效果2
在放大图片效果的同时,我们怎么原图和放大窗体增加间隔呢? 我们只需应用一个table就行了: 源码上: <!DOCTYPE html PUBLIC "-//W3C//DTD HTML ...
- JavaScript之放大镜效果
在网上也浏览过许多关于JavaScript放大镜效果的文章,有的代码解释得些隐晦难懂,看的我头有点晕晕的╮(╯﹏╰)╭,我的心情是这样的: 吐槽完了,我们动动小鼠标,当鼠标经过下面这张美女图片时就实现 ...
- 从零开始学习前端JAVASCRIPT — 11、JavaScript运动模型及轮播图效果、放大镜效果、自适应瀑布流
未完待续...... 一.运动原理 通过连续不断的改变物体的位置,而发生移动变化. 使用setInterval实现. 匀速运动:速度值一直保持不变. 多物体同时运动:将定时器绑设置为对象的一个属性. ...
- javascript图片放大镜效果展示
javascript图片放大镜效果展示 <!DOCTYPE html> <html> <head lang="en"> <meta cha ...
- JavaScript仿淘宝实现放大镜效果的实例
我们都知道放大镜效果一般都是用于一些商城中的,列如每当我们打开淘宝,天猫等pc端时,看到心仪的物品时,点击图片时,便呈现出放大镜的效果.在没有去理解分析它的原理时,感觉非常的神奇,当真正地去接触,也是 ...
- JavaScript图形实例:图形放大镜效果
1. 基本四瓣花型图案 根据四瓣花卉线的参数方程: t= r*(1+sin(12*θ)/5)*(0.5+sin(4*θ)/2); x=t*cos(θ)); y=t*sin(θ)); 编写如下的HTML ...
随机推荐
- 零元学Expression Blend 4 - Chapter 7 什麽?影片不再是印象中的方框框!!!看Blend 4如何把影片镶入字里
原文:零元学Expression Blend 4 - Chapter 7 什麽?影片不再是印象中的方框框!!!看Blend 4如何把影片镶入字里 本章将教大家如何在Blend 4里新增Media El ...
- RedHat 7.3 修改ASM磁盘绑定路径
RedHat 7中,很多命令发生了改变,绑定磁盘不再是start_udev,而是udevadm,具体绑定方式,请看另一篇博文: http://www.cnblogs.com/zx3212/p/6757 ...
- DELPHI XE2 采用 JSON 的方式来序列化对象
DELPHI XE2 采用 JSON 的方式来序列化对象 以下代码测试通过.问题是里面的中文,在反序列化后是乱码. 1. 序列化对象为字符串,Subject 里面的中文看起来正常,仍然是中文: 2. ...
- 自定义QT窗口部件外观之QStyle
自定义QT窗口部件外观 重新定义Qt内置窗口部件的外观常用的方法有两种:一是通过子类化QStyle 类或者预定义的一个样式,例如QWindowStyle,来定制应用程序的观感:二是使用Qt样式表. Q ...
- QAbstractItemView为截断的项显示ToolTip(使用事件过滤)
在Qt中想要为QAbstractItemView中长度不够而使得内容被截断的项显示ToolTip,Qt官网有一篇文章介绍使用事件过滤器来显示太长的项,但是没有涵盖图标的情况.显示列头项太长的情况等等, ...
- Delphi中 TStringList 的详细用法 good
TStringList 类是在Delphi使用最厂的一个对像,我们这里一起来看看 TStringList 的详细用法. 先把要讨论的几个属性列出来:1.CommaText2.Delimiter &am ...
- 以太网,IP,TCP,UDP数据包分析(此文言简意赅,一遍看不懂的话,耐心的看个10遍就懂了,感谢作者无私奉献)
1.ISO开放系统有以下几层: 7 应用层 6 表示层 5 会话层 4 传输层 3 网络层 2 数据链路层 1 物理层 2.TCP/IP 网络协议栈分为应用层(Application).传输层(Tra ...
- 【工具】Axure 8.0 序列号
之前用的 Axure 8.0 到期最近了,重找了一个序列号,发现可用,记录一下,分享如下: 授权人:University of Science and Technology of China (CLA ...
- java集合框架collection(2)ArrayList和LinkedList
ArrayList是基于动态数组实现的list,而LinkedList是基于链表实现的list.所以,ArrayList拥有着数组的特性,LinkedList拥有着链表的特性. 优缺点 ArrayLi ...
- sqlserver/mysql按天,按小时,按分钟统计连续时间段数据
文 | 子龙 有技术,有干货,有故事的斜杠青年 一,写在前面的话 最近公司需要按天,按小时查看数据,可以直观的看到时间段的数据峰值.接到需求,就开始疯狂百度搜索,但是搜索到的资料有很多都不清楚,需要自 ...