html table设置行高_字号与行高

fb3b4e6517ac014da69b2afda8fb9a94.png

1. 什么是字号与行高

什么是字号大小?字号大小就是字体的高度,例如设置字号为50px,那么它的高度如下图所示:

b04de354d6abd7912e0256dd2ef68e7a.png

什么是行距呢?如下图所示:

0af7329ef6aefff3a140caacb361970e.png

其中半行距 = (lineHeight – fontSize) / 2。

但是实际上,font-size经常不等于渲染的高度,如下图所示:

beadfe6d20d149be669bd03c2ca045db.png

对于笔者用的ProximaNova这个字体,设置font-size为30px,实际上高度为42px。为什么文字的高度不等于字号的高度?这得从字体设计说起。为此装了一个FontForge和RoboFont软件设计一款自己的字体。

2. 设计字体

打开RoboFont,如下图所示:(这个软件经常闪退,需要注意保存)

fddc15e5659cf9a0744e9ad74e1a0d63.png

双击l和y两个字母,用钢笔工具勾勒形状,如下图所示:

b7f369bdd25525a122e7702e2ffa9dd3.png

从上图可以看到它有一些刻度和度量线,画一个示意图如下所示:

06cdf8790d764cf60e70ea44a9912d35.png

这些度量线的位置可以自己设置:

2e6c77ff1220be9256d7c8cd43f805bb.png

Units Per Em表示一个字的高度有1000个单位,baseline的坐标为0,其它线的坐标相对于baseline,如下图所示:

f800a099f96f95cfe20989cfb5ce5374.png

然后把这个设计好的字体导出为my-font.ttf文件,在网页通过@font-face引入,如下代码所示:

@font-face {font-family: 'my-font';src:url('/Users/yincheng/Desktop/my-font.ttf');font-weight: normal;font-style: normal;
}

然后使用这个font-family,你会发现,这个字体的font-size和height几乎完全一致,如下图所示,分别设置font-size为35px、45px、55px:

b04e9b07dd543f9854073f04477a3bc1.png

为什么我们设计的字体会如此“完美”,而其他人的字体高度总是要大一点呢?

3. 为什么字体高度大于字体大小

为此我们用FontForge打开ProximaNova.ttf,因为这个软件可以查看字体的更多信息,就是界面丑了点。如下图所示:

f3a8b6f65cd323c5755ec0c5c67867ee.png

然后点击Element -> FontInfo,切到OS/2的Metric标签,如下图所示:

68d390daa795e8b58e63353a5bc85a68.png

把鼠标放到相应的输入框,FontForge会提示你Windows系统是使用Win Descent和Ascent决定字体内容高度,而Mac是用的HHead Descent和Ascent。上面字体在Mac下的Ascent为1079,Ascent为-336,如下图所示:

65745320f16eaccaef23bf4402c8305f.png

同时它的units of em仍然是1000,如下图所示:

16ab0742679823d75aa0c3c361dcbf93.png

而它的内容区域content-area大小为1079 - (-336) = 1415是font-size 1000 unit的1415 / 1000 ~= 1.4倍,这就解释了一开始提出的问题:

beadfe6d20d149be669bd03c2ca045db.png

设置font-size为30px,实际上显示42px,因为30 * 1.4 = 42px,为进一步验证,把我们设计的字体my-font改一下它的Ascent,如下图所示:

2e0b40cc207d12ad489b9aee55b21549.png

这样它的内容区域高度就变成了1250unit,是字号大小的1.25倍,导出为一个新的字体,在网页上使用,如下图所示:

8811654cb63bbe530b6e7c28d19478b5.png

设置font-size为50px,它的content-area高度为50 * 1.25 = 62.5px。这就证明了上面的分析是对的。

那么为什么设计师们要这样搞呢,为什么不控制在1000个unit的范围内?首先因为常用的unit per em为有以下几个值:

d367a03bb1cba221f56e857072b370e0.png

如果你的unit选得越大,那么曲线的光滑粒度可控制得更细,如下图所示:

b0aff4a7f13e1fa7fd7257768f098a19.png

但是如果选1000的话,因为它是一个整千,比例什么的应该会比较好控制。

其次,大于1000可以让可控制的区域更大,一般不会让字刚好撑到底线和顶线,如下图所示:

81e95c23983d831f74daf90869b5b8ea.png

4. 字体的宽度

可以在RoboFont里面设置每个字的宽度,例如y这个字母我要让它比z占的空间小一点,如下图所示:

23c3d6e0049eb3d06885f7f1b5dc227c.png

y为400,z为500,也就是说y的宽度为高度的0.4,z的宽度为高度的0.5,因为高度是1000.

font-size为50px的时候,4个yz的宽度为180px,如下图所示:

4dd87c11e22cb0249f537e9e1c989b75.png

因为:(50 * 0.4 + 50 * 0.5) * 4 = 180px。

再讨论一个经典的问题。

5. 图片底部的空白

有以下html:

<div style="border:1px solid #ccc"><img src="/Users/yincheng/Desktop/2.png"></div>

在浏览器下面显示为:

