vertical-align属性是css常用属性,在刚刚接触到他时,他是这么跟我介绍自己的

vertical-align: baseline; 元素放置在父元素的基线上

这句话一直误导了我很长时间,我潜意识中以为他所说的父元素就是子元素使用vertical-align属性的元素,在每次vertical-align属性出现bug时我还傻敷敷的在想,这个父元素的基线到底在哪呢?inlin、block、inline-block元素的基线到底是怎么确定的呢?这对齐位置怎么跟我想象中的不一样呢?

唉。。。。一言难尽。。。

直到后来看了张鑫旭等一票大神对于vertical-align深入理解的教程和博客后,发现我大错特错,vertical-align: baseline;真正的作用其实是

vertical-align: baseline; 设置该属性的元素的基线与元素所在的行框盒子(line box)的基线对齐。

我diao~

css真是博大精深

吓得我赶紧把相关知识整理了一下,免得以后犯迷糊

基线中线底线与顶线

行框盒子模型

内容区域content area

底线和顶线包裹的区域,行内元素可以通过设置background-color属性显示出来

可以近似理解为上图中文字选中时底色区域的大小
内容区的大小只与文字大小和字体有关,在simsun字体下其高度近似于字体大小。

如果你的行高是定值,在字体增大导致content area高度超过行高后,它就会撑大下面要说的内联盒子inline box的高度

内联盒子inline boxes

在没有其他因素影响的时候,inline boxes高度就等于content area高度(line-height要设为零,因为行高默认值normal会设定合适大小的行高),而设定行高则可以增加或者减少inline boxes的高度。

即:将行距的值(行高 - 字体尺寸)除以2,并分别增加到content area的上下两边。我们经常通过设置行高与容器高度一致从而使单行文字垂直居中就是利用了这个原理,其实真正被居中的是content area

那设置行高后,行高===inline boxes高???

非也,上面说过如果你的字体够大导致content area突破了行高的限制,或者插入了一张高度大于行高的图片,就会把inline boxes的高度撑开,但并不会影响行高

inline水平的标签元素和直接写在父标签里的文字都会形成inline boxes

line box的高度会影响下面所说的行框盒子line boxes的高度

行框盒子line boxes

行框盒子line boxes就像包裹住一行内容的一个虚拟的矩形框,由一个个inline boxes组成

其高度等于本行内所有inline boxes高度的最大值

一个块级元素的内容高度是由一个一个line boxes堆起来的,对于内容只有一行的,块级元素的内容高度即为line boxes的高度

vertical-align

vertical-align: baseline

默认属性,上面说了该属性的作用是将设置该属性的元素的基线与元素所在的行框盒子(line boxes)的基线对齐。

那么基线位置如何确定呢

对于line boxes里的inline boxes来说

inline-block元素的基线是正常流中最后一个line boxes的基线,除非这个元素里面没有

line boxes或者本身’overflow’属性不是’visible’,这种情况下其基线是margin底边缘

如img图像标签引入的图片的基线就是图片底部, textarea标签也是底部,没有任何元素的inline-block水平元素也是底部

inline水平元素的基线就是它内部文字的基线

那么line boxes的基线位置如何确定呢?

其实只需想象其内部有一个看不见的x在就可以了,其基线就是看不见的字母x的基线,且基线的位置是不会变的

如下我们在div元素中写了一个x,用它模拟上面所提到的看不见的字母x,两者效果是一样的

<div style="">x<span style="">xspan1</span><input style="">
</div>复制代码

将span的vertical-align设为bottom之后你会发现input输入框的中心线是和div里x的底部对齐的,和span里的x底部就会有偏移。

position: absolute和float会直接使元素脱离文档流,可以当做它没有被包含在line boxes里,vertical-align不起作用,也不能用来判断基线位置

vertical-align: middle

元素中垂线与父元素的基线加上小写x一半的高度值对齐

经常用于inline-block元素的垂直居中对齐

但是由于字体不同,1/2x的位置也是不一样的,宋体有些下沉

并且随着字体尺寸的增大这个bug会变得越来越明显,可以给文字包裹一层标签单独设置字体尺寸然后设父元素字体大小为零,可以解决这个bug

基线的位置不会变,设置vertical-align改变的是元素自身的对齐方式改变的是元素位置

有的时候你会发现在给元素设置了vertical-align值后,他自己不动反而是相邻元素的位置改变了

其实并不是

如下

<div style="line-height: 100px;background: #f1faf1;"><div style="display: inline-block;height: 40px;vertical-align: middle;width: 100px;background: bisque;"></div><span style="vertical-align: middle;">xxxx</span>
</div>复制代码

设置父元素行高100px将line boxes高度撑开后分别设置inline-block级元素div和inline级元素span 的对齐方式为vertical-align: middle;两元素乖乖自己上下移动对齐的

<div style="line-height: 100px;background: #f1faf1;"><div style="display: inline-block;height: 40px;width: 100px;background: bisque;"></div><span style="vertical-align: middle;line-height: 140px;">xxxx</span>
</div>复制代码

我们将span的行高设为140px,再设置其对齐方式

