淘宝放大镜demo

淘宝放大镜:

分析:

    有三个元素, 左边的元素内部有一张小的背景图片, 内部有一个镜片元素, 与其相对应的右边有一个存放大图片的盒子。

交互:

    首先让镜片和大盒子天生隐藏,

    当鼠标进去小图片元素的时候, 要让镜片和大图片元素出现。

    移动鼠标时候,让镜片元素跟随移动。

    鼠标位置和镜片的关系是什么?

    鼠标位置- 镜片的宽度/高度的一半,可以让鼠标位于镜片的中点位置。

    获取鼠标的位置也就获取了镜片定位值。

    赋值给镜片元素定位值。

    进行镜片元素的边界限定。

    根据镜片元素移动的位置,按照比例移动大图片的背景定位值即可。


1. 简易放大镜

    没有淘宝放大镜的一些交互功能,比如刚开始只有小图一张,鼠标移入小图产生镜片和放大的大图,可以在小图中随意动,大图跟随小图的位置进行放大操作。


<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
	<style type="text/css">
		* {
			margin: 0;
			padding: 0;
		}
		#box {
			position: absolute;
			width: 400px;
			height: 400px;
			top: 200px;
			left: 100px;
			border: 1px solid red;
			background-image: url("images/small.jpg");
			background-size: cover;
		}
		#glass {
			position: absolute;
			width: 200px;
			height: 200px;
			top: 0;
			left: 0;
			background-color: rgba(0, 0, 200, .4);
		}	
		#box1 {
			position: absolute;
			left: 550px;
			top: 200px;
			width: 400px;
			height: 400px;
			background-image: url("images/big.jpg");
		}
	</style>
</head>
<body>
	<div id="box">
		<div id="glass"></div>
	</div>
	<div id="box1"></div>
	<script type="text/javascript">
		// 获取元素
		var box = document.getElementById("box");
		var glass = document.getElementById("glass");
		var box1 = document.getElementById("box1");

		// 添加事件
		glass.onmousedown = function(e) {
			// 获取鼠标的按下的位置
			var mouse_x = e.clientX;
			var mouse_y = e.clientY;
			// 获取glass的定位值
			var left = glass.offsetLeft;
			var top = glass.offsetTop;
			// 添加鼠标移动事件
			document.onmousemove = function(e) {
				// 获取鼠标移动后的距离
				var m_x = e.clientX;
				var m_y = e.clientY;
				// 进行边界限定
				var resultX = m_x - mouse_x + left;
				var resultY = m_y - mouse_y + top
				// 左右距离判定
				if (resultX < 0) {
					resultX = 0
				} else if (resultX > box.clientWidth - glass.clientWidth) {
					resultX = box.clientWidth - glass.clientWidth
				}
				// 上下距离判定
				if (resultY < 0) {
					resultY = 0
				} else if (resultY > box.clientHeight - glass.clientHeight) {
					resultY = box.clientHeight - glass.clientHeight
				}
				// 改变元素的定位值
				glass.style.left = resultX + "px";
				glass.style.top = resultY + "px";
				// 改变大图片背景定位值
				box1.style.backgroundPosition = - 2 * resultX + "px " + - 2 * resultY + "px";
			}
		}
		// 取消鼠标移动事件
		document.onmouseup = function() {
			document.onmousemove = null;
		}
	</script>
</body>
</html>

2. 淘宝放大镜

    刚开始只有小图一张,鼠标移入小图产生镜片和放大的大图,可以在小图中随意动,大图跟随小图的位置进行放大操作

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
	<style type="text/css">
		* {
			margin: 0;
			padding: 0;
		}
		#box {
			position: absolute;
			width: 400px;
			height: 400px;
			top: 200px;
			left: 100px;
			border: 1px solid red;
			background-image: url("images/small.jpg");
			background-size: cover;
		}
		#glass {
			position: absolute;
			width: 200px;
			height: 200px;
			top: 0;
			left: 0;
			background-color: rgba(0, 0, 200, .4);
			display: none;
		}	
		#box1 {
			position: absolute;
			left: 550px;
			top: 200px;
			width: 400px;
			height: 400px;
			background-image: url("images/big.jpg");
			display: none;
		}
	</style>
