line-height

  • 字符实际大小和font-size的关系:

    下图中不同字体font-size都是100px



    测量了一下每个 span 的高度:Helvetica 115px,Gruppo 97px,Catamaran 164px。

    所以,font-size 相同,font-family 不同,得到的 span 元素的高度也不同,为什么会这样呢,我们先了解下字体设计时,字符的结构:

    一款字体会定义一个 em-square,设计时,宽高可以定位1000、 1024、2048px,显示到屏幕时上时,根据实际的font-size进行缩放,比如em-square为1000,font-size为100时,会把字体缩小到十分之一,但是字体的实际内容区域并不局限于em-square,它可以超出em-square,如下图所示:



    下图是一个字体设计时,需要指定的各个部分,每个部分都要设置特定的值



    图中ascender+ descender的高度就是字体中每个字符占据的高度(content-area)(实际显示时,是根据font-size大小来缩放的)(各个字符实际显示的高度可能不一样,如图中h和j,但是同一个字体,font-size相同的情况下,content-area都是一样大的)

    图中ascender+ descender+line gap(leading)的高度,就是默认情况下,line-height的高度(line-height的默认值是normal)(实际显示时,是根据font-size大小来缩放的,且图中line gap(leading)部分的高度会等分为两半分别显示在content-area的上方和下方)

    em-square只是字体设计中一个初始的框,字体的设计大小并不会局限在em-square里,所以em-square会小于或等于content-area,但是实际显示时,计算缩放比是根据em-square的大小和font-size的大小来计算的

    我们可以在把一款字体放到 FontForge 中,分析它的字体度量:



    可以看到在这款字体中,em-square是1000,content-area是 1100 + 540=1640,当我们把font-size设置为100时:

    content-area = (100/1000)*(1100 + 540)=164

    如果没有设置line gap,line-height默认值为164

    我们还能看出大写字母的高度是 68px,小写字母的高度(x-height)是 49px。



    结论:定义某个字体为100px时,其实际占据高度(content-area)大于或等于100px,默认情况下(line-height:normal),所在行的line-height大于或等于content-area

  • 设置line-height的值

1.line-height的默认值是normal,上一条中说过,它的高度是ascender+ descender+line gap

2.line-height可以设置为具体的值,比如100px,这个值可以大于content-area的值,也可以小于content-area的值,line-height和content-area的差值叫leading(字体设置时,可以指定初始的leading,即line gap),这个值会等分为两半分别显示在content-area的上方和下方,leading为负值时,也是上下平分

我们看下leading为负值的例子:

  1. <!DOCTYPE html>
  2. <html>
  3. <head lang="en">
  4. <meta charset="UTF-8">
  5. <title>test</title>
  6. <style>
  7. .div1 {
  8. font-size: 100px;
  9. line-height: 50px;
  10. background-color: red;
  11. }
  12. </style>
  13. </head>
  14. <body>
  15. <div class="div1">div1</div>
  16. </body>
  17. </html>



没有定义height的情况下,height默认为 line-height,background-color的高度跟height一致

可以看到content-area超出了 line-height,超出部分上下平分

接下来,我们定义div1的height:

  1. <!DOCTYPE html>
  2. <html>
  3. <head lang="en">
  4. <meta charset="UTF-8">
  5. <title>test</title>
  6. <style>
  7. .div1 {
  8. font-size: 100px;
  9. line-height: 50px;
  10. background-color: red;
  11. height: 100px;
  12. }
  13. </style>
  14. </head>
  15. <body>
  16. <div class="div1">div1</div>
  17. </body>
  18. </html>



背景色跟随height变高了,因为line-height还是50px,div1这个块可以显示多行,默认都是从左上角开始第一行的显示,改变height并不会改变div里面的某一行,具体某一行的状态(高度,位置)并不因整个div的高度改变而改变,他们之间没有直接的关联性

设置height不能改变行内内容的位置,设置line-height可以改变位置,因为leading部分要上下平分

通常利用line-height让inline元素垂直居中(img是特殊的inline元素),block或inline-block子元素并不能通过这个方法垂直居中

我们看下多行显示, line-height小于content-area的话,有可能出现多行重叠:

  1. <!DOCTYPE html>
  2. <html>
  3. <head lang="en">
  4. <meta charset="UTF-8">
  5. <title>test</title>
  6. <style>
  7. .div1 {
  8. font-size: 100px;
  9. line-height: 50px;
  10. background-color: red;
  11. border: 1px blue solid;
  12. }
  13. .div2 {
  14. font-size: 100px;
  15. line-height: 50px;
  16. background-color: red;
  17. border: 1px blue solid;
  18. }
  19. </style>
  20. </head>
  21. <body>
  22. <div class="div1">div1</div>
  23. <div class="div2">div2</div>
  24. </body>
  25. </html>

