如何用CSS3/SCSS实现图片画廊的缩放+文本显示双过渡效果
实现悬停缩放+显示隐藏文本的图片画廊(纯CSS/SCSS)
没问题,咱们完全可以用CSS3或者SCSS实现你要的效果——默认只显示图片,鼠标悬停时图片缩放,同时触发隐藏文本的显示。我把两个功能整合好了,直接看代码和关键细节:
完整实现代码
HTML结构
首先调整每个画廊项的结构,让每个容器同时包含图片和文本元素:
<div class="div-table"> <div class="image-item"> <img src="https://placeimg.com/400/400/nature" /> <div class="item-text">自然风景</div> </div> <div class="image-item"> <img src="https://placeimg.com/400/400/people" /> <div class="item-text">人像摄影</div> </div> <div class="image-item"> <img src="https://placeimg.com/400/400/architecture" /> <div class="item-text">建筑美学</div> </div> <div class="image-item"> <img src="https://placeimg.com/400/400/animals" /> <div class="item-text">萌宠日常</div> </div> <div class="image-item"> <img src="https://placeimg.com/400/400/animals" /> <div class="item-text">野生动物</div> </div> <div class="image-item"> <img src="https://placeimg.com/400/400/sepia" /> <div class="item-text">复古色调</div> </div> <div class="image-item"> <img src="https://placeimg.com/400/400/grayscale" /> <div class="item-text">黑白质感</div> </div> <div class="image-item"> <img src="https://placeimg.com/400/400/tech" /> <div class="item-text">科技元素</div> </div> </div>
CSS实现(兼容普通CSS)
.div-table { display: flex; flex-wrap: wrap; width: 400px; /* 给画廊加相对定位,防止缩放图片溢出乱跑 */ position: relative; overflow: visible; } .image-item { flex: 0 0 100px; height: 100px; cursor: pointer; transition: 1s transform; /* 关键:给文本提供定位上下文 */ position: relative; /* 隐藏文本溢出,避免默认状态下文本露出来 */ overflow: hidden; } .image-item img { width: 100%; height: 100%; object-fit: cover; /* 保证图片比例正确,不会拉伸 */ } /* 隐藏文本的默认样式 */ .item-text { position: absolute; bottom: 0; left: 0; right: 0; padding: 8px; background-color: rgba(0,0,0,0.7); color: white; text-align: center; /* 初始隐藏:透明度0+向下偏移,配合过渡更自然 */ opacity: 0; transform: translateY(100%); transition: opacity 0.3s ease 0.7s, transform 0.3s ease 0.7s; /* 延迟0.7s触发,等图片缩放完成后再显示文本 */ } /* 悬停时的效果 */ .image-item:hover { z-index: 2; transform: scale(2, 2); } .image-item:hover .item-text { opacity: 1; transform: translateY(0); } /* 保留你原来的缩放原点设置,确保每个图片从正确位置放大 */ .image-item:nth-child(1) { transform-origin: 0 0; } .image-item:nth-child(2) { transform-origin: 33.3% 0; } .image-item:nth-child(3) { transform-origin: 66.6% 0; } .image-item:nth-child(4) { transform-origin: 100% 0; } .image-item:nth-child(5) { transform-origin: 0 33.3%; } .image-item:nth-child(6) { transform-origin: 33.3% 33.3%; } .image-item:nth-child(7) { transform-origin: 66.6% 33.3%; } .image-item:nth-child(8) { transform-origin: 100% 33.3%; }
SCSS简化版本(更高效)
如果用SCSS,我们可以用循环自动设置所有item的transform-origin,不用重复写:
.div-table { display: flex; flex-wrap: wrap; width: 400px; position: relative; overflow: visible; } .image-item { flex: 0 0 100px; height: 100px; cursor: pointer; transition: 1s transform; position: relative; overflow: hidden; img { width: 100%; height: 100%; object-fit: cover; } .item-text { position: absolute; bottom: 0; left: 0; right: 0; padding: 8px; background-color: rgba(0,0,0,0.7); color: white; text-align: center; opacity: 0; transform: translateY(100%); transition: opacity 0.3s ease 0.7s, transform 0.3s ease 0.7s; } &:hover { z-index: 2; transform: scale(2, 2); .item-text { opacity: 1; transform: translateY(0); } } } // 用循环自动设置每个item的缩放原点 @for $i from 1 through 8 { $row: floor(($i - 1) / 4); // 计算当前行(0-1) $col: ($i - 1) % 4; // 计算当前列(0-3) $originX: $col * 33.3%; $originY: $row * 33.3%; .image-item:nth-child(#{$i}) { transform-origin: #{$originX} #{$originY}; } }
关键细节解释
- 结构调整:每个
.image-item作为图片和文本的容器,用position: relative让文本可以绝对定位在图片上方 - 文本延迟显示:给文本的过渡加了
0.7s延迟,刚好等图片1s的缩放动画接近完成时再滑入,符合你要的“缩放完成后显示文本”的需求 - 过渡联动:把图片的缩放和文本的显示动画都绑定在
.image-item:hover上,保证悬停时两个效果同步触发 - 图片适配:加了
object-fit: cover确保图片在容器内不会拉伸变形,保持美观 - 层级控制:悬停时给
.image-item加z-index:2,让放大的图片覆盖在其他图片上方
内容的提问来源于stack exchange,提问作者airsoftsoldrecn9
相关产品推荐
相关产品推荐

