Front-end——jQuery实现照片墙

本案例思路:

大的照片墙上6 X 4陈列着24张照片,通过计算,算出每个照片摆放的位置,具体的照片墙详见如下:

需要计算出的地方有:

  1. 行间距和列间距:row_span = ($("#app").height() - 500) / 3           column_span = ($("#app").width() - 750) / 5
  2. 计算每个图片对应的行坐标和列坐标(计算出在6X4排列中的位置):row_index = i / 6          column_index = i % 6
  3. 计算时一个行距离为:(row_span + 每个照片高度)
  4. 计算时一个列距离为:(column_span + 每个照片宽度)

使用到:

  1. 虚拟DOM:语法:$("html语句"),例如:$("<div></div>")
  2. 虚拟DOM不是实际存在的DOM,为了操作时使用到它,需要将其转换成实际的DOM对象,需要使用appendTo(实体DOM)函数将其加入到实体DOM中
  3. 元素的高度获取:$("#app").height()
  4. 元素的宽度获取:$("#app").width()
  5. 使用CSS()函数设置样式时,若出现特殊符号需要加引号,如 background-size中出现了 '-'
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script type="text/javascript" src="js/jquery.min.js"></script>
		<style>
			*{
				margin: 0;
				padding: 0;
			}
			#app{
				width: 90%;
				height: 90vh;
				border: 2px solid #000000;
				position: absolute;
				top: 5%;
				left: 5%;
			}
			
			#app>div{
				height: 125px;
				width: 125px;
				background: #00FFF0;
				border: 2px solid #FF0000;
				position: absolute;
				top: 0;
				left: 0;
			}
		</style>
	</head>
	
	<body>
		<div id="app"></div>
		<script>
			$(function(){
				for(let i = 0; i < 24; i++){
					//将每个小图设置为绝对定位,计算出每个小图距左和距顶的距离
					const x = parseInt(i / 6)
					const y = i % 6
					
					//计算行间距和列间距
					const row_span = ($("#app").height() -500) / 3
					const column_span = ($("#app").width() - 750) / 5
					
					//计算每个小图的实际位置
					const top = x * (125 + row_span)
					const left = y * (125 + column_span)
					
					$("<div></div>").css({
						top: top + 'px',
						left: left + 'px',
						background: 'url(img/' + (i + 1) +'.jpg)',
						'background-size': '125px 125px'
					}).appendTo($("#app"))
				}
			})
		</script>
	</body>
</html>


在以上基础上,添加图片点击,拆分照片最后合成一张图功能:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script type="text/javascript" src="js/jquery.min.js"></script>
		<style>
			*{
				margin: 0;
				padding: 0;
			}
			#app{
				width: 90%;
				height: 90vh;
				border: 2px solid #000000;
				position: absolute;
				top: 5%;
				left: 5%;
			}
			
			#app>div{
				height: 125px;
				width: 125px;
				background: #00FFF0;
				position: absolute;
				border-radius: 10px;
				transition: 2s;
			}
		</style>
	</head>
	
	<body>
		<div id="app"></div>
		<script>
			$(function(){
				for(let i = 0; i < 24; i++){
					//将每个小图设置为绝对定位,计算出每个小图距左和距顶的距离
					const y = parseInt(i / 6)
					const x = i % 6
					
					//计算行间距和列间距
					const row_span = ($("#app").height() - 500) / 3
					const column_span = ($("#app").width() - 750) / 5
					
					//计算每个小图的实际位置
					const top = y * (125 + row_span)
					const left = x * (125 + column_span)
					
					const r = Math.random() * 30 - 15
					$("<div></div>").css({
						top: top + 'px',
						left: left + 'px',
						background: 'url(img/' + (i + 1) +'.jpg)',
						'background-size': '125px 125px',
						transform: 'scale(0.8) rotate(' + r + 'deg)',
						'box-shadow': '1px 1px 20px #f81aff'
					}).appendTo($("#app"))
					
					//实现点击照片墙中任意一张照片,将照片分成24份分别放到24个小图中,最后合成一张大图
					$("#app>div").click(function(){
						let index = $(this).index()
						/*计算间距
						合成一张图时,就只剩下一个边框,所以上下各一个边框,左右各一个边框
						*/
						top_span = ($("#app").height() - 500) / 2
						left_span = ($("#app").width() - 750) / 2
						
						//给24个小图分别放上一张图的不同部分
						for(let i = 0 ; i < $("#app>div").length; i++){
							const top_index = parseInt(i/6)
							const left_index = i % 6
							$("#app>div").eq(i).css({
								background: 'url(img/' + (index+1) + '.jpg)',
								'box-shadow': '0px 0px 0px 0',
								transform: 'scale(1) rotate(0deg)',
								'border-radius': '0px',
								'background-position': (-125*left_index) + 'px ' + (-125*top_index) + 'px',
								top: (top_span + 125*top_index) + 'px',
								left: (left_span + 125*left_index) + 'px'
							})
						}
					})
				}
			})
		</script>
	</body>
</html>

猜你喜欢

转载自blog.csdn.net/weixin_42067873/article/details/112484115