b1a86478719ecbdefc511ffaba401b0f.png

为什么图片不是和div底部贴在一起,而会有一点空白呢?

先来看一下这个空白有多大,如下图所示,设置div的font-size为40px,line-height为60px:

3c278272f363daf792a8eb30f14a5102.png

div的高度为174,图片的高度为154,因此这里空白的高度为174 - 154 = 20px。

为了辅助说明,在img的后面跟上几个字母,如下代码所示:

<div class="img-container"><img src="/Users/yincheng/Desktop/2.png">lyz</div>

画上辅助线:

5b707c32c96a61ced2f4e6a4ab178b3f.png

这段空白的距离就是基线baseline到div底边的距离。由于基线的坐标是0,底线的坐标为-250,所以基线到底线的距离为:

250 / 1000 * 40 = 10px

由于行高为60px,font-size为40px,所以底线到div的距离即半行距为:

(60 - 40)/ 2 = 10px

因此基线到div底边的距离就为:

10px + 10px = 20px

到这里就解释了为什么会有空白,以及空白的大小怎么计算。

那怎么去掉这段空白呢,可以设置div的行高为0。并且需要注意的是在怪异模和有限怪异模式下,为了计算行内子元素的最小高度,一个块级元素的行高必须被忽略,所以即使不设置div的行高为0,图片也是和div贴在一起的。这个我们在《从Chrome源码看浏览器如何构建DOM树》讨论过。

参考:

1. 深入了解CSS字体度量,行高和vertical-align

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/567411.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux 用户名为没有名字 报错:cannot find name for user ID

经过一系列用户权限更改后&#xff0c;切换到普通用户&#xff0c;失败&#xff0c;报错如下&#xff1a; 解决方案&#xff1a;这个问题是因为普通用户没有权限读取/etc/passwd和/etc/group文件造成&#xff0c;添加权限即可。 转载自&#xff1a;id: cannot find name for us…

xposed hook 静态函数_浅谈 Xposed 新概念【模块作用域】

众所周知&#xff0c;Xposed 是一个系统级别的软件框架&#xff0c;它与 Cydia Substrate 不同&#xff0c;Xposed 仅可 hook app_process 中的 java 函数&#xff0c;不过对于大部分的 Android 应用来说已经足够了&#xff1b;它所提供的 API 可以供模块开发者在不修改目标应用…

adc0808温度换算公式_温湿度传感器的三种模拟量换算关系

气候的变化常常会导致空气当中的湿度以及温度随之而产生相应的变化&#xff0c;如果想及时感知空气中温湿度的变化&#xff0c;那就需要温湿度传感器。在日常生活中&#xff0c;温湿度传感器种类有很多&#xff0c;按照数据上传方式分有RS485型温湿度传感器、模拟量型温湿度传感…

共阳数码管段码表_简单共阴极数码管电路图大全

共阴极则是把所有LED的阴极连接到共同接点com&#xff0c;而每个LED的阳极分别为a、b、c、d、e、f、g及dp(小数点)&#xff0c;如下图所示。图中的8个LED分别与上面那个图中的A~DP各段相对应&#xff0c;通过控制各个LED的亮灭来显示数字。判断公阴极和公阳极找公共共阴和公共共…

linux find 报错路径必须在表达式之前

执行 find -name yum*,查看当前文件夹下以yum开头的文件。 报错路径必须在表达式之前&#xff0c;如下图所示&#xff1a; 解决方案&#xff1a; 会出现“find: 路径必须在表达式之前”的错误提示。解决的方法有两种 使用转义符把*转义&#xff0c;即 yum\*用引号引起来 &am…

css 动态生成圆形区域内扇形个数_CSS实用技巧总结

❝作者&#xff1a;幻灵尔依 (授权原创)https://juejin.im/post/5e0fef935188253a624a6a72❞《css揭秘》中讲了47个css技巧&#xff0c;其中有很多日常编码中并不会用到&#xff0c;本文除了将书中部分实用技巧罗列出来之外&#xff0c;还尝试用帮助读者搞明白background、anim…

python怎么返回上一行代码_一行Python代码能做出哪些神器的事情

原标题&#xff1a;一行Python代码能做出哪些神器的事情 &#xff08;1&#xff09;一行代码启动一个Web服务 python -m SimpleHTTPServer 8080 # python2 python3 -m http.server 8080 # python3 &#xff08;2&#xff09;一行代码实现变量值互换a, b 1, 2; a, b b, a &…

c++ string 字符_C/C++知识分享:C++标准库之 string 类型,各种运算全部掌握

简介:C标准库提供的类型&#xff1a;string。长度可变的字符串&#xff0c;操作简单仅为包含个人常用函数头文件string 类型与其它的标准库类型相同&#xff0c;都需要包含对应的头文件string 类型的定义和初始化string 类型的函数&#xff08;1&#xff09;字符串的赋值输入及…

为什么机油使用后变红_水泥固化剂的使用原理是什么,涂洒后时间为什么要足够长?...

