资讯专栏INFORMATION COLUMN

仿淘宝的放大镜效果

wuyangnju / 1934人阅读

摘要:本次文章的主要内容是介绍一下淘宝的放大镜效果是如何实现的,相信很多同学们对这个并不陌生。这个看似感觉很复杂的小功能,实际上原理却是非常的简单,下面我们学习一下淘宝放大镜效果是如何实现的。

前言

这一段时间事情挺多的,一直没有时间写文章。这两天稍微闲了一些,就趁这会闲工夫写一篇文章。本次文章的主要内容是介绍一下淘宝的放大镜效果是如何实现的,相信很多同学们对这个并不陌生。这个看似感觉很复杂的小功能,实际上原理却是非常的简单,下面我们学习一下淘宝放大镜效果是如何实现的。

实现过程 项目结构

我们整个项目结构并不复杂,由images目录、jquery-3.2.1.min.js、style.css、main.js、index.html等内容构成。

images目录。存放项目所使用的图片素材。

jquery-3.2.1.min.js。jQuery库(如果你想熟悉一下原生JS,可不选)。

style.css。控制项目css样式文件。

main.js。控制项目逻辑的js文件。

index.html。控制项目dom结构。

素材 小图(small.jpg)

原图(big.jpg)

放大镜背景图(mask_bg.jpg)

实现原理

放大镜 == 100*100橘色方块 简称:方块1

左窗口 == 200*200蓝色方块 简称:方块2

右窗口 == 200*200紫色方块 简称:方块3

原图 == 400*400青色方块 简称:方块4

大致原理如下:
用一个表达式就是:方块1的left值(或top值)/方块4的left值(或top值)=(-1)*方块2的宽度/方块4的宽度。这里我们需要注意的是方块1的定位父级是方块2,方块4的定位父级是方块3。另外小图的长宽与左窗口的长宽保持一致。我们等比例地根据方块1的top值和left值去修改方块4的top值和left值,并且方块超出部分不可见,就可以实现放大镜效果。

文件内容 HTML

</>复制代码

  1. 仿淘宝放大镜效果

.mask 代表 放大镜

.leftView 代表 左窗口

.rightView 代表 右窗口

.bigImg 代表 原图

CSS

</>复制代码

  1. #container{
  2. position: relative;
  3. }
  4. .leftView{
  5. position: relative;
  6. width: 418px;
  7. height: 418px;
  8. }
  9. .smallImg{
  10. max-height: 100%;
  11. max-width: 100%;
  12. }
  13. .mask{
  14. display: none;
  15. position: absolute;
  16. background: url(./images/mask_bg.png);
  17. cursor: move;
  18. }
  19. .rightView{
  20. position: absolute;
  21. left:458px;
  22. top:0;
  23. width:418px;
  24. height:418px;
  25. overflow:hidden;
  26. }
  27. .bigImg{
  28. position: absolute;
  29. top:0;
  30. left:0;
  31. }
JS各模块实现 计算放大镜的长宽

这里说明一下我们为什么要动态计算放大镜的长宽,主要原因是原图的长宽是不确定的。但是我们要满足放大镜/右窗口=左窗口/原图,这里左窗口和右窗口的长宽是确定的,所以放大镜的长宽是需要根据原图的长宽进行计算。

</>复制代码

  1. function calculateMaskWH(){
  2. var width=$(".leftView").width()/$(".bigImg").width()*$(".rightView").width();
  3. var height=$(".leftView").height()/$(".bigImg").height()*$(".rightView").height();
  4. $(".mask").css({
  5. "width":width,
  6. "height":height
  7. });
  8. }
监听左窗口mouseover和mouseout事件

在鼠标没有悬浮在左窗口时,放大镜、右窗口和原图是不可见的。当鼠标悬浮在左窗口之上时,放大镜、右窗口和原图是可见的。

</>复制代码

  1. //监听鼠标mouseover事件
  2. $(".leftView").on("mouseover",function(){
  3. $(".mask").css("display","block");
  4. $(".rightView").css("display","block");
  5. });
  6. //监听鼠标mouseout事件
  7. $(".leftView").on("mouseout",function(){
  8. $(".mask").css("display","none");
  9. $(".rightView").css("display","none");
  10. });
监听左窗口mousemove事件

监听mousemove事件,我们需要干两件事。第一件事,动态改变放大镜的top值和left值。第二件事是根据放大镜的top值和left值,等比例修改原图的top值和left值。因此我们这里的难点就是如何计算top值和left值。另外,我们要保证放大镜不能出界。

</>复制代码

  1. $(".leftView").on("mousemove",function(event){
  2. //计算放大镜的left值和top值
  3. var left=event.pageX-$(this).offset().left-$(".mask").width()/2;
  4. var top=event.pageY-$(this).offset().top-$(".mask").height()/2;
  5. //判断放大镜左右是否出界
  6. if(left<0){
  7. left=0
  8. }else if(left>$(this).width()-$(".mask").width()){
  9. left=$(this).width()-$(".mask").width();
  10. }
  11. //判断放大镜上下是否出现
  12. if(top<0){
  13. top=0;
  14. }else if(top>$(this).height()-$(".mask").height()){
  15. top=$(this).height()-$(".mask").height();
  16. }
  17. $(".mask").css({
  18. left:left+"px",
  19. top:top+"px"
  20. });
  21. //计算比例
  22. var rate=$(".bigImg").width()/$(".leftView").width();
  23. $(".bigImg").css({
  24. left:-rate*left+"px",
  25. top:-rate*top+"px"
  26. });
  27. });
JS完整代码

</>复制代码

  1. $(function(){
  2. //计算放大镜的长宽
  3. calculateMaskWH();
  4. //监听鼠标mouseover事件
  5. $(".leftView").on("mouseover",function(){
  6. $(".mask").css("display","block");
  7. $(".rightView").css("display","block");
  8. });
  9. //监听鼠标mouseout事件
  10. $(".leftView").on("mouseout",function(){
  11. $(".mask").css("display","none");
  12. $(".rightView").css("display","none");
  13. });
  14. $(".leftView").on("mousemove",function(event){
  15. //计算放大镜的left值和top值
  16. var left=event.pageX-$(this).offset().left-$(".mask").width()/2;
  17. var top=event.pageY-$(this).offset().top-$(".mask").height()/2;
  18. //判断放大镜左右是否出界
  19. if(left<0){
  20. left=0
  21. }else if(left>$(this).width()-$(".mask").width()){
  22. left=$(this).width()-$(".mask").width();
  23. }
  24. //判断放大镜上下是否出现
  25. if(top<0){
  26. top=0;
  27. }else if(top>$(this).height()-$(".mask").height()){
  28. top=$(this).height()-$(".mask").height();
  29. }
  30. $(".mask").css({
  31. left:left+"px",
  32. top:top+"px"
  33. });
  34. //计算比例
  35. var rate=$(".bigImg").width()/$(".leftView").width();
  36. $(".bigImg").css({
  37. left:-rate*left+"px",
  38. top:-rate*top+"px"
  39. });
  40. });
  41. //计算机放大镜的长宽
  42. function calculateMaskWH(){
  43. var width=$(".leftView").width()/$(".bigImg").width()*$(".rightView").width();
  44. var height=$(".leftView").height()/$(".bigImg").height()*$(".rightView").height();
  45. $(".mask").css({
  46. "width":width,
  47. "height":height
  48. });
  49. }
  50. });
最终效果演示

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/84242.html

相关文章

发表评论

0条评论

最新活动
阅读需要支付1元查看
<