这时span自己没有动,他旁边的div发生了移动

其实,并不是div发生了移动,移动的还是span,只不过这时line boxes的高度是由span撑开决定的,所以视觉上就像是div移动了。

转载于:https://juejin.im/post/5cc7a2e65188252dd9185248

关于行框盒子与vertical-align(一)相关推荐

  1. (1-1)line-height的定义和行内框盒子模型

    (1-1)line-height的定义和与行内框盒子模型的关系 一.line-height的定义 line-height的定义: 行高,又称为两基线的距离.默认基线对齐(因为CSS所有*线:总之就是各 ...

  2. CSS中的行盒(line-boxes)和行内盒子(line-box)

    CSS 盒模型 line-boxes(行盒/行框) line-box (行内盒子) 匿名内联元素 非替换元素 替换元素 inline-block 元素的各条线的位置 line-height line- ...

  3. 【基线,内容区, 行高/行间距,行距, 行内框,行框的 区分说明】

    基线,内容区, 行高,行距, 行内框,行框的 区分说明 ⑴ 基线 ⑵ 内容区 ⑶ 行高/行间距 ⑷ 行距 ⑸ 行内框 ⑹ 行框 ♣ 结束语 和 友情链接 ⑴ 基线 基线 沿着 文本最底部的 一行线, ...

  4. CSS line-hight ,vertical-align,父元素高度以及行框,行内框的关系

    参考文章:我对CSS vertical-align的一些理解与认识(一) css行高line-height的一些深入理解及应用 大小不固定的图片.多行文字的水平垂直居中 [line-height] l ...

  5. Matlab 编辑器框与命令行框视图分开两个窗口

    初学matlab,使用文本编辑器的时候,就会出现编辑器和命令行页面变成两个 这并不是我想看到的,每次运行,还需要打开另外一个界面,那么该如何合并成一个界面呢? 第一步:点击编辑器菜单界面上册的标红的地 ...

  6. 行高line-height,以及基线、顶线、中线和底线,还有内容区域、行内框和行框 by 豆豆猫的窝...

    http://www.ddcat.net/blog2005/archives/2008/06/227.html 转载于:https://www.cnblogs.com/mabelstyle/archi ...

  7. 深入理解css行高line-height

    1.行高的定义 行高是相邻两行文本基线之间的垂直距离.看清楚是基线,估计有很多前端搞了几年的都说不出个所以然.小时候我们写英文26个英文字母的单词本(随便找个图) 一行里面有四条线,在css中一个行内 ...

  8. HTML+CSS个人笔记

    HTML+CSS个人笔记 HTML(Hyper Text Markup Language) 浏览器 什么是浏览器内核? 浏览器所采用的渲染引擎("Rendering Engine" ...

  9. css before 文字前面竖线_前端进阶: css必知的几个底层知识和技巧

    学习方法推荐 问题学习法:带着问题去学习,有利于集中注意力,目的明确,这既是有意学习的要求,也是发现学习的必要条件.心理学家把注意分为无意注意与有意注意两种.有意注意要求预先有自觉的目的,必要时需经过 ...

最新文章

  1. python3 selenium 无头浏览器 无界面 chromedriver
  2. C++构造函数和析构函数的学习(一)
  3. web公选课js基础Part1
  4. java将naso注册成计算机服务_2018计算机二级考试Java语言每日一练 8月2日
  5. linux wps历史版本下载,WPS Office 2019 For Linux 11.1.0.9604版携新更新发布下载
  6. PMP通关必备——知识地图全套(附PMBOK第七版)
  7. 用vs2008编写和调试linux程序 ----VisualGDB 使用教程
  8. linux查看perl进程,如何找到挂起perl脚本(linux进程)的位置
  9. python乱码怎么办_python中urllib.unquote乱码的原因与解决方法
  10. excel合并工作簿怎么做?
  11. 0723数组复习 堆区 动态数组
  12. export_savedmodel
  13. 打包jar包时文件读取和第三方jar包的问题
  14. PowerPC VxWorks BSP分析(4.3)——BSP定制
  15. 网络协议 11 - Socket 编程(下):眼见为实耳听为虚
  16. 正则系列2: re.search用法
  17. python软件介绍-python软件界面介绍(python软件介绍)
  18. 【Verilog-9.9】initial和always的用法
  19. windowsxp最新版本_雨林木风U盘装系统启动盘制作工具更新最新版9.0
  20. 211大二计科生高呼:王侯将相宁有种乎?

热门文章

  1. mysql数据库方言设置_mysql数据库方言的选择问题
  2. mysql backup restore_MySQL Backup  Restore strategy
  3. easyuefi只能在基于uefi启动的_如何以简单正确的姿势理解“UEFI”和“BIOS”?
  4. 【AAAI 2020】全部接受论文列表(二)
  5. TST嘉硕车规晶振应用场景大全|KOYUELEC光与电子
  6. HBase--Split和Compact
  7. Oracle19客户端下载安装步骤
  8. html一些基本标签,HTML 基本标签的一些特性
  9. Pytorch中的梯度回传
  10. 淘宝新品上架获取流量技巧