vertical-align:middle的深入理解

顶线,中线,基线与底线

众所周知,在 html 中一行包含这几条线,顶线,中线,基线和底线.

文本的垂直对齐

对于这四条线,css 给出了行内元素的四种垂直对齐方式,即顶部(top),中部(middle),基线(baseline),底部(bottom)

诶!这里大家肯定就发现问题了,怎么中线对齐根本不居中啊?要解决这个问题我们先要从一行的组成开始探索.

line-box

一行可以作为一个 linebox 来看待,line-box 中有如下区域.
line-height(virtual-area),font-size(content-area),cap(大写 X 的大小),x-height(小写 x 的大小)
注: cont-area 的大小与图片相等,因为他们都设置为 100px

line-height(virtual-area)是一行的高度,他决定了一行的顶线与底线

line-height

line-height 是该行的行高,它由顶线最高与底线最低的子元素决定,或者对父元素直接设置 line-height

content-area

字体是放在一个长宽都是 font-size 的盒子(content-area)中的,所以文字大小(cap)会比 font-size 稍小


注: 实际上 font-size 为 100px 的 content 盒子的大小与宽高为 100px 的块级元素的大小是相等的

一行各线的确定

行高:line-height 由顶线最高与底线最低的子元素给出,或者对父元素直接设置 line-height

顶线与底线: line-height 决定了顶线与底线的位置,

基线:由 line-height 减去 font-size/2 得到 leading,将分别放在上下使得 content-area 能够居中并且决定决定基线位置(如果图片时最高的子元素,底线位于最低的子元素的底线,基线在图片的底上)

中线:基线位置加上 x-height(小写 x 的高度)决定中线位置

middle 失效的答案

终于!我们明白给子元素设置 vertical-align:middle 为什么会失效了!其实 middle 并没有失效,只是中线的位置不对而已.首先行高和基线被图片和文字共同确定,在默认情况下,父元素的 font-size:1em 为 16px 所以 x-height/2 大概在 5px 左右,基线的高度上加 5px 后确定了中线位置,最后设置了中线对齐的子元素的中线与父元素的中线对齐.所以完全偏离了!

其他问题

图片下方空白的问题

我们在一行文字中插图图片,图片下方会空出一块这是为什么呢.一行的 line-height 是由高度最高元素的顶线到最低的底线决定的,图片没有底线,最低处将算到文字的底线处.

为什么给图片设置 vertical-align:middle 之后的文字反而会居中?

对相对较大的图片设置居中后,图片的中线将与父元素的中线对齐,由于父元素本身是由图片撑大的(底线间隙在文字移动后消失),此时父元素的中线就与图片中线重合.
由于父元素的 font-size 较小(默认 16px),其基线就在中下下方 8px 处,而字体的大小刚好就是 16px,这样字体的中线刚好与父元素中线重合,进而与图片中线重合

=

注意: 这个 linebox 确实变矮了!(底边间隙由于文字的上移消失)所以现在 x 相对图片绝对居中
总结

实用结论

子元素相对于父元素居中:

文字:对文字设置 line-height 等于父元素的 height
图片:对父元素设置 line-height 等于其 height,对图片设置设置 vertical-align:middle(有一定误差)
注: 垂直居中计算方式是根据 x-height也就是父元素的小写x的高度的,对图片其实根本不靠谱

文字相对于较大的图片居中:

对图片设置 vertical-align:middle

真正的图片相对父元素垂直居中

position: relative;
top: 50%;
transform: translateY(-50%);

1、position: relative;

理解:relative 是相对的意思,这里是相对于父元素

2、top: 50%;

理解:高度是 50%,指的是父无素的高度的 50%。

3、transform: translateY(-50%);

理解:向上移动自身元素高度的 50%。

弹性盒子中的垂直对齐问题

最近学习了弹性盒子,在容器中有一个属性是 align-items,决定了交叉轴上元素的排列方式.由于默认水平是主轴,垂直是交叉轴,这个属性多用来确定垂直方向的对齐方式.
align-items:baseline
所有元素都会对齐容器的基线,容器的基线是由基线位置距离交叉轴最远的元素决定的.
让我们来看这个例子.对于一个 div,在内部没有行内元素时,它的基线和底线位置都在 border 下,此时容器的基线由基线距离 cross-start(交叉线的起点) 最远的红色 div 决定

当我们对 div 中写入文本后,该 div 的基线位置变为文本的基线位置,此时容器的基线由基线距离 cross-start(交叉线的起点)最远的亚麻色和蓝色 div 决定