</head>
<body>
	<div id="box">
		<div id="glass"></div>
	</div>
	<div id="box1"></div>
	<script type="text/javascript">
		// 获取元素
		var box = document.getElementById("box");
		var glass = document.getElementById("glass");
		var box1 = document.getElementById("box1");

		// 当鼠标进入小图片的时候,要让镜片和大图片出现
		box.onmouseenter = function() {
			glass.style.display = "block";
			box1.style.display = "block";
		}
		// 当鼠标进入小图片的时候,要让镜片和大图片消失
		box.onmouseleave = function() {
			glass.style.display = "none";
			box1.style.display = "none";
		}

		// 获取元素到页面的距离
		var box_style = offset(box);
		var box_left = box_style.left;
		var box_top = box_style.top;
		// 在box里面鼠标移动,要让镜片跟随鼠标移动
		box.onmousemove = function(e) {
			// 获取鼠标到页面的距离
			var p_x = e.pageX;
			var p_y = e.pageY;
			// 获取鼠标移动的位置
			var x = p_x - box_left;
			var y = p_y - box_top;
			// 定义移动距离
			var resultX = x - glass.clientWidth / 2;
			var resultY = y - glass.clientHeight / 2;

			// 判定边界
			if (resultX < 0) {
				resultX = 0
			} else if (resultX > box.clientWidth - glass.clientWidth) {
				resultX = box.clientWidth - glass.clientWidth
			}
			// 边界判定
			if (resultY < 0) {
				resultY = 0
			} else if (resultY > box.clientHeight - glass.clientHeight) {
				resultY = box.clientHeight - glass.clientHeight
			}
			// 暂时定义元素的定位值
			glass.style.left = resultX + "px";
			glass.style.top = resultY + "px";
			// 改变大图片的背景定位值
			box1.style.backgroundPosition = - 2 * resultX + "px " + - 2 * resultY + "px";
		}
		function offset(dom) {
			// 定义信号量
			var isIE8 = false;
			// 定义浏览器信息
			var str = window.navigator.userAgent;
			// 检测浏览器
			if (str.indexOf("MSIE 8.0") === -1) {
				// console.log("不是IE8")
				isIE8 = false;
			} else {
				// console.log("是IE8")
			 	 isIE8 = true;
			}
			// for (; dom != document.body; dom = offsetParent)
			
			// 定义对象
			var result = {
				left: dom.offsetLeft,
				top: dom.offsetTop
			}
			// 使用while循环
			while (dom != document.body) {
				// 获取定位父元素
				dom = dom.offsetParent;
				// 判定
				if (isIE8) {
					// 说明是IE8 不需要额外加上 外边框
					result.left += dom.offsetLeft;
					result.top += dom.offsetTop;
				} else {
					// 不是IE8 所以要加上边框的值
					result.left += dom.offsetLeft + dom.clientLeft;
					result.top += dom.offsetTop + dom.clientTop;
				}
			}
			// 返回对象
			return result;
		}
	</script>
</body>
</html>

3. 兼容IE的淘宝放大镜

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
	<style type="text/css">
		* {
			margin: 0;
			padding: 0;
		}
		#box {
			position: absolute;
			width: 400px;
			height: 400px;
			top: 200px;
			left: 100px;
			border: 1px solid red;
			background-image: url("images/small.jpg");
			background-size: cover;
		}
		#glass {
			position: absolute;
			width: 200px;
			height: 200px;
			top: 0;
			left: 0;
			background: rgb(0, 0, 200);
			filter: alpha(opacity=50);
			background-color: rgba(0, 0, 200, .4);
			display: none;
		}	
		#box1 {
			position: absolute;
			left: 550px;
			top: 200px;
			width: 400px;
			height: 400px;
			background-image: url("images/big.jpg");
			display: none;
		}
		img {
			width: 100%;
			height: 100%;
		}
	</style>
