一点说明(个人吐槽,可以略过)

之所以想写这篇文章,是因为自己工作的经验总结。以前的页面编写极度不注重间距大小,特别是行级元素间距。认为只要差不多好就行了,没必要花那么大的精力去抠几px的小细节。事实证明这个想法大错特错,因为前期开发不注重这些细节,导致后期修改的时候被需求人员逼着一处一处的重新修改。不仅花费了大量的时间和精力(开发时间的好几倍,%>_<%),而且页面整得这里一块,那里一块,到最后我简直觉得就是个shit。虽然最后还是顺利上线,但完全是项目压力,以后还要花长时间彻底重构才行 ⊙﹏⊙b汗。前端工作任重而道远啊~~~~

本文是根据自己最近思考实践总结出来的,主要是针对行级元素距离的分析,并说明如何做到行级元素的精确设计。(彩蛋:未来将会实践并总结出块级元素间距影响以及精确设计,敬请期待)

本文地址: http://forkme.info/line-height-and-distance/或者http://www.cnblogs.com/blackmanba/p/line-height-and-distance.html, 转载请注明源地址。

示例:

本文使用的例子是最近写的页面其中一部分(只涉及本文内容),截图如下:

例子比较简单,代码就不给出了,字体大小是13px,行高(line-height)为1,文字那一行没有margin,padding以及border值。(ps:排除影响因素)

1. 为何inline元素间的高度不一样

首先我们看到的最明显的就是文字和图片的高度不一样,文字间距是3px,而日历图片的高度间距是0,下图是ps下放大倍数的高度间距:

产生这个问题的原因就是多个inline元素所产生的inline box。

简单来说,就是容器中每个行级元素都会产生一个inline box,而多个行级元素排成一行就会有多个inline box,即inline boxes。

举个例子:

<p>行级元素1<span>行级元素2</span>行级<em>元素3</em></p>

以上HTML有4个inline box,解释如下:

  • p元素是一个容器,包裹了整个行级元素
  • 不带标签的文字也是一个隐藏的行级元素

根据上面的解释,得出结论,所有行级元素分别是 行级元素1<span>行级元素2</span>行级以及<em>元素3</em> 四个inline box,而每一行都会有一个line box,其实就是每一行所有inline boxes。其高度取的是最高的inline box的高度。

要注意一点:如果inline box宽度超出容器而发生折行,此时每一行都会产生新的inline box

根据以上原理可以解释图中现象:每一行中,文字和图片都是inline box,它们共同组成了一个line box,line box的高度取决于inline box中最高的元素,图片是18px高,而文字是13px,所以line box高度是18px,并且文字产生垂直间距。

2. line-height元素介绍

很多同行应该都知道line-height会影响行级元素的高度,并且可以实现一些效果,比如垂直居中,详情可以参考我的另一篇文章元素垂直居中的各种实现方式。那么line-height的各种取值含义是什么?分别是怎样渲染的?下面一一道来:

line-height可取值:

  • line-height: normal
  • line-height: 3.5 /* <number> values */
  • line-height: 3px /* <length> values */
  • line-height: 34% /* <percentage> values */
  • line-height: inherit

说明如下:

  • normal:浏览器默认值,一般是1.2
  • 数值:根据具体的行级元素字体乘以数值计算得出
  • 高度:直接规定多少像素
  • 百分比:计算方式和数值一样,不同的是百分比值子元素也直接继承了父元素计算值
  • inherit:继承父元素值

一般情况下,建议使用数值,其他的值比较少用,因为数值能根据每个行级元素本身的字体大小计算出来,灵活性很高。

3. line-height对高度的影响

line-height值是如何影响高度的呢?

首先,让我们按照原来设定来构建一个新的测试用例:

  • line-height改为1.6

最终效如下:

间距如下图:

经过我的试验(目前只在firefox和chrome试验过,其他浏览器还没有测试),浏览器是这样渲染高度滴:

  • line box值:font-size值*line-height值
  • line box如果有小数,不管多大,全部舍弃(上面结果是13*1.6=20.8,结果是20)
  • 文字上下间距:(line box - font-size)/2
  • 如果不整除,上方间距小1px,下方间距大1px

4. line-height对line box背景图片影响

结论:背景图片大小是不会受line-height大小影响的,但是背景图片的高度取决于图片自身的高度和line box高度中的较大值,文字不仅会受到inline-height影响,同是也取决于自身高度和line box高度较大值。因为有上面的铺垫,得出这个结论比较简单。就不再举例说明了。

5. 进行精确的line box测量