vertical-align:middle的深入理解相关推荐

  1. CSS布局解决方案(终结版)

    前端布局非常重要的一环就是页面框架的搭建,也是最基础的一环.在页面框架的搭建之中,又有居中布局.多列布局以及全局布局,今天我们就来总结总结前端干货中的CSS布局. 居中布局 水平居中 1)使用inli ...

  2. HTML5+CSS、CSS3基础知识点总结

    一.选择器 选择器分为基础选择器和复合选择器两大类. 基础选择器由单个选择器组成 基础选择器包括:标签选择器.类选择器.id 选择器和通配符选择器(*) 标签选择器 优点 标签选择器可以把某一标签全部 ...

  3. 前端htm cssl总结

    第1章 HTML基础   (一) HTML文件的基本结构和W3C标准 l HTML用来描述网页的一种语言,他是一种超文本标记语言(Hyoer Text Markuo Language),HTML不是一 ...

  4. css+js+jq实训笔记

    css+js+jq实训笔记 css第一天 css第二天 css第三天 css第四天 css第五天 css第六天 js第一天 js第二天 js第三天 js第四天 js第五天 js第六天 jq第一天 jq ...

  5. 如何使html中的din居中,CSS 实现完美垂直居中

    <?xml version="1.0" encoding="utf-8"?>ttp://www.w3.org/TR/xhtml1/DTD/xhtml ...

  6. 大众点评封ip,还字体加密?我直呼,就这啊!

    像旧巷子里的猫,我很自由,但没有归宿 假如csdn有创作激励该多好,那样就可以天天"水"博客了! 哈喽,大家好,上期给大家伙分享了一期微博数据的爬取 Python爬取微博评论数据, ...

  7. GridView To Excel

    将GridView的内容导出到Excel中 原文来自:http://gridviewguy.com/ArticleDetails.aspx?articleID=197 介绍: 将GridView的内容 ...

  8. html5怎么把图片垂直居中,css如何让img垂直居中?

    css如何让img居中显示?对于刚刚css入门的新手可能还不是很熟悉,下面我们来总结一下css如何让img垂直居中? 一.使用flex实现垂直居中 利用 display: flex;align-ite ...

  9. 系统理解Win32 API和MFC

    Win32 API是微软的操作系统Windows提供给开发人员的编程接口,它决定了我们开发的Windows应用程序的能力.MFC是微软为开发人员提供的类库,在某种意义上是对Win32 API的封装.本 ...

最新文章

  1. 原创哈希数据导出算法
  2. JavaScript定义函数的几种方式 1
  3. 【转载】如何组建一支优秀的数据分析团队?
  4. 组合数据类型练习,英文词频统计实例9-21
  5. 基础练习 十六进制转十进制 c语言
  6. LeetCode:Minimum Path Sum(网格最大路径和)
  7. ssh(struts,spring,hibernate)开发的初步集成01--依赖
  8. mysql+delete删除空行,删除空行 linux
  9. 跨网页的新手引导_做自媒体的新手要注意什么,这些坑不能踩,这些事不能做...
  10. python抓取qq群消息,python 爬取qq群员信息
  11. 实用EXCEL之考勤数据的表合并
  12. 详解光纤光缆、网线、电缆的区别
  13. 学影视模型与游戏模型哪个更有前景呢?
  14. AS3多线程快速入门(三):NAPE物理引擎+Starling
  15. 【LAB4-Cisco】OSPF邻居建立过程与LSDB分析
  16. macbook pro开机后自动关机
  17. 世界上最强大的两个字母的单词
  18. 书论52 姜夔《续书谱》
  19. 车祸相关公开数据集(免费下载)
  20. 友盟+高吞吐、极速高并发智能推送服务,赋能值得买科技的精准化用户运营

热门文章

  1. 使用qrcode.js生成网址二维码
  2. hibernate QBE例子
  3. 【MOOC】数学实验 - 电子科技大学-第1讲
  4. 5G网络学习(四)——5G网络中数据包转发模型(未完待续)
  5. 云顶之弈天选战神劫阵容攻略,天选战神劫如何玩?
  6. Java从入门到精通!Java技术培训学校排名
  7. 2018python教程百度云盘_『求老2018男孩Python最新全栈开发全套视频教程』python开发 百度云教程...
  8. iOS15上线图片翻译功能,能取代专业翻译软件吗?
  9. POJ4110圣诞老人的礼物
  10. linux open驱动失败,linux所遇到的问题记录