zoukankan      html  css  js  c++  java
  • js---电商中常见的放大镜效果

    js中的放大镜效果

    在电商中,放大镜效果是很常见的,如下图所示:

    当鼠标悬浮时,遮罩所在区域在右侧进行放大。
    在动手写之前,我们要先理清思路,分析需求,所需知识点,再将每一块进行组装,最后进行功能的完善。

    首先,需求分析:

    • 打开页面是看到只有一张图片
    • 鼠标悬浮在图片上上时遮罩和右侧图片显示出来
    • 遮罩随着鼠标的移动而移动
    • 右侧图片随着遮罩的移动而移动

    其实,想此类两个图片在不同位置,一般都是多图片进行配合运动形成的效果。
    本案例中左侧使用的是小图片,右侧使用的是大图片。

    所需知识点:

    • 元素的隐藏和显示 display:none / block
    • 右侧大图片只有部分显示,所有需要溢出隐藏 overflow:hidden
    • 遮罩和大图片需要移动,所有要用到定位。position : absolute;

    下面我们来写代码:

    <!DOCTYPE html>
    <html lang="zh">
    <head>
    	<title>放大镜</title>
    	<style>
    		/* 预定义样式 */
    		*{
    			padding: 0;
    			margin: 0;
    		}
    		/* 处理容器 */
    		#box{
    			margin: 100px 200px;
    		}
    		#box,#d_small{
    			 400px;
    			height: 240px;
    			display: inline-block;
    			border: 1px sold red;
    			position: relative;	
    		}
    		/* 大图片的容器 */
    		/* 因为遮罩是正方形,所有大图片的显示部分也要是正方形,这样视觉效果才会更好 */
    		#d_big {
    			 240px;
    			height: 240px;
    			position: absolute;
    			top:0;
    			left: 400px;
    			overflow: hidden;
    			display: none;
    			border: 1px solid red;
    		}
    		/* 左侧小图片*/
    		#d_small img{
    			 400px;
    			height: 240px;
    			vertical-align: top;
    		}
    		/* 大图片的尺寸和小图片宽高比例要一直,避免穿帮 */
    		#d_big img{
    			 800px;
    			height: 480px;
    			vertical-align: top;
    			position: absolute;
    			top:0;
    			left:0;
    		}
    		/* 遮罩样式 */
    		#mask{
    			 100px;
    			height: 100px;
    			background-color: rgba(225,225,250,.6);
    			position: absolute;
    			top: 0;
    			left: 0;
    			display: none;
    		}	
    	</style>
    </head>
    <body>
    	<div id="box">
    		<div id="d_small">
    			<img src="img/1.jpg">
    			<div id="mask"></div>
    		</div>
    		<div id="d_big"><img src="img/2.jpg"></div>
    		
    	</div>
    </body>
    </html>
    

    下面来写一下js

    <script>
    	// 获取节点
    	var small = document.getElementById("d_small");	//获取小图片的容器
    	var smallImage = small.children[0];	//获取小图片
    	var mask = small.children[1];	//获取遮罩
    	var big = document.getElementById("d_big");	//获取大图片的容器
    	var bigImage = big.children[0];	//获取大图片
    	// 绑定鼠标事件
    	// 鼠标悬浮在小图片时,让遮罩和大图片显示处理
    	small.onmouseover = function(){
    		mask.style.display = "block";
    		big.style.display = "block";	
    	}
    	// 鼠标移出时再消失
    	small.onmouseout = function(){
    		mask.style.display = "none";
    		big.style.display = "none";	
    	}
    	// 鼠标移动时,遮罩跟着移动,并且大图片跟着以相同比例移动
    	// 绑定鼠标移动事件
    	// Event 是一个事件对象,当一个事件发生后,和当前事件发生相关的详细信息会被临时存储到一个指定的地方,也就是event对象,
    	
    	// 声明一个变量用来储存遮罩的坐标位置
    	var x = 0;
    	var y = 0;
    	small.onmousemove = function(event){
    		// 作兼容
    		var event = event || window.event;
    		
    		// 遮罩中心点X坐标 = 鼠标X坐标 - 定位的父级元素的左偏移量 - 1/2的遮罩的宽度
    		var x = event.clientX - this.offsetParent.offsetLeft - mask.offsetWidth / 2;
    		var y = event.clientY - this.offsetParent.offsetTop - mask.offsetHeight / 2;
    		// console.log(x,y);
    		// 用来判断遮罩达到小图片边界是的状况,以免遮罩移出小图片框
    		if(x < 0){
    			x = 0
    		}else if (x > small.offsetWidth - mask.offsetWidth){
    			x = small.offsetWidth - mask.offsetWidth;
    		};
    		if(y < 0){
    			y = 0
    		}else if (y > small.offsetHeight - mask.offsetHeight){
    			y = small.offsetHeight - mask.offsetHeight;
    		};
    		// 遮罩的动态定位
    		mask.style.left = x + "px";
    		mask.style.top = y + "px";
    		// 设置右侧大图片的移动(大图片的移动 = 大图片与小图片的比例 * 遮罩的移动)
    		// a,b为大图片想做和向上的偏移量
    		var a = -x * bigImage.offsetWidth / smallImage.offsetWidth; 
    		var b = -y * bigImage.offsetHeight / smallImage.offsetHeight; 
    		
    		// 为防止右侧和下侧出现空白区域,进行一个判断
    		if(a < -(bigImage.offsetWidth - big.offsetWidth)){
    			bigImage.style.left =- (bigImage.offsetWidth - big.offsetWidth )+ "px";
    		}else{
    			bigImage.style.left = -x * bigImage.offsetWidth / smallImage.offsetWidth + 'px';
    		}		
    		if(b < -(bigImage.offsetHeight - big.offsetHeight)){
    			bigImage.style.top = -(bigImage.offsetHeight - big.offsetHeight) + "px";
    		}else{
    			bigImage.style.top = -y * bigImage.offsetHeight / smallImage.offsetHeight + 'px';
    		}		
    	}
    
    </script>
    
  • 相关阅读:
    ios input输入不了
    ios遇到的坑
    Linux搭建GitLab并汉化
    在Linux环境下tomcat 指定 jdk或jre版本
    SpringBoot设置默认首页
    解决MariaDB中文乱码
    使用Hexo+GitHub搭建免费个人博客
    Linux上安装node和npm
    Linux配置SSH Key到GitHub
    Linux安装Git
  • 原文地址:https://www.cnblogs.com/hubufen/p/10902843.html
Copyright © 2011-2022 走看看