</head>
<body>
	<div id="box">
		<img src="images/small.jpg "alt="">
		<div id="glass"></div>
	</div>
	<div id="box1"></div>
	<script type="text/javascript" src="js/offset.js"></script>
	<script type="text/javascript">
		// 获取元素
		var box = document.getElementById("box");
		var glass = document.getElementById("glass");
		var box1 = document.getElementById("box1");

		// 当鼠标进入小图片的时候,要让镜片和大图片出现
		box.onmouseenter = function() {
			glass.style.display = "block";
			box1.style.display = "block";
		}
		// 当鼠标进入小图片的时候,要让镜片和大图片消失
		box.onmouseleave = function() {
			glass.style.display = "none";
			box1.style.display = "none";
		}

		// 获取元素到页面的距离
		var box_style = offset(box);
		var box_left = box_style.left;
		var box_top = box_style.top;
		// 在box里面鼠标移动,要让镜片跟随鼠标移动
		box.onmousemove = function(e) {
			// 兼容IE
			var e = e || window.event;
			// 获取鼠标到页面的距离
			var p_x = e.clientX;
			var p_y = e.clientY + document.documentElement.scrollTop;
			// 获取鼠标移动的位置
			var x = p_x - box_left;
			var y = p_y - box_top;
			// 定义移动距离
			var resultX = x - glass.clientWidth / 2;
			var resultY = y - glass.clientHeight / 2;

			// 判定边界
			if (resultX < 0) {
				resultX = 0
			} else if (resultX > box.clientWidth - glass.clientWidth) {
				resultX = box.clientWidth - glass.clientWidth
			}
			// 边界判定
			if (resultY < 0) {
				resultY = 0
			} else if (resultY > box.clientHeight - glass.clientHeight) {
				resultY = box.clientHeight - glass.clientHeight
			}
			// 暂时定义元素的定位值
			glass.style.left = resultX + "px";
			glass.style.top = resultY + "px";
			// 改变大图片的背景定位值
			box1.style.backgroundPosition = - 2 * resultX + "px " + - 2 * resultY + "px";
		}
                 function offset(dom) {
			// 定义信号量
			var isIE8 = false;
			// 定义浏览器信息
			var str = window.navigator.userAgent;
			// 检测浏览器
			if (str.indexOf("MSIE 8.0") === -1) {
				// console.log("不是IE8")
				isIE8 = false;
			} else {
				// console.log("是IE8")
			 	 isIE8 = true;
			}
			// for (; dom != document.body; dom = offsetParent)
			
			// 定义对象
			var result = {
				left: dom.offsetLeft,
				top: dom.offsetTop
			}
			// 使用while循环
			while (dom != document.body) {
				// 获取定位父元素
				dom = dom.offsetParent;
				// 判定
				if (isIE8) {
					// 说明是IE8 不需要额外加上 外边框
					result.left += dom.offsetLeft;
					result.top += dom.offsetTop;
				} else {
					// 不是IE8 所以要加上边框的值
					result.left += dom.offsetLeft + dom.clientLeft;
					result.top += dom.offsetTop + dom.clientTop;
				}
			}
			// 返回对象
			return result;
		}
</script></body></html>

IE兼容性:

    获取body、html:

        dom中 document.body 获取的是body

        dom中  document.documentElement  获取的是html

    页面卷动值:

        document.documentElement.scrollTop 火狐、IE新版本的chrome 都支持

        document.body.scrollTop 其他浏览器和旧版本的chrome支持

    IE中的透明度:

        filter: alpha(opacity=[0-100])

    高级浏览器中的透明度:

        opacity:[0-1]




  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值