
本文介绍如何仅通过 css(无需切图或 javascript 处理)将一张原始大图按 3×3 网格均匀“裁切”并分配到九个网格项中,配合点击透明化实现图层叠加揭示效果。
本文介绍如何仅通过 css(无需切图或 javascript 处理)将一张原始大图按 3×3 网格均匀“裁切”并分配到九个网格项中,配合点击透明化实现图层叠加揭示效果。
在网页交互设计中,常需实现「遮罩-揭示」效果:例如顶层显示统一蒙版(如带编号的卡片),点击后逐块消失,露出底层完整图像。但若为每个网格项单独准备 9 张切图,不仅增加资源管理成本,还丧失灵活性——每次更换底图都需重新切图。
核心解法:利用 background-attachment: fixed + 精确控制 background-position
虽然 CSS 并无原生“图像切片”属性,但可通过固定背景定位与容器视口对齐的特性,让同一张大图在多个子元素中呈现不同区域。关键在于:
- 所有 .grid-item 共享同一张大图作为 background-image;
- 设置 background-attachment: fixed,使背景图相对于视口固定,不随元素滚动(此处用于确保各格子“看到”的是图像不同局部);
- 配合 background-size 放大背景图(如 300% 300%),再通过 background-position 按网格坐标偏移,使每格精准对应图像的 1/9 区域。
✅ 推荐更可控、语义更清晰的进阶写法(替代 fixed):
.grid-item { background-image: url("/images/narava2_small.jpg"); background-size: 300% 300%; /* 横纵均放大至原图3倍 */ background-repeat: no-repeat; } /* 使用 :nth-child 定位每一块 */ .grid-item:nth-child(1) { background-position: 0% 0%; } .grid-item:nth-child(2) { background-position: -33.333% 0%; } .grid-item:nth-child(3) { background-position: -66.666% 0%; } .grid-item:nth-child(4) { background-position: 0% -33.333%; } .grid-item:nth-child(5) { background-position: -33.333% -33.333%; } .grid-item:nth-child(6) { background-position: -66.666% -33.333%; } .grid-item:nth-child(7) { background-position: 0% -66.666%; } .grid-item:nth-child(8) { background-position: -33.333% -66.666%; } .grid-item:nth-child(9) { background-position: -66.666% -66.666%; }
此方案优势显著:
- 零切图:仅维护一张源图,更换主题图时只需改一个 URL;
- 响应式友好:结合 background-size: cover 或 contain 可适配不同容器尺寸;
- 性能优异:浏览器复用同一张图片纹理,减少 HTTP 请求;
- 逻辑解耦:JS 仅负责交互(如点击置透明),样式层完全承载布局与视觉切分。
⚠️ 注意事项:
立即学习“前端免费学习笔记(深入)”;
- 若容器存在滚动,慎用 background-attachment: fixed(可能导致定位异常),优先采用 background-position 百分比偏移方案;
- background-size: 300% 300% 假设图像宽高比与容器网格整体一致;若需严格等分,建议预设图像为正方形(如 900×900px),再按 33.333% 步长偏移;
- 点击透明化后,底层 .main_container 的背景图自然显现,形成“揭开”效果,无需额外 DOM 操作。
最终,你获得的是一套轻量、可维护、专业级的图像网格揭示方案——用纯 CSS 解决本需图像处理工具完成的任务。


















