c++ list box 字体设置_关于字体对齐那些事

作者:timCope

前言

前端开发中我们经常会遇到文字垂直居中的场景,这是候我就会使用line-heightvertical-align等css属性去调整文字的位置,但是实际我对这块内容一直是比较模糊的,未免有一些一叶障目了,因此在这里对这块内容进行整理总结,希望之后再遇到此类情况时可以做到成竹在胸。

5b4830b4631ca09e3348a8391a031223.png

字体相关概念

在进入本文正题之前,我们需要了解一下字体的简单概念,和我们小时候在四线簿上写字是一样的,在浏览器中,字体的展示也是有四条线的,我们将其称为 top middle base bottom,而我们下面所介绍的css属性都是与这四条线相关的,在网上找了一张图,四条线大抵是这样的。

32dbb29829b3de768bdc8706e49f8106.png

baseline

基线就是图中标红的那个线,所有字符都基于这条线进行定位。在各种内联相关模型中,凡是涉及到垂直方向的排版或者对齐的,都离不开基线。而基线的定位来源于字母中的x,x的下边缘就是基线的位置,而基线与中线的之间的距离也被称为x-height就是小写x的高度。1ex就是x-height的值。

line-box

除了平常我们经常能接触到的盒模型(block-box),line box是就相对来的陌生了,下面我用一张图来介绍line-box

bfb91fd60eba873a0c9ea0c2c0a8f9c8.png

每行内容由多个内联元素组成,每一行都叫做一个 line-box。而一行中包含了很多子元素,我们称之为inline-box,inline-box不会让内容成块显示,而是排成一行。inline-box一般有两种,内联标签或者是包含文本的匿名内联元素。每它的高度,由行内最大line-height决定。

铺垫了不少,我们现在就是进入正题吧。

content-area

content-area是指文字内容区域,它的大小和文字的大小,字体类型有关。

font-size

前端开发中我们会使用font-size来设置文字的大小,假设那么我们设置的字体是12px,就代表着top line(顶线)和bottom line(底线)的距离为12px。同时引入啦em这个单位,1em也就是这个font-size的值。

font-family

前端开发中我们会使用font-family来设置文字的字体,不同的字体所展示的content-area也会导致不同,就像下面的图片所示,当然这块显示背景的区域不算是完整意义上的content-area,只是因为在高度未设置的情况下,content-area的高度和line-height相同罢了。

0aabb1492057322d10b5302fd7523801.png

line-height

Line-height是指文本行基线间的垂直距离,它决定line-box的高度,由于我们看不见line-height和content-area的高度,行高同时决定来文本之间的间距,line-height的默认值normal,就是为了设置一个合适的行间距。

我们上面已经了解了,line-heght在height未固定是和content-area相一致的,而当高度确定时line-heght 和 content-area 高度会有一定差异,而这个差异就叫做 leading,leading是可正可负的,意味着实际行高可能低于文字的内容高度。leading和我们下面要介绍的行距类似,都是被查拆两分,加到内容的两端,区别在于,半间距是加在font-size的两端,leading是加在content-area两端(这部分可能有点绕)用偷来的图表示如下

b4d9681948d17bb037e3d4e9bc0146a6.png

因此当line-height 和height相等时由于会有半行距,文字会自然垂直居中。

vertical-align

vertical-align也是我们在文字对齐中,经常使用的一个属性,与text-align类似,vertical-align代表这个文字在垂直方向的位置。vertical-align的默认值为baseline,代表着文字的是以baseline进行定位的,我们有时会利用vertical-align:middle来实现元素的居中也就是元素上、下边的中点与行盒子基线加上x-height的一半对齐。用下图可以更清晰的表达,不同值元素对应的位置。

416cf5691bb4856cce2a6d9b6067f06b.png

而vertical-align,取值是百分数值时,是相对于此标签继承的line-height值决定的。

vertical-align的其他属性,这里就不赘述啦,感兴趣的可以去专业的w3c规范里寻找。

为什么有时候vertical-align会失效

vertical-align起作用是有前提条件的就是vertical-align只能应用于inline,inline-block,table-cell的元素。在css中,如果设置一些类似float,position: absolute之类的样式,会改变元素的display值从而导致vertical-align也就失去作用。

如何达到文本对齐的效果呢?

了解行盒子的基线和上、下边界在哪儿?

3d786f0daf95ed84d1ffd1d136a865f5.png

了解了行盒子的上下边界也就是我们就可以设置行内元素的line-height和行盒子的高度一致,就可以使得不用字体大小的文字进行居中。

了解行内元素的基线和上、下边界在哪儿?

70c82ed5a8c2aa633805d99d898b8515.png

针对这个问题我需要了解行内元素的基线如果一个inline-block元素,里面没有内联元素,或者overflow不是visible,则该元素的基线是其margin底边缘;否则其基线就是元素里面最后一行内联元素的基线。我们只需要将第一个元素的vertical-align设置为top这样两者就想上对齐啦,在包裹一个父元素使其居中即可

f7bfda74a1aea06ba139d27c70c7065f.png

参考

1.CSS深入理解vertical-align和line-height的基友关系

2.深入理解 CSS:字体度量、line-height 和 vertical-align

写在最后

关于文字对齐的问题,就写到这里啦,作为css中算是最复杂的一块内容了,经过这一次总结,我对于文本的展示形式也有了一个比较深刻的印象,之后如果有遇到这类问题,也会做一个记录总结。这篇文章是我个人的总结和理解,内容中可能存在一些不合理不正确的地方,希望各位不吝指正。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值