这个其实是一个伪命题。怎么说呢?对于前端来说,同样的布局,效果可以用多种方式来实现,并没有固定的方式。这里主要是谈谈我的测量方法:

  • 查看文字的line-height值,根据font-size计算占据高度;
  • 测量同一行最高的inline box(非文字)高度;
  • 比较两者高度,两种情况:
  • 最高的inline box(非文字)比较高,采用其值,外面填上对应的其他间距即可;
  • 文字比较高,此时要算出文字上下占据的距离,最后将其他外间距和计算间距相减,得出距离;

结语

本文是根据自己最近实践总结出来的,主要是针对行级元素距离进行精确很细分析,并说明如何做到行级元素的精确设计。希望对您的学习有所帮助。随时欢迎交流意见,请在下方评论,多多益善!!

line-height与间距总总的更多相关文章

  1. 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

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

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

  3. 零零总总遇到过的CSS 样式

    1:添加弹出框阴影 2:禁止文本域缩放 3:直接使用CSS 完成文本内容大小写(针对英文) 4: 文本框中的占位符 5:让table每列一样高 6:不使用js 让内容换行 word-break 7:曾 ...

  4. spring boot部署到阿里云碰到的总总问题

    2375错误,我没装docker,从pom中删了吧 mysql,不能写本机对外,得写127.0.0.1. 如何生成jar包,在pom中写上jar <groupId>com.coding&l ...

  5. Pycharm的界面修改与基本设置

    Pycharm的一些基本设置 设置字体大小与字体样式 首先我们打开Pycharm,点击左上角File,找到sitting 点击后就能进入设置界面 xdm,我将介绍两种更改字体的设置 方法一 设置界面找 ...

  6. 多种方式实现平均分栏布局(有间距)div平分行宽

    以下例子基于分四栏+栏间有间距的例子分析 效果图:  html代码: <div class="buy-one-buy"> <h3>淘一淘</h3> ...

  7. height与line-height

    1.网页的所有元素可以分为块元素和行元素.一行文字所在的一个逻辑区域是行元素,其他的元素就都是块元素line-height只针对行元素,height针对其他所有元素 2. width,height对于 ...

  8. 真正的能理解CSS中的line-height,height与line-height

    https://blog.csdn.net/a2013126370/article/details/82786681 在最近的项目中,常常用到line-height,只是简单的理解为行高但并没有深层次 ...

  9. CSS学习笔记——视觉格式化模型 visual formatting model

    CSS 视觉格式化模型(visual formatting model)是用来处理文档并将它显示在视觉媒体上的机制.他有一套既定的规则(也就是W3C规范),规定了浏览器该怎么处理每一个盒子.以下内容翻 ...

随机推荐

  1. 以shareExtension为例学习iOS扩展开发

    整体介绍 phone Extension 用法基础详解 share Extension 用法基础详解 demo链接   密码: i72z

  2. 基于Nginx的SSL虚拟主机

    通过私钥,证书对站点www.test.com的所有数据加密,实现通过https访问www.test.com 环境说明: 源码安装Nginx时必须使用--with-http_ssl_module参数,启 ...

  3. SQL2012安装

    SQL2012安装 1.打开SQL安装包,点击setup安装 2.选择安装界面,点击全新安装 3.验证通过后,点击确定 4.选择我接受,点击下一步 5.在外网环境,可进行在线更新,内网环境取消勾选产品 ...

  4. vue中数组变动更新检测

    Vue 包含两种观察数组的方法分别如下 1.变异方法 顾名思义,变异方法会改变被这些方法调用的原始数组,它们也将会触发视图更新,这些方法如下 push() pop() shift() unshift( ...

  5. MYSQL数据库常用的LINUX命令

    此为我工作中常用MYSQL数据库命令 LINUX系统中启动 / 重启MYSQL服务:service mysql start  /  service mysql restart(重启服务) LINUX系 ...

  6. Linux 内核管理

    Linux内核基础:Linux Kernel:  Linux内核的体积结构是单内核的,但充分借鉴了微内核设计体系的优点,为内核引入模块化机制,使得虽然是单内核,但工作在模块化的方式下,并且模块可以动态 ...

  7. Java基础学习总结(64)——Java内存管理

    本文介绍的Java虚拟机(JVM)的自动内存管理机制主要是参照<深入理解Java虚拟机>(第2版)一书中的内容,主要分为两个部分:Java内存区域和内存溢出异常.垃圾回收和内存分配策略.因 ...

  8. EL表达式取整问题

    一般来说我们是无法实现EL表达式取整的.对于EL表达式的除法而言,他的结果是浮点型. 如:${6/7},他的结果是:0.8571428571428571.对于这个我们是无法直接来实现取整的. 这时就可 ...

  9. nyoj 803 大数问题

    #include<stdio.h> #include<string.h> #define ll long long #define N 110000 int main() { ...

  10. leetcode_Isomorphic Strings _easy

    Given two strings s and t, determine if they are isomorphic. Two strings are isomorphic if the chara ...