3.line-height还可以设置成一个数字

line-height:1 就是一个很糟糕的实践。当 line-height 的值是一个数字时,其实就是相对 font-size 的倍数,而不是相对于 content-area。所以 line-height:1 很有可能使得 virtual-area(line-height) 比 content-area 矮,从而引发很多其他的问题

vertical-align

  • vertical-align用于调整行内元素(inline,inline-block)在行内的对齐方式,从而改变行内元素的位置,可以用它来实现垂直居中显示等效果

  • vertical-align对block元素无效

  • vertical-align默认是基线(baseline)对齐,即元素的基线跟父元素的基线对齐

    字母x的下边缘即基线



    1.父元素没有行内元素之前,可以想象里面加个字符x,x的下边缘就是基线(比底部高一点),有了行内子元素,基线是最后一个行内子元素的基线

    2.非图片行内元素、非空且overflow属性为visible(默认是visible)的行内元素,基线是最后一个作为内容存在的行内子元素的基线

    3.图片、空的行内元素、非空但overflow属性不为visible的行内元素,基线在元素底部

    4.纯文字可以看做是特殊的inline元素(跟外面包着span一样)

    示例1-图片或空的行内元素底部间隙

  1. <!DOCTYPE html>
  2. <html>
  3. <head lang="en">
  4. <meta charset="UTF-8">
  5. <title>test</title>
  6. <style>
  7. .div1 {
  8. background: red;
  9. }
  10. .div2 {
  11. display: inline-block;
  12. height: 50px;
  13. width: 50px;
  14. background: blue;
  15. }
  16. </style>
  17. </head>
  18. <body>
  19. <div class="div1">
  20. <div class="div2"></div>
  21. </div>
  22. </body>
  23. </html>



没加入div2前,div1的基线可以在里面加个x确定,加入空的div2(inline-block),div2的基线在底部,它的底部要跟x的底部对齐,所以底下会留有空隙

解决这个空隙的几个方法:

1.div2设置vertical-align: bottom

2.div1设置 font-size: 0px; 字体高度为0,自然没有了基线和底部的距离

3.div2显示为block,block元素不存在基线对齐

如果在div2前面先加入一个x,html按顺序渲染,先渲染字符x,此时行基线在x底部,再加入div2,div2的底部要对齐x的底部,就会撑高div1,保证基线对齐,所以效果跟单独一个div2一样

同样,在后面加入一个x效果也一样

把div2换成img效果也一样

示例2:

  1. <!DOCTYPE html>
  2. <html>
  3. <head lang="en">
  4. <meta charset="UTF-8">
  5. <title>test</title>
  6. <style>
  7. .div1 {
  8. display: inline-block;
  9. height: 50px;
  10. width: 50px;
  11. background: red;
  12. }
  13. .div2 {
  14. display: inline-block;
  15. height: 50px;
  16. width: 50px;
  17. background: blue;
  18. }
  19. </style>
  20. </head>
  21. <body>
  22. <div class="div1">
  23. </div>
  24. <div class="div2">
  25. div2
  26. </div>
  27. </body>
  28. </html>

效果图:

html按顺序渲染,加入div1后,此行的基线在div1底部,再加入div2,div2的的基线在里面的x字符底部,div2的基线要跟整行的基线对齐,所以出现这个效果,如果div1里面有内容,两个div会并排对齐

  • vertical-align:top/bottom

    vertical-align:top/bottom是把设置了此属性的行内子元素的上/下边缘(如果定义了height,就是height的边缘,否则是line-height的边缘)跟此行的上/下边缘对齐

    实例1
  1. <!DOCTYPE html>
  2. <html>
  3. <head lang="en">
  4. <meta charset="UTF-8">
  5. <title>test</title>
  6. <style>
  7. .div1 {
  8. height: 100px;
  9. background: red;
  10. }
  11. .div2 {
  12. display: inline-block;
  13. height: 50px;
  14. width: 50px;
  15. background: blue;
  16. vertical-align: bottom;
  17. }
  18. </style>
  19. </head>
  20. <body>
  21. <div class="div1">
  22. <div class="div2">
  23. div2
  24. </div>
  25. </div>
  26. </body>
  27. </html>

运行后发现,vertical-align: bottom没有改变div2的位置,这是因为,div2只是显示在div1的一行里,vertical-align定义的是行内的对齐,div2定义了height,div1的这一行里只有div2,所以高度跟div2一致,他们的显示区域重合,所以top或bottom对齐都是没用的,因为本来就一样高,top和bottom都是重合对齐的

