列表项Hover多边形遮罩与文本定位的前端实现问题及原型
两行列表项Hover多边形遮罩文本效果实现方案
问题背景
需要实现两行排列的6个列表项,要求鼠标hover时显示覆盖在内容上方的多边形遮罩,且遮罩内要放置对应文本。每个列表项的遮罩多边形定位不同,最初的问题是hover效果直接作用在content元素上,无法实现遮罩覆盖上层、遮挡内容并添加文本的需求。
解决方案
核心是给每个列表项新增独立的遮罩元素,通过鼠标事件控制遮罩显示,结合clip-path实现不同的多边形形状,同时在遮罩内嵌入文本:
- 结构层:为每个列表项添加绝对定位的
mask元素,层级高于content,承载遮罩背景和文本 - 样式层:用
clip-path为不同遮罩定义专属多边形路径,默认隐藏遮罩,hover时触发显示 - 交互层:通过CSS hover或JS事件监听,控制遮罩的显示状态
代码示例
HTML结构
<div class="list-grid"> <!-- 第一行3个项 --> <div class="list-item"> <div class="item-content">卡片内容1</div> <div class="item-mask mask-shape-1">遮罩文本1</div> </div> <div class="list-item"> <div class="item-content">卡片内容2</div> <div class="item-mask mask-shape-2">遮罩文本2</div> </div> <div class="list-item"> <div class="item-content">卡片内容3</div> <div class="item-mask mask-shape-3">遮罩文本3</div> </div> <!-- 第二行3个项 --> <div class="list-item"> <div class="item-content">卡片内容4</div> <div class="item-mask mask-shape-4">遮罩文本4</div> </div> <div class="list-item"> <div class="item-content">卡片内容5</div> <div class="item-mask mask-shape-5">遮罩文本5</div> </div> <div class="list-item"> <div class="item-content">卡片内容6</div> <div class="item-mask mask-shape-6">遮罩文本6</div> </div> </div>
CSS样式
/* 两行三列布局 */ .list-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 15px; padding: 20px; } .list-item { position: relative; width: 220px; height: 180px; overflow: hidden; } .item-content { width: 100%; height: 100%; background-color: #f0f0f0; display: flex; align-items: center; justify-content: center; font-size: 16px; } /* 遮罩基础样式 */ .item-mask { position: absolute; top: 0; left: 0; width: 100%; height: 100%; background-color: rgba(0, 0, 0, 0.8); color: #fff; display: flex; align-items: center; justify-content: center; opacity: 0; transition: opacity 0.3s ease; font-size: 18px; } /* 为每个遮罩定义不同的多边形路径 */ .mask-shape-1 { clip-path: polygon(0 0, 100% 0, 100% 75%, 0 100%); } .mask-shape-2 { clip-path: polygon(0 25%, 100% 0, 100% 100%, 0 100%); } .mask-shape-3 { clip-path: polygon(0 0, 100% 25%, 100% 75%, 0 100%); } .mask-shape-4 { clip-path: polygon(0 0, 100% 0, 100% 100%, 0 75%); } .mask-shape-5 { clip-path: polygon(0 0, 100% 0, 75% 100%, 0 100%); } .mask-shape-6 { clip-path: polygon(25% 0, 100% 0, 100% 100%, 0 100%); } /* hover时显示遮罩 */ .list-item:hover .item-mask { opacity: 1; }
可选JS交互(替代CSS hover)
如果需要更复杂的交互逻辑,可改用JS控制:
const listItems = document.querySelectorAll('.list-item'); listItems.forEach(item => { const mask = item.querySelector('.item-mask'); item.addEventListener('mouseenter', () => { mask.style.opacity = '1'; }); item.addEventListener('mouseleave', () => { mask.style.opacity = '0'; }); });
内容的提问来源于stack exchange,提问作者Yaerox
相关产品推荐
相关产品推荐

