先来解释下这两个标签

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>

参考博客:

1、深入理解CSS中的行高与基线

2、CSS line-height与vertical-align:baseline

inline-block元素vertical-align的问题分析的更多相关文章

  1. CSS3如何去除 inline block 元素之间多出的空格

    display: inline-block 属性很好的避免了元素的浮动问题,但是会有点小问题,就是 inline-block 元素间的回车会被显示为一个空格.然而,我们写代码时,都是用回车来格式化的. ...

  2. 多个inline元素、block元素、inline-block元素在父容器中的换行情况

    1.首先看inine元素的换行情况 <style> *{padding:0;margin:0} div.wrap{width:200px;height:200px;border:1px s ...

  3. 当inline元素包裹block元素时会发生什么

    经常有图片链接写法如下: <a href="www.baidu.com"><img src="baidu.jpg" /></a&g ...

  4. inline元素、block元素、inline-block元素

    inline 内联元素:是不可以控制宽和高.margin等:并且在同一行显示,不换行,直到该行排满. block 块级元素:是可以控制宽和高.margin等,并且会换行.块级对象元素会单独占一行显示, ...

  5. block元素和inline元素的特点

    一.block元素的特点 1.处于常规流中时,如果width没有设置,会自动填充满父容器 2.可以设置height/width及margin/padding 3.处于常规流中时,布局在前后元素位置之间 ...

  6. 关于block元素和inline元素

    呃...这个会不会太基础了.最近在复习,所以基础知识也不能够忽略. 根据HTML 4.01 规范,其描述如下(http://www.w3.org/TR/html401/struct/global.ht ...

  7. inline元素、block元素

    inline元素 不会独占一行,相邻的行内元素会排列在同一行内,直到一行排不下才会换行 高.行高.以及外边距和内边距不可改变 宽度就是它的文字或图片的宽度,不可改变,随元素内容变化而变化 内联元素只能 ...

  8. display:inline block inline-block 的区别

    原文地址:http://blog.csdn.net/jly036/article/details/5506182 display:block就是将元素显示为块级元素. block元素的特点是: 总是在 ...

  9. What is Vertical Align?

    https://css-tricks.com/what-is-vertical-align/ ************************************************* CSS ...

  10. inline,block,inline-block解析

    display:block就是将元素显示为块级元素. block元素的特点是: 总是在新行上开始: 高度,行高以及顶和底边距都可控制: 宽度缺省是它的容器的100%,除非设定一个宽度 <div& ...

随机推荐

  1. Windows Git安装指南

    步骤如下: 1.资源下载 :Git-1.9.4-preview20140815.exe http://code.google.com/p/tortoisegit/downloads/list 2.安装 ...

  2. [转]Code! MVC 5 App with Facebook, Twitter, LinkedIn and Google OAuth2 Sign-on (C#)

    本文转自:https://www.asp.net/mvc/overview/security/create-an-aspnet-mvc-5-app-with-facebook-and-google-o ...

  3. 【JS/CSS3】实现带预览图幻灯片效果~

    一.前期准备 1.1 案例分析 适用场景:单例布局1.2 方法论 V视图 HTML+CSS+调试C js实现控制流程D数据 优化扩展 二.代码 结构 <div class="slide ...

  4. BZOJ 1087: [SCOI2005]互不侵犯King [状压DP]

    1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3336  Solved: 1936[Submit][ ...

  5. 深入SpringMVC

    一.如何让一个普通类成为Controller? 方案一:实现接口Controller 解析:handleRequest(request,response) 方案二:继承AbstractControll ...

  6. [No000094]SVN学习笔记4-版本库概念与部分日常操作

    基本概念 版本库 Subversion 使用集中的数据库,它包含了所有的版本控制文件及其完整历史.这个数据库就是版本库.版本库通常位于运行 Subversion 服务器的文件服务器上,向 Subver ...

  7. codevs 1164 统计数字

    时间限制: 1 s  空间限制: 128000 KB  题目等级 : 白银 Silver 题目描述 Description [问题描述]某次科研调查时得到了n个自然数,每个数均不超过150000000 ...

  8. BZOJ 3944 Sum

    题目链接:Sum 嗯--不要在意--我发这篇博客只是为了保存一下杜教筛的板子的-- 你说你不会杜教筛?有一篇博客写的很好,看完应该就会了-- 这道题就是杜教筛板子题,也没什么好讲的-- 下面贴代码(不 ...

  9. [LeetCode] Trapping Rain Water 收集雨水

    Given n non-negative integers representing an elevation map where the width of each bar is 1, comput ...

  10. GD库常用函数

    创建句柄 imagecreate($width, $height)                                                  //新建图像 imagecreat ...