去掉id
为b
的display:inline-block
时有不同的表现,想不通为什么会这样,代码如下
#a {
width: 200px;
height: 100px;
background: #f00;
}
#b {
display: inline-block;
width: 200px;
height: 100px;
margin-top: -131px;
background: #0f0;
}
<body>
<div id="a"></div>
<div id="b"></div>
</body>
这是一个涉及到linebox的baseline的问题,如果不熟悉,推荐读一下以下的博客
1.(翻译)关于Vertical-Align你需要知道的事情
2. 天镶的博客
3. 我自己写的关于baseline的博客---有点乱^_^
block元素表现的行为就不解释了,下面主要解释inline-block元素加上负边距的表现
先上我自己的代码
Question:为什么黄色child不会整个都出去呢?
①这个linebox的元素有黄色child(inline-block元素)和内容为x的匿名文本框。
②inline-block如果没有内容,则其baseline为其marginbox的下边缘。
③普通文本框的baseline由font-zie和line-height决定。
④linebox的baseline为各元素中最低的一条baseline,在这里是内容为x的匿名文本框的baseline。
本来高度为100px的黄色child设置margin-top为-100px,应该跑出蓝色father才对,但是inline-block元素处于linebox中,需要对齐linebox的baseline,即匿名文本框的baseline,他就跑不出绿色father的手掌心了,所以实际上黄色child上升的高度不是100px。
我们可以试着将绿色father的font-size设置为50px(代码中的注释),这样会导致linebox中匿名文本框的baseline位置降低,从而黄色child也跟降低下来进行baseline对齐。
设置font-size后的效果图
好了,啰嗦了这么久,回到我们现在的题目来看inline-block元素加上负边距的表现
1.注释掉#b的margin-top: -131px,之后的效果图
2.现在将#b的margin-top: -131px重新加上去,毫无疑问我们会看到,绿色b上移,但不会上移131px,而是小于131px,跟我们上面解释那么长的代码的原因是一样的。
可能会产生的疑问:
这里跟上面的例子有点不一样,这里没有x匿名文本框,不过有空格、换行产生的空白符文本框。
3.如果要改变绿色b上移的高度,我们只需要改变linebox的baseline就可以了,下面简单给出几种方式。
①设置绿色b父级元素(可以是body)的font-size或者line-height的值。(改变了匿名文本框的baseline)
设置body{line-height:100px;}后的效果图
可以看到绿色b下降了一点
②改变绿色inline-block元素的baseline,在绿色div中写入x字符,如<div id="b">x</div>
总结:
①关于各元素baseline位置改变的知识,在我的博客有粗略讲解,文章开头有链接
②欢迎指正错误
不知不觉写了好多,点个赞支持一下咯O(∩_∩)O哈哈~