前言
如何实现图片九宫格的效果,如下所示:
1. 具体实现
整体思路:使用一个div的img-container
盒子,里面添加九个img-item
的子盒子。通过给每个子盒子设置背景图片,通过使用 nth-child()
伪类选择器对特定位置的图片进行样式设置,从而控制每个img-item
背景图片的background-position-x
和 background-position-y
属性对背景图片进行水平和垂直方向的定位,实现了图片的拼接效果。
1.1 先给每一个img-item都设置背景图片
css
.img-item {
position: relative;
box-shadow: inset 0 0 0 1px #fff;
transition: 0.5s;
background-size: 300px 300px;
/* background-image: url(https://img1.baidu.com/it/u=3758374993,766184369&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=282); */
}
为了方便理解nth-child
控制的效果,添加背景色理解x、y轴坐标的控制。
1.2 控制x坐标
控制第一列的x坐标:特点是x为0
css
.img-item:nth-child(3n+1) {
left: -20px;
background-position-x: 0;
background-color: blue;
}
控制第二列的x坐标:特点是x为-100,因为背景图需要向左偏移100
css
.img-item:nth-child(3n+2) {
left: 0px;
background-position-x: -100px;
background-color: pink;
}
控制第三列的x坐标:特点是x为-200,因为背景图需要向左偏移200
css
.img-item:nth-child(3n) {
left: 20px;
background-position-x: -200px;
background-color: red;
}
效果:
此时x轴的坐标确定,现在需要确定y的坐标。
1.3 控制y的坐标
y坐标确定,没有办法进行一行的控制,只能进行覆盖操作。具体的是通过img-item
全选设置确定最后一行y坐标,.img-item:nth-child(-n+6)
确定中间一行的y坐标,.img-item:nth-child(-n+3)
确定第一行的y坐标。
确定第三行的y坐标:特点是y为-200,因为背景图需要向下偏移200
css
.img-item {
top: 20px;
background-position-y: -200px;
background-color: blue;
}
确定第二行的y坐标:特点是y为-100,因为背景图需要向下偏100
css
.img-item:nth-child(-n+6) {
top: 0;
background-position-y: -100px;
background-color: pink;
}
确定第一行的y坐标:特点是y为0,因为背景图不需要偏移
css
.img-item:nth-child(-n+3) {
top: -20px;
background-position-y: 0;
background-color: red;
}
效果:
最后添加hover效果:
css
.img-container:hover .img-item {
left: 0;
top: 0;
box-shadow: inset 0 0 0 0 #fff;
}
2. 总结
完整代码:
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<style>
body {
height: 100vh;
display: flex;
align-items: center;
background: #171717;
}
.img-container {
margin: 0 auto;
width: 300px;
height: 300px;
display: grid;
grid-template-columns: repeat(3, 1fr);
}
.img-item {
position: relative;
box-shadow: inset 0 0 0 1px #fff;
transition: 0.5s;
background-size: 300px 300px;
background-image: url(https://img1.baidu.com/it/u=3758374993,766184369&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=282);
}
.img-item:nth-child(3n+1) {
left: -20px;
background-position-x: 0;
}
.img-item:nth-child(3n+2) {
left: 0px;
background-position-x: -100px;
}
.img-item:nth-child(3n) {
left: 20px;
background-position-x: -200px;
}
.img-item {
top: 20px;
background-position-y: -200px;
}
.img-item:nth-child(-n+6) {
top: 0;
background-position-y: -100px;
}
.img-item:nth-child(-n+3) {
top: -20px;
background-position-y: 0;
}
.img-item {
top: 20px;
background-position-y: -200px;
}
.img-container:hover .img-item {
left: 0;
top: 0;
box-shadow: inset 0 0 0 0 #fff;
}
</style>
<body>
<div class="img-container">
<div class="img-item"></div>
<div class="img-item"></div>
<div class="img-item"></div>
<div class="img-item"></div>
<div class="img-item"></div>
<div class="img-item"></div>
<div class="img-item"></div>
<div class="img-item"></div>
<div class="img-item"></div>
</div>
</body>
</html>
就是巧妙通过nth-child
确认背景图的x、y的偏移,从而达到拼接的效果。单纯记录下,如果错误,请指正O^O!