为什么inline-block类型的div与inline-block类型的button表现行为不同?
问题原因解答
核心差异来自浏览器对表单控件的特殊规则,你的基线相关猜测是正确的,具体逻辑如下:
- 第一点:
<button>属于表单类控件,浏览器的内置用户代理(UA)规则中,为了避免表单元素排版异常,会对inline/inline-block状态下的button的负margin做主动拦截,普通div作为原生非表单块元素没有这个限制,所以给div加负margin可以正常生效,直接加在button上会被规则忽略。 - 第二点确实和行盒基线对齐规则相关:inline-block元素默认的对齐基准是自身内部的文本基线,你虽然全局设置了
font-size: 0,但button的内置排版上下文会默认保留一个零宽字符的基线锚点,当你给button本身设置负margin-bottom时,浏览器会优先保证button的基线和当前行的文本基线对齐,自动抵消了负margin带来的偏移效果。 - 两种生效方案的原理:
- 把带负margin的div嵌套进button内部时,负margin作用在不受规则限制的普通div上,button仅作为外层容器,不会拦截内部元素的margin规则,所以偏移可以正常生效。
transform属于渲染层的视觉偏移,不会参与盒模型的排版计算,也不受浏览器对表单控件的盒模型限制,所以可以正常生效。
测试代码整理:
div, button { box-sizing: border-box; font-size: 0; margin: 0; padding: 0; border: 0; background: transparent; } .inline-offset { display: inline-block; width: 10px; height: 10px; margin-bottom: -5px; border: solid 2px black; }
Hello,<br /> dear <div class="inline-offset"></div> <br /> world! <br /> <br /> Hello,<br /> dear <button class="inline-offset"></button> <br /> world! <br /> <br /> Hello,<br /> dear <button><div class="inline-offset"></div></button> <br /> world!
实际表现截图:

内容的提问来源于stack exchange,提问作者fweth
相关产品推荐
相关产品推荐

