CSS:图片放大效果(类似淘宝商品)

效果:

前提:准备两张图片,一大一小,原理就是跟随鼠标打开指定位置的图片,注释详细。

代码:

<!doctype html>
<html lang="en">

	<head>
		<meta charset="UTF-8">
		<meta name="Generator" content="EditPlus®">
		<meta name="Author" content="">
		<meta name="Keywords" content="">
		<meta name="Description" content="">
		<title>图片放大展示</title>
		<style type="text/css">
			* {
				margin: 0;
				padding: 0;
			}
			
			#show_bigger_pic {
				position: absolute;
				width: 500px;
				height: 400px;
				top: 200px;
				left: 200px;
			}
			
			.small_pic_div {
				width: 240px;
				height: 240px;
				border: 1px solid;
				float: left;
				position: relative;
				/*  cover:absolute定位使用*/
			}
			
			.big_pic_div {
				width: 240px;
				height: 240px;
				border: 1px solid;
				float: left;
				margin-left: 10px;
				display: none;
				overflow: hidden;
			}
			
			.big_pic_div>img {
				position: relative;
			}
			
			.cover {
				width: 240px;
				height: 240px;
				position: absolute;
				border: 1px solid;
				z-index: 2;
				left: 0;
				top: 0;
			}
			
			.float_span {
				width: 165px;
				height: 165px;
				position: absolute;
				z-index: 1;
				background: #B2DFEE;
				opacity: 0.5;
				display: none;
				border: 1px solid;
				left: 0;
				top: 0;
			}
		</style>
		<script type="text/javascript">
			function gbc(tparent, tclass) { //获取指定父元素的指定类的子元素的函数
				var allclass = tparent.getElementsByTagName('*');
				var result = [];
				for(var i = 0; i < allclass.length; i++) {
					if(allclass[i].className == tclass)
						result.push(allclass[i]);
				}
				return result; //返回的是数组
			}
			window.onload = function() {
				var sbp = document.getElementById('show_bigger_pic'); //获取最外层div
				var c = gbc(sbp, 'cover')[0]; //获取cover层
				var fs = gbc(sbp, 'float_span')[0]; //获取浮动层
				var spd = gbc(sbp, 'small_pic_div')[0]; //获取小图div
				var sp = spd.getElementsByTagName('img')[0]; //获取小图
				var bpd = gbc(sbp, 'big_pic_div')[0]; //获取大图div
				var bp = bpd.getElementsByTagName('img')[0]; //获取大图
				var spw; //比例计算暂存参数变量
				var sph;
				var bpw;
				var bph;
				var btn = true; //开关,因参数只需获取一次 
				c.onmouseover = function() { //鼠标移入小图
					fs.style.display = "block";
					bpd.style.display = "block";
					c.style.cursor = "pointer";
					if(btn) { //获取大小图片的参数以便浮动层大小的计算,仅获取一次即可
						spw = sp.offsetWidth;
						sph = sp.offsetHeight;
						bpw = bp.offsetWidth;
						bpw = bp.offsetHeight;
						spdw = spd.offsetWidth;
						spdh = spd.offsetHeight;
						var fsw = Math.ceil(spw / bpw * spdw); //比例计算
						var fsh = Math.ceil(sph / bph * spdh);
						fs.style.width = fsw + 'px'; //浮动层大小设置,以便使左图浮动层遮盖符合右边放大区
						fs.style.height = fsh + 'px';
						btn = false; //获取完关闭开关
					}
				};
				c.onmouseout = function() { //鼠标移出
					fs.style.display = "none";
					bpd.style.display = "none";
				};
				c.onmousemove = function(ev) { //鼠标移动
					var pos = ev || event;
					var left = pos.clientX - sbp.offsetLeft - fs.offsetWidth / 2; //计算left
					var top = pos.clientY - sbp.offsetTop - fs.offsetHeight / 2; //计算top
					//  document.title=left+" "+top+" "+pos.clientX+" "+sbp.offsetLeft+" "+fs.offsetWidth/2;
					if(left < 0) {
						left = 0; //当小于0强制固定
					} else if(left > c.offsetWidth - fs.offsetWidth) { //大于某一参数也固定,以防浮动层移出图片区
						left = c.offsetWidth - fs.offsetWidth;
					}
					if(top < 0) {
						top = 0;
					} else if(top > c.offsetHeight - fs.offsetHeight) {
						top = c.offsetHeight - fs.offsetHeight;
					}
					fs.style.left = left + "px"; //浮动层位置改变
					fs.style.top = top + 'px';
					var percentX = left / c.offsetWidth; //比例计算
					var percentY = top / c.offsetHeight;
					bp.style.left = -percentX * (bp.offsetWidth) + "px"; //右边大图位置的改变,表现在实际中是放大区改变
					bp.style.top = -percentY * (bp.offsetHeight) + "px";
				}
			}
		</script>
	</head>

	<body>
		<div id="show_bigger_pic">
			<span class="cover"></span>
			<span class="float_span"></span>
			<div class="small_pic_div">
				<img src="img/small.jpg" alt="" />
			</div>
			<div class="big_pic_div">
				<img src="img/big.jpg" alt="" />
			</div>
		</div>
	</body>

</html>

猜你喜欢

转载自blog.csdn.net/qq_42192693/article/details/88082173