负 margin 移动逻辑分方向:上/左负值使元素自身偏移,右/下负值仅影响后续兄弟元素位置;常用于修复浮动布局溢出、固定尺寸居中及等高列模拟,但对 inline 元素上下无效,inline-block 需配合 vertical-align 才生效。
负 margin-top 和 margin-left 让元素自身往对应方向偏移;而负 margin-right 和 margin-bottom 不动元素本身,只影响后续兄弟元素的位置——后者会“挤进来”,甚至覆盖当前元素(尤其在 display: block 下,内容不被盖,背景可能被盖)。
margin-top: -20px → 元素上移 20px,下方元素跟着上提margin-left: -15px → 元素左移 15px,右边 inline 元素紧贴其新左边缘margin-right: -10px → 当前元素不动,后一个块级元素向左挪 10px,可能叠在它上面margin-bottom: -30px → 当前元素“在文档流中变矮了”30px,下个元素会上提,但它的 height 和视觉内容不受影响比如父容器宽 1100px,5 个商品卡片各宽 219px + 2px 边框 → 总宽 (219 + 2) × 5 = 1105px,超 5px。用负 margin 把多余间隙“吃掉”比改结构更轻量。
.product-list {
margin-right: -5px; /* 抵消最后一列多出的右间距 */
}
.product-item {
float: left;
width: 219px;
border: 1px solid #eee;
margin-right: 5px; /* 每项自带右距 */
}margin-right,子项保持正 margin-right,避免手动写 :last-child
float 或清除浮动(如 overflow: hidden),否则父容器高度塌陷gap + di
splay: grid,但老项目里负 margin 仍是最快补救手段当不能用 transform: translate(-50%, -50%) 或 Flex 时,负 margin 是传统可靠方案。
.modal {
position: absolute;
top: 50%;
left: 50%;
width: 400px;
height: 300px;
margin-left: -200px; /* 宽度一半 */
margin-top: -150px; /* 高度一半 */
}margin-bottom: -9999px + padding-bottom: 9999px,本质是让父容器“误判”子列高度一致overflow: hidden 在父容器上不能乱删负 margin 在不同 display 类型下表现不一,容易误判“没生效”:
display: inline:上下 margin 完全无效(包括负值),左右有效display: inline-block:上下 margin 看似无效,其实是受 vertical-align: baseline 影响;设成 top 或 middle 后,margin-top: -10px 就能上移input 默认是 inline-block,所以 margin-top: -10px 要配合 vertical-align: top 才明显别一看到没动就怀疑 CSS 写错,先查 display 和 vertical-align。