inline-block元素vertical-align的问题分析
先来解释下这两个标签
inline-block:
字面意思:行内块元素,相当于强制转换,把一个标签设置为行内的块元素,既有块元素的部分特性(支持width\height\maigin-top\margin-bottom),又有行内元素的部分特性(不换行)。
vertical-align:
vertical-align 属性设置元素的垂直对齐方式。
该属性定义行内元素的基线相对于该元素所在行的基线的垂直对齐方式。
在表单元格中,这个属性会设置单元格框中的单元格内容的对齐方式。
可能的值
| 值 | 描述 |
|---|---|
| baseline | 默认。元素放置在父元素的基线上。 |
| sub | 垂直对齐文本的下标。 |
| super | 垂直对齐文本的上标 |
| top | 把元素的顶端与行中最高元素的顶端对齐 |
| text-top | 把元素的顶端与父元素字体的顶端对齐 |
| middle | 把此元素放置在父元素的中部。 |
| bottom | 把元素的顶端与行中最低的元素的顶端对齐。 |
| text-bottom | 把元素的底端与父元素字体的底端对齐。 |
| length | |
| % | 使用 "line-height" 属性的百分比值来排列此元素。允许使用负值。 |
| inherit | 规定应该从父元素继承 vertical-align 属性的值。 |
深入理解vertical-align这些值的含义,可以参考这篇博客 深入理解CSS中的行高与基线
现在的问题是使用inline-block时遇到关于vertical-align的问题:
HTML+CSS 代码:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>浮动定义</title>
<style type="text/css">
div{
border: 1px solid red;
}
.div1 , .div2{
width: 100px;
height: 100px;
display: inline-block;
}
</style>
</head>
<body>
<div class="demo">
<div class="div2"></div>
<div class="div1"></div>
</div>
</body>
</html>
效果:

这时候发现inline-block元素之间多了不少莫名其妙的边距,左右的边距解决方式在另一篇博客有分析,inline-block元素间间隙的分析
至于上下的边距,别急,还有更奇怪的,我们往这两个div任意一个里面加点文字
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>浮动定义</title>
<style type="text/css">
div{
border: 1px solid red;
}
.div1 , .div2{
width: 100px;
height: 100px;
display: inline-block;
}
</style>
</head>
<body>
<div class="demo">
<div class="div2">Web前端</div>
<div class="div1"></div>
</div>
</body> </html>
效果:

到这就完全摸不着头脑了。
分析产生的原因:
经过测试发现,这个下边距跟inline-block的垂直对齐方式有关,也就是vertical-align;
inline-block的默认对齐方式是vertical-block:baseline,由上面可知,就是inline-block元素要根据父元素的基线对齐,那么问题来了,基线又是什么鬼?
inline-block的基线是正常流中最后一个line box的基线,除非,这个line box里面既没有line boxes ,或者其本身overflow属性的计算值不是visible,则它的基线是margin底边缘。
上面这段不是人话,看不懂没关系,下面是人话:
如果一个inline-block元素里面是空的,或者它本身有overflow属性,这种情况下基线是它margin的底边缘。
如果一个inline-block元素里面不是空的(比如里面有文字或者图像),则它的基线由正常流中最后一个line box的基线决定。
如图:基线(Baseline)是大部分字母所“坐”在的,字体的下降部之上的直线。下图红色的直线就是基线。