我们在div1里加上line-height试试:

  1. <!DOCTYPE html>
  2. <html>
  3. <head lang="en">
  4. <meta charset="UTF-8">
  5. <title>test</title>
  6. <style>
  7. .div1 {
  8. height: 100px;
  9. background: red;
  10. line-height: 100px;
  11. }
  12. .div2 {
  13. display: inline-block;
  14. height: 50px;
  15. width: 50px;
  16. background: blue;
  17. vertical-align: bottom;
  18. }
  19. </style>
  20. </head>
  21. <body>
  22. <div class="div1">
  23. <div class="div2">
  24. div2
  25. </div>
  26. </div>
  27. </body>
  28. </html>

效果图:

div1的行高设置为整个div1高度,div2的下边缘要与之对齐,由于line-height的继承性,div2的line-height也是100px,div2中的文字会居中(leading上下平分),所以div2的文字会超出下边缘

我们设置div2的line-height: normal;,效果图如下:



这时候就完全对齐了,div2也可以容纳多行文字,从左上角首行开始显示

再看一个例子

  1. <!DOCTYPE html>
  2. <html>
  3. <head lang="en">
  4. <meta charset="UTF-8">
  5. <title>test</title>
  6. </head>
  7. <body>
  8. <style type="text/css" rel="stylesheet">
  9. .content {
  10. height: 200px;
  11. background-color: red;
  12. line-height: 200px;
  13. }
  14. </style>
  15. <div class="content">
  16. <span style="background-color: blue;vertical-align: top;line-height: 1;">abcdxp</span>
  17. </div>
  18. </body>
  19. </html>

显示效果:



span的line-height设置为font-size的1倍,但是content-area大于font-size,所以span会往上超出一点

指定具体数值来调整元素垂直对齐(正数升高,负数下降)

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <style type="text/css">
  6. </style>
  7. </head>
  8. <body>
  9. <img src="./test.png" style="width: 100px;height: 100px;">
  10. <span style="vertical-align: 40px;">链家地产</span>
  11. </body>
  12. </html>

  • vertical-align:middle

    将子元素盒子的垂直中点与父盒子的baseline加上父盒子的x-height的一半位置对齐(baseline再向下偏移x-height的一半,x-height是父元素中x元素font-size的一半,要去除这个一半,可以设置父元素fontsize为0)

    把上例中vertical-align: 40px改为vertical-align:middle,效果如下:



    如何使用 vertical-align:middle让行内子元素在父元素中垂直居中呢?

    示例1:
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <style type="text/css">
  6. div {
  7. display: inline-block;
  8. }
  9. </style>
  10. </head>
  11. <body>
  12. <div class="div1" style="background-color: aqua;height:100px;width: 100px;">
  13. <div class="div2" style="background-color: blueviolet;height:50px;width: 50px; vertical-align: middle;"></div>
  14. </div>
  15. </body>
  16. </html>

效果图:



并没有垂直居中,是因为div2只是div1中的一行,只能在这一行里偏移,所以必须设置div1的行高足够才能偏移,把父元素行高设置为100px可以实现近似居中(还向下偏移了div1中x字符高度的一半),再把div1的fontsize设置为0就可以居中

  • 可以利用display:table和vetical-align使得内容垂直居中
  1. <!DOCTYPE html>
  2. <html>
  3. <head lang="en">
  4. <meta charset="UTF-8">
  5. <title>display:table实现垂直居中</title>
  6. </head>
  7. <body>
  8. <style type="text/css" rel="stylesheet">
  9. .table {
  10. display: table;
  11. margin: 5px;
  12. width: 500px;
  13. height: 300px;
  14. background-color: #ccc;
  15. }
  16. .cell {
  17. display: table-cell;
  18. padding: 10px;
  19. vertical-align: middle;
  20. }
  21. </style>
  22. <div class="table">
  23. <div class="cell">内容内容内容内容内容内内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容</div>
  24. </div>
  25. </body>
  26. </html>

即使cell里面是一个div,也会垂直居中

