当父容器内存在带负上边距(`margin-top`)的子元素时,绝对定位子元素的 `top` 值会基于**包含块的边框边缘(border edge)**计算,但其参考位置实际受相邻兄弟元素的外边距塌陷及布局流干扰,导致视觉位置偏差。本文将深入解析该问题并提供可靠修复策略。
在您构建的日程表(calendar)布局中,.horaire 元素使用 position: absolute 并通过 top: 420px 指定垂直位置,期望精准对齐到第 12 行(因每个 .heure 高度为 35px,12 × 35 = 420px)。但实际渲染中却出现明显下移——根本原因在于:
#planning .heure {
margin: -0.9px 0 0 -0.9px; /* ← 关键问题:-0.9px 的 top margin */
}该负上边距虽用于视觉微调边框重叠,却引发两个关键副作用:
✅ 正确解决方案是移除负边距,改用更可控的布局方式:
/* ✅ 推荐:用 border-box + 重叠边框替代负 margin */
#planning .heure {
border: 1px solid #aaa;
width: 100px;
height: 35px;
/* 删除 margin: -0.9px ... */
position: relative;
box-sizing: border-box;
}
/* 确保 .jour > div 是可靠的相对定位容器 */
.jour > div {
position: relative;
background: #fff;
/* 可选:显式设置 padding-top=0 防止意外偏移 */
padding-top: 0;
}
/* 若需实现无缝边框连接,可统一 border-collapse 思路(flex 容器下适用) */
#planning {
display: flex;
/* ... 其他样式保持不变 */
}同时,确保 .horaire 的 top 值严格按 .heure 的几何高度累加(35px/行),且不依赖任何 margin 干扰:
⚠️ 注意事项

总结:绝对定位的可靠性高度依赖包含块的纯净性。移除 margin-top: -0.9px 后,.horaire 将严格遵循 top 值在 relative 父容器内精确定位,日程条即可准确锚定至目标时间行。