水泥固化剂由于具有提高水磨地面的强度、硬度、使地面不起灰&#xff0c;抗压强度、抗腐蚀的能力&#xff0c;广泛应用于现代工厂、仓储、停车场、商场、超市的装饰材料。那么&#xff0c;水泥固化剂涂洒后时间为什么足够长呢&#xff1f;下面听听好牛环境科技的小编的意见吧&a…

CentOS虚拟机访问外部网络

这里写自定义目录标题虚拟机无网络测试解决方案1、设置VM&#xff08;关闭虚拟机&#xff09;2、查看当前IP、网关、子网掩码3、设置虚拟机IP、网卡、子网掩码虚拟机无网络测试 CentOS使用yum下载gcc时报错&#xff1a;cannot find a valid baseurl for repo:base/7/x86_64,百…

4x4矩阵键盘工作原理及扫描程序_基于复杂可编程逻辑器件实现键盘接口电路的设计...

1 引言无功补偿装置是用于补偿电网无功功率的不足&#xff0c;提高功率因数&#xff0c;保证供电系统安全运行和节约电能的设备&#xff0c;其核心是控制仪。本控制仪集无功补偿、电度量计量、电能质量监测及通信于一体&#xff0c;对电网参数进行实时采样与计算并把各项参数显…

python opencv轮廓检测_OpenCV 轮廓检测的实现方法

轮廓概述 轮廓可以简单认为成将连续的点&#xff08;连着边界&#xff09;连在一起的曲线&#xff0c;具有相同的颜色或者灰度。轮廓在形状分析和物体的检测和识别中很有用。 为了更加准确&#xff0c;要使用二值化图像。在寻找轮廓之前&#xff0c;要进行阈值化处理或者 Canny…

4.3 媒资管理模块 - Minio系统上传图片与视频

文章目录 一、上传图片1.1 需求分析1.2 数据模型1.2.1 media_files 媒资信息表 1.3 准备Minio环境1.3.1 桶环境1.3.2 连接Minio参数1.3.3 Minio配置类 1.4 接口定义1.4.1 上传图片接口请求参数1.4.2 上传图片接口返回值1.4.3 接口代码 1.5 MediaFilesMapper1.6 MediaFileServic…

如何有效开展小组教学_如何有效地开展小组合作学习——数学科主题教研活动...

教学中如何有效地开展小组合作学习——数学科主题教研活动2019年2月20日下午第三节课&#xff0c;我校数学科组进行了由马少清老师主讲的小学数学课堂教学中如何有效地开展小组合作学习教研活动。活动中马老师从营造和谐的合作氛围、认真组织、明确要求、优选内容、及时指导总结…

linux命令-管理用户

目录 一、导入 1、基础 2、切换用户 二、用户与用户组基本信息 1、用户基本信息: /etc/passwd 2、用户密码信息&#xff1a; /etc/shadow 3、用户组配置信息&#xff1a; /etc/group 4、用户组密码信息&#xff1a; /etc/gshadow 三、管理用户 1、添加用户-useradd命…

springboot配置文件_SpringBoot系列干货:配置文件详解

在Spring Boot中&#xff0c;配置文件有两种不同的格式:1.一个是application.propertiesserver.port8888server.servlet.context-pathdemo2.另一个是application.ymlserver:port: 8888servlet:context-path: /demo配置文件与配置类的属性映射方式person:name: zhangsanage: 18实…

activemq 开启监听_SpringBoot集成ActiveMQ怎么实现Topic发布/订阅模式通信?

上一期我们讲了SpringBoot集成activeMQ实现Queue模式点对点通信&#xff0c;这一期我们接着讲SpringBoot集成activeMQ实现Topic发布/订阅模式通信。发布/订阅模式通信是对点对点通信模式的扩展。Queue模式下一个人发送的消息只能由一个人接收&#xff0c;而Topic模式下&#xf…

电脑右击新建没有Word、Excel怎么办

方法/步骤 1.点击开始&#xff0c;找到运行命令行&#xff0c;输入regedit&#xff0c;打开注册表。 2.在左侧找到HKEY_CLASSES_ROOT目录&#xff0c;并展开。 3.利用CTRL F 快捷键&#xff0c;查找“docx”的位置&#xff0c;当然这里也可以自己下拉查找。 4.找到.docx,不用展…

实习日志_【人医札记】护理实习日志

实习日志&#xff1a;新起点01章莹 (河南鹤壁职业技术学院)盛夏七月&#xff0c;开始了我的实习生活……有幸可以来到兰溪市人民医院&#xff0c;经历了几十年风雨历程&#xff0c;一个花甲的峥嵘岁月&#xff0c;几十年璀璨硕果的积累&#xff0c;也让我对实习充满了期待&…

等价类划分法-案例剖析-设计测试用例

目录 等价类划分法概念 有效等价类和无效等价类 等价类设计测试用例步骤 案例1 案例2 案例3 等价类划分法概念 等价类划分法是把所有可能的输入数据&#xff0c;即程序的输入数据集合划分成若干个子集即等价类&#xff0c;然后从每个等价类中选取少量具有代表性的数据作为…