正经原因:
第一个盒子,里面是空的,所以它的基线是它的下边框。
第二个盒子,里面有文字,所以它的基线是正常流中最后一个行框的基线决定,也就是第二行的基线。
默认情况下基线对齐,所以它们就变成这样啦。
解决办法:
对于行内元素,vertical-align虽然不可见,但实际上【到处都是】!
也就是说,只要是行内元素,一定会受它影响。
在遇到由vertical-align:baseline造成的各种无法理解的怪异现象,可以直接放大招,废掉基线对齐(比如底线对齐、顶线对齐就很好啊),统一对齐方式。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>浮动定义</title>
<style type="text/css">
div{
border: 1px solid red;
}
.div1 , .div2{
width: 100px;
height: 100px;
display: inline-block;
/*
* 以下三种方式任意选一种都可以
*/
vertical-align: top;
/*vertical-align: bottom;
vertical-align: middle;*/
}
</style>
</head>
<body>
<div class="demo">
<div class="div2">Web前端</div>
<div class="div1"></div>
</div>
</body> </html>
参考博客:
2、CSS line-height与vertical-align:baseline
inline-block元素vertical-align的问题分析的更多相关文章
- CSS3如何去除 inline block 元素之间多出的空格
display: inline-block 属性很好的避免了元素的浮动问题,但是会有点小问题,就是 inline-block 元素间的回车会被显示为一个空格.然而,我们写代码时,都是用回车来格式化的. ...
- 多个inline元素、block元素、inline-block元素在父容器中的换行情况
1.首先看inine元素的换行情况 <style> *{padding:0;margin:0} div.wrap{width:200px;height:200px;border:1px s ...
- 当inline元素包裹block元素时会发生什么
经常有图片链接写法如下: <a href="www.baidu.com"><img src="baidu.jpg" /></a&g ...
- inline元素、block元素、inline-block元素
inline 内联元素:是不可以控制宽和高.margin等:并且在同一行显示,不换行,直到该行排满. block 块级元素:是可以控制宽和高.margin等,并且会换行.块级对象元素会单独占一行显示, ...
- block元素和inline元素的特点
一.block元素的特点 1.处于常规流中时,如果width没有设置,会自动填充满父容器 2.可以设置height/width及margin/padding 3.处于常规流中时,布局在前后元素位置之间 ...
- 关于block元素和inline元素
呃...这个会不会太基础了.最近在复习,所以基础知识也不能够忽略. 根据HTML 4.01 规范,其描述如下(http://www.w3.org/TR/html401/struct/global.ht ...
- inline元素、block元素
inline元素 不会独占一行,相邻的行内元素会排列在同一行内,直到一行排不下才会换行 高.行高.以及外边距和内边距不可改变 宽度就是它的文字或图片的宽度,不可改变,随元素内容变化而变化 内联元素只能 ...
- display:inline block inline-block 的区别
原文地址:http://blog.csdn.net/jly036/article/details/5506182 display:block就是将元素显示为块级元素. block元素的特点是: 总是在 ...
- What is Vertical Align?
https://css-tricks.com/what-is-vertical-align/ ************************************************* CSS ...
- inline,block,inline-block解析
display:block就是将元素显示为块级元素. block元素的特点是: 总是在新行上开始: 高度,行高以及顶和底边距都可控制: 宽度缺省是它的容器的100%,除非设定一个宽度 <div& ...
随机推荐
- pip安装指定版本的package
起因 最近到一个项目组,用了一套高大上的运维工具来搭建开发环境. 有vagrant控制VirtualBox启动虚拟机.有ansible来运行playbook初始化环境. 然后遇到了一个坑,项目现有的p ...
- GitHub + VSTS 开源代码双向同步
GitHub已经是全球开源代码的大本营了,通过以下统计你可以看到仅仅javascript在github就有超过32万个活动的repo.很多开发人员都会把自己的一部分代码分享到github上进行开源,一 ...
- freeswitch对接其它SIP设备
这几天用到freeswitch对接其它设备方面的知识,这里整理下,也方便我以后查阅. 操作系统:debian8.5_x64 freeswitch 版本 : 1.6.8 一.freeswitch作为被叫 ...
- 11g新特性:Health Monitor Checks
一.什么是Health Monitor ChecksHealth Monitor Checks能够发现文件损坏,物理.逻辑块损坏,undo.redo损坏,数据字典损坏等等.Health Monitor ...
- IT技术思维导图
在网上看到有个人总结的java技术的东东,觉得很好,就保存下来了,码农还真是累啊,只有不断的学习才能有所提高,才能拿更多的RMB啊. java技术思维导图 服务端思维导图 前端思维导图
- Linux下的C Socket编程 -- server端的简单示例
Linux下的C Socket编程(三) server端的简单示例 经过前面的client端的学习,我们已经知道了如何创建socket,所以接下来就是去绑定他到具体的一个端口上面去. 绑定socket ...
- FujiXerox CP116w换无线路由器后重新连接
因为手头没有安装光盘, 不得不用土办法修改cp116w的wifi连接参数 1. 将路由器的2.4GHz SSID和密码设置为和旧路由器一样, 这样打印机就能连接上了 2. 在路由器控制界面中找到类似于 ...
- [LeetCode] Remove Invalid Parentheses 移除非法括号
Remove the minimum number of invalid parentheses in order to make the input string valid. Return all ...
- [LeetCode] Combine Two Tables 联合两表
Table: Person +-------------+---------+ | Column Name | Type | +-------------+---------+ | PersonId ...
- Lind.DDD.RedisClient~对StackExchange.Redis调用者的封装及多路复用技术
回到目录 两雄争霸 使用StackExchange.Redis的原因是因为它开源,免费,而对于商业化的ServiceStack.Redis,它将一步步被前者取代,开源将是一种趋势,商业化也值得被我们尊 ...