详细了解line-height和vertical-align

vertical-align

先看一个例子

<div id="text" style="border: 1px solid #ccc;height:15rem;">
    <span style="vertical-align:bottom;border: 1px solid #ccc;display:inline-block;height:2rem">假设我是一个有内容的inline-block</span>
    <span style="border: 1px solid #ccc;font-size:5rem;vertical-align:baseline;">我的fontSize=5rem</span>
    <span style="vertical-align:baseline;border: 1px solid #ccc;display:inline-block;height:2rem;width:1rem;"></span>
    我是一个不存在的x
</div>

测试图片

上面有一个block盒子,一个line盒子和3个inline(inline-block)盒子,一个文字(匿名)盒子,通常情况下就算盒子内没有文字也会存在一个宽度为0的匿名文字盒子(如果完全是个空盒子则没有)
block盒子就是div,line盒子是由其内部的盒子组合起来的,注意line盒子是由其内部的盒子撑开的,无论div设置多大的高度都和line盒子的大小无关
vertical-align的值,常用的分别有baseline(默认),top,bottom,middle,text-top,text-bottom,sub,super,数值(px,em...),百分比.下面只谈inline(inline-block)盒子的属性值的效果

  • baseline(默认值)
    基线,盒子的基线大约在其内部文字(匿名)盒子英文字母X的下边缘(不同的字体不同),img标签和空盒子的基线盒子的下边缘,在比如上图中的line盒子的基线就是上图中我是一个不存在的x中x的下方,第一个span的基线就在英文字母i的下边缘,第二个span的基线就在盒子的下边缘,设置为baseline就是让盒子本身的基线和line盒子的基线对齐
  • top
    顶线,盒子自身的顶部,设置为top是让盒子自身的顶线和line盒子的顶线对齐
  • bottom
    底线,盒子自身的底部,设置为top是让盒子自身的底线和line盒子的低线对齐
  • middle
    中线,盒子自身的中间,注意设置此值不是和line盒子的中线对齐,注意设置此值不是和line盒子的中线对齐,注意设置此值不是和line盒子的中线对齐
    w3cshoole直接说,middle是把此元素放置在父元素的中部,这应该是不对的
    应该是和line盒子中文字(匿名)小写x字母的中线对齐,line盒子中文字(匿名)小写x字母的中线对齐,line盒子中文字(匿名)小写x字母的中线对齐,比如这样
    测试图片

    如果比文字(匿名)盒子高的盒子设置为middle,会让文字(匿名)盒子上浮,盒子的基线也会改变,可以理解为比文字(匿名)盒子高的盒子与line盒子中文字(匿名)小写x字母的中线对齐后,比文字(匿名)盒子高的盒子下沉,line盒子的高度也跟着下沉,比如这样
    测试图片

    middle的值只和文字(匿名)有关,我觉得和属性的名字不相符,也搞得很复杂,难道是我理解的问题?后面会说用middle和line-height居中对齐
  • text-top
    元素本身的基线与line盒子中文字(匿名)的顶端对齐,注意不是文字所在的匿名文字盒子的顶端
  • text-bottom
    元素本身的基线与line盒子中文字(匿名)的底端对齐,注意不是文字所在的匿名文字盒子的底端
  • sub
    元素本身的基线与line盒子中文字(匿名)的下标对齐
  • super
    元素本身的基线与line盒子中文字(匿名)的上标对齐
  • 数值(支持负值)
    元素本身基于line盒子基线的偏移
  • 百分比
    和数值一样,不过基于父元素的line-height计算,也就是line盒子中文字盒子(匿名)的line-height

line-height

line-height顾名思义,我觉得就是设置line盒子的最低高度,比如下图中,设置div的line-height为3rem就是设置div盒子中line盒子的最低高度为3rem,设置span的line-height为5rem就是设置span盒子中line盒子的最低高度为5rem

测试图片

<div id="text" style="border: 1px solid #ccc;position:absolute;height:8rem;line-height:3rem;">
    <span style="vertical-align:baseline;border: 1px solid #ccc;display:inline-block;font-size:1rem;line-height:5rem;">我的line-height为5rem</span>
    我是第一行我的line-height为5rem
    <br/>
    我是第二行我的line-height为3rem
</div>

div中有两个line盒子,第一个是由内部撑开的5rem,第二个是设置div的3rem
红框我把它称作行内间距,注意是行内间距,不是行间距,不是line盒子和line盒子之间的间距,我的理解是line盒子和line盒子之间是没有间距的,但是line盒子本事,有行内上间距和行内下间距,他们是相等的,都等于(line盒子的高度-font-size)/2,上面一共有六个行内间距,div盒子内两行的4个和span盒子中一行的2个
line-height常用的值有normal(初始值),数字(不是数值),数值(px,em...),百分比,inherit(默认值)

  • inherit(默认值)
    继承父元素的值
  • normal(初始值)
    这个值在不同的font-size和浏览器下有所不同,一般为1.2左右
  • 数字(推荐使用)
    1,1.1,1.2,1.3...这个值是自身font-size的倍数,比如设置为1,那么行内间距就会(line-height-font-size)/2=0,所以看起来文字之间就会没有间距
  • 数值
    设置固定的数值,如果设置为em,就会根据当前盒子font-size的大小计算出一个固定的值,后代会继承此值
  • 百分比
    还是设置固定的数值,根据当前font-size的大小计算,后代会继承此值

记录几种用line-height和vertical居中的方法

  • 单行文字在blcok中居中
    设置外部block的line-height和height相等,可以不设置height的值,设置了line-height,height会自动计算等于line-height
  • 多行文字在block中居中
    同样设置外部block的line-height和height相等,将内部包含文字的block元素display:inline-block;line-height:normal;vertical-align:middle;如下图所示
    测试图片
<div id="text" style="border: 1px solid #ccc;position:absolute;height:8rem;line-height:8rem;">
    <p style="line-height:normal;vertical-align:middle;display:inline-block">我是多行文字<br/>我真的是多行<br/>其实只有三行了</p>
</div>

其实上面的并不是真正的垂直居中,只是近似垂直居中,因为字母x的中间并不一定是line盒子的中间,会稍微偏下一点点,要真正的垂直居中,要将外部block盒子的font-size设为0,内部block盒子的font-size设置为正常值就是真正的垂直居中了

  • 单个图片
    和上面的一样,图片本身就是inline-block
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容