如何使用 overflow:hidden 清除内联块元素的底边距?

How to clear bottom margin of inline-block element with overflow:hidden?

提问人:Fabrício Matté 提问时间:3/5/2014 最后编辑:CommunityFabrício Matté 更新时间:3/5/2014 访问量:1066

问:

我知道当一个元素的计算值与 不同时,它的基线是下边距边缘。inline-blockoverflowvisible

通过单击切换按钮添加到元素,在此小提琴中实际查看这一点。的基线将与其下边缘对齐,在其下方生成一些空白/边距。overflow:hiddendivdiv

答案中很好地解释了此行为。

我的问题是,我如何“修复”它,以便在元素收到 overflow:hidden 时不会出现边距?

我能想到的合乎逻辑的解决方法是将 的(默认为 )更改为其他内容。但我很难决定哪个是最合适的:divvertical-alignbaselinevertical-align

  • top似乎目前在 Chrome 33 中存在错误,元素的所有直接子元素(文本节点和 / 内容)都与 .inline-blockreplaceddiv

  • bottom将是另一种选择,但是在使用 jQuery 动画其 /vertical 时,then 会略微向上/向下移动。divheightpadding

  • middle就我测试过的情况而言,似乎工作正常,但我不确定浏览器如何计算结果对齐。

我还发现了其他黑客,例如在父级中应用 or 并将所有子项包装在一个重置其 / 的容器中,但这些都是非常丑陋的黑客。line-height:0font-size:1pxline-heightfont-size

垂直对齐的正确值是多少,或者此用例的正确修复是什么?

更新:显然会将内联块元素与行框的中间对齐。到目前为止,从我的测试来看,似乎只要元素的底部边缘高于基线,就没有闪烁的动画问题。要演示 / 发生的闪烁问题(注意顶部边框和文本):演示middleheighttext-alignbottomtext-bottom

因此,或(为了安全起见)似乎工作正常(避免由于Chrome错误)。我仍然对见解持开放态度。vertical-alignmiddletext-toptop


上下文:我正在使用 jQuery 对元素进行动画处理。jQuery的动画(/////等)在动画制作时设置在元素中,导致在动画期间将动画元素下方的整个页面稍微向下推,从而产生不舒服的副作用。inline-blockfadeInfadeOutslideUpslideDownanimateoverflow:hiddeninline-block

这是另一个演示,说明了上面的段落。


SSCCE中使用的代码:

演示 #1

<div>
    some text and an inline block element <span></span>
</div>
<br>
<button>
    toggle overflow hidden
</button>

$('button').click(function() {
    var st = $('div')[0].style;
    st.overflow = !st.overflow ? 'hidden' : '';
});

span {
    display: inline-block;
    width: 10px;
    height: 50px;
    background: red;
}
div {
    display: inline-block;
}

演示 #2

<div>
    some text and an inline block element <span></span>
</div>
<br>
<button>
    Animate for 1 second
</button>

$('button').click(function() {
    $('div').animate({ width: 300 }, 1000);
});

(与演示 #1 相同的 CSS)

演示 #3 动画时闪烁,原因如下:heightvertical-align: bottom

baseline
<div>
    some text and an inline block element <span></span>
</div>
<br>
<button>
    Animate for 2 seconds
</button>

var i = 0;
$('button').click(function() {
    $('div').animate({ height: ++i % 2 ? 300 : 100 }, 2000);
});

span {
    display: inline-block;
    width: 10px;
    height: 50px;
    background: red;
}
div {
    display: inline-block;
    border: solid;
    vertical-align: bottom;
}
jquery 溢出 CSS

评论

0赞 Iqbal Kabir 3/5/2014
是否可以为 div 添加特定高度?
0赞 Fabrício Matté 3/5/2014
@Iqbal不,我的实际用例有动态内容。

答:

1赞 Nelson Menezes 3/5/2014 #1

您可以使用负边距取消扩展基线周围的“额外”高度,但这将取决于父级的高度。默认情况下,这大约是 1.2,但如果您设置一个特定的值,它会变得更容易处理。line-height

下面是一个在动画时添加负边距的示例:

JS公司

$('div').
    addClass("animating").
    animate({ height: ++i % 2 ? 300 : 100 }, 2000).
    queue(function() {
        $(this).removeClass("animating").dequeue();
    });

CSS的

.animating {
    margin-bottom: -.2em;
}

假设默认字体大小为 16px,行高为 ~19.2px,因此我们需要删除 3.2px(在 em 中,3.2*100/16 = 0.2)。当然,设置实际的线高值会使这更容易。

http://jsfiddle.net/n6hmr/9/

评论

0赞 Fabrício Matté 3/6/2014
我相信默认的行高因字体和浏览器而异,但感谢这是有用的信息。
0赞 Nelson Menezes 3/6/2014
@FabrícioMatté 是的,确实如此——如果你想使用这种技术,我建议你设置使用显式值而不是浏览器/字体默认值。line-height