vertical-align和line-height的理解及实例的更多相关文章

  1. What is Vertical Align?

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

  2. Socket 的理解及实例

    Socket 的理解及实例Socket 的理解TCP/IP要想理解socket首先得熟悉一下TCP/IP协议族, TCP/IP(Transmission Control Protocol/Intern ...

  3. 关于Vertical Align的理解

    1:vertical-align 翻译就是垂直-对齐... 2:关于line-height的点 2.1:如果一个标签没有定义height属性,那么其最终表现的高度一定是由line-height起作用. ...

  4. Backtracking line search的理解

    使用梯度下降方法求解凸优化问题的时候,会遇到一个问题,选择什么样的梯度下降步长才合适. 假设优化函数为,若每次梯度下降的步长都固定,则可能出现左图所示的情况,无法收敛.若每次步长都很小,则下降速度非常 ...

  5. 浏览器兼容CSS代码:按钮文字垂直居中(input button text vertical align)

    经过测试的浏览器:IE6, IE7, IE8, IE9, Firefox, Chrome, Safiri, Maxthon 按钮的HTML代码: <input id="btn_comm ...

  6. How to Take Control of Your Line Height in Outlook.com

    Reference to: http://www.emailonacid.com/blog/details/C13/line_height_and_outlook.com

  7. 深入了解css的行高Line Height属性

    什么是行间距? 古时候我们使用印刷机来出来文字.印刷出来的每个字,都位于独立的一个块中. 行间距,即传说中控制两行文字垂直距离的东东.在CSS中,line-height被用来控制行与行之间垂直距离. ...

  8. 前端知识点回顾之重点篇——CSS中vertical align属性

    来源:https://www.cnblogs.com/shuiyi/p/5597187.html 行框的概念 红色(line-height)为行框的顶部和底部,绿色(font-size)为字体的高度, ...

  9. CNN中的池化层的理解和实例

    池化操作是利用一个矩阵窗口在输入张量上进行扫描,并且每个窗口中的值通过取最大.取平均或其它的一些操作来减少元素个数.池化窗口由ksize来指定,根据strides的长度来决定移动步长.如果stride ...

随机推荐

  1. Oauth2的使用(第三方授权登录)

    例子: 京东商城 ,微博 ,用户三者之间的关系 第一方:用户 第二方:京东商城 第三方:微博 用户不希望在京东商城上注册,可以授权微博使用微博上的用户信息进行登录京东商城. 授权流程: 地址一:授权页 ...

  2. AVR单片机教程——PWM调光

    本文隶属于AVR单片机教程系列.   PWM 两位数码管的驱动方式是动态扫描,每一位都只有50%的时间是亮的,我们称这个数值为其占空比.让引脚输出高电平点亮LED,占空比就是100%. 在驱动数码管时 ...

  3. TensorFlow or PyTorch

    既然你已经读到了这篇文章,我就断定你已经开始了你的深度学习之旅了,并且对人造神经网络的研究已经有一段时间了:或者也许你正打算开始你的学习之旅.无论是哪一种情况,你都是因为发现你陷入了困惑中,才找到了这 ...

  4. java byte/short/char补充(了解)

    1.在数学运算中会自动提升数据类型为 int 2.在基本赋值中,若右册的常量不超过取值范围,javac 添加 强制转换,否则报错 3.若右册 含有 变量 而不是直接使用常量相加,编译报错 例子 pub ...

  5. http的异步请求

    需要用到的包(包版本应该可能不同): httpcore-4.1.4.jar httpsayncclient-4.0-alpha3.jar httpcore-nio-4.2-alpha3.jar /** ...

  6. 小白学Java:内部类

    目录 小白学Java:内部类 内部类的分类 成员内部类 局部内部类 静态内部类 匿名内部类 内部类的继承 内部类有啥用 小白学Java:内部类 内部类是封装的一种形式,是定义在类或接口中的类. 内部类 ...

  7. linux下误清用户/home下的文件怎么办?

    2016-08-19 10:38:10   有时候我们不小心把home目录下的用户目录删除了,出现上图情况,每行开头直接变成-bash-3.2$这种形式而不是[lyp@centos7 ~]$这种,这时 ...

  8. docker扫盲,面试连这都不会就等着挂吧!

    现在很多公司项目部署都是采用K8S docker容器方式,出门面试被问的概率极大,如果被面试官问docker相关知识点直接懵逼,那么基本就是被pass了,除非其他方面技术过硬.所以这种相对前沿的技术, ...

  9. 基于Flask框架搭建视频网站的学习日志(三)之原始web表单

    基于Flask框架搭建视频网站的学习日志(三)1.原始Web 表单 本节主要用于体验一下前端后端直接数据的交互,样例不是太完善,下一节会加入Flash处理,稍微完善一下页面 (备注:建议先阅读廖雪峰老 ...

  10. DNS隧道工具:iodine使用

      iodine可以通过一台dns服务器制造一个IPv4数据通道,特别适合在目标主机只能发送dns请求的网络中环境中使用.iodine是基于C语言开发的,分为服务端程序iodined和客户端程序iod ...