本文详解如何通过精准的 css 选择器、层级控制(z-index)和定位优化,实现父元素悬停时子元素(如图片缩放 + 播放图标淡入)同步触发且互不干扰的多动画效果。
本文详解如何通过精准的 css 选择器、层级控制(z-index)和定位优化,实现父元素悬停时子元素(如图片缩放 + 播放图标淡入)同步触发且互不干扰的多动画效果。
在构建响应式视频卡片组件时,常需在用户悬停父容器(如 .item-video-kami)时,同时触发动画效果:图片平滑放大(scale),叠加的播放图标(.play-icon)渐显。但实践中常出现「仅图片动画生效,图标无反应」的问题——根本原因在于:.play-icon 缺少明确的定位上下文与层叠优先级,导致其虽设置了 opacity 过渡,却因被图片遮挡或脱离渲染流而无法正确显示。
补全绝对定位边界
原代码中 .play-icon 仅设 position: absolute,但未定义 top/bottom/left/right,导致其尺寸坍缩、定位失效。修复后添加:
.item-video-kami > .play-icon { top: 0; bottom: 0; left: 0; right: 0; /* 全向撑满父容器 */}
确保图层层级正确
<img> 默认渲染在 <div> 之上。即使 .play-icon opacity 变化,若 z-index 不高于图片,仍会被遮挡。必须显式提升:
.item-video-kami:hover .play-icon { z-index: 2; /* 高于 img(默认 z-index: 1) */}
优化父容器布局上下文
添加 display: inline-block 和 height: 100%,避免因父容器高度塌陷导致子元素定位异常:
.item-video-kami { display: inline-block; height: 100%;}
<style>.item-video-kami { width: 480px; overflow: hidden; position: relative; display: inline-block; height: 100%;}.item-video-kami > .play-icon.full-height > svg { width: 106px; color: #ffffff50;}.item-video-kami img { transition: all .5s ease; display: block; /* 防止底部空白间隙 */}.item-video-kami > .play-icon { position: absolute; top: 0; bottom: 0; left: 0; right: 0; /* 关键:全向定位 */ display: flex; justify-content: center; align-items: center; background-color: #1e1e1e94; opacity: 0; transition: opacity 0.2s ease-in 0.1s; z-index: 1; /* 初始层级低于 hover 后的 z-index:2 */}.item-video-kami:hover img { transform: scale(1.1);}.item-video-kami:hover .play-icon { z-index: 2; /* 确保悬停时位于图片上方 */ opacity: 0.8;}</style><a href="#" class="item-video-kami"> <div class="play-icon full-height"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"> <path d="M4.5 5.653c0-1.427 1.529-2.33 2.779-1.643l11.54 6.347c1.295.712 1.295 2.573 0 3.286L7.28 19.99c-1.25.687-2.779-.217-2.779-1.643V5.653Z"/> </svg> </div> <img src="https://picsum.photos/480/300" alt="Video thumbnail"></a>
通过以上结构化调整,即可稳定实现「单次悬停、多子元素协同动画」的效果,兼顾语义清晰性、视觉一致性与跨浏览器兼容性。