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

之所以想写这篇文章,是因为自己工作的经验总结。以前的页面编写极度不注重间距大小,特别是行级元素间距。认为只要差不多好就行了,没必要花那么大的精力去抠几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. 【Oracle】ORA-38171: Insufficient privileges for SQL management object operation

    问题: 使用SQL PLAN MANAGEMENT的时候运行下面的存储过程报错. SYS@GOOD> conn scott/tiger Connected. SCOTT@GOOD> DEC ...

  2. 【SQL】SELECT 语句

    1.1 SELECT基本语法: Select * |{[distinct]colum|expression [alias],…} from table; 1.2 查询当前用户所有在用的表及视图: HR ...

  3. node linux服务器部署 centos

      1下载 wget https://nodejs.org/dist/v6.9.5/node-v6.9.5-linux-x64.tar.xz  2解压 tar xvf node-v6.9.5-linu ...

  4. C++调用matlab编程

    C++调用Matlab,实在是不得已的方法.原文链接: http://kylen314.blog.com/2012/12/11/matlab_for_cplusplus/  这是个很善良的博客,只出现 ...

  5. 工欲善其事必先利其器之windows篇

    Windows是我们最常用的系统,下面就让我们重新认识一下Windows有哪些可以让我们提高工作效率的快捷键以及部分技巧,,以及在外行看来可以看起来逼格高的技巧! 1.Windows最实用,最常用的快 ...

  6. linux VFS 之一 :虚拟文件系统的面向对象设计思想

    VFS的面向对象的思想,如下图: VFS在上层用户空间的进程与底层特定文件系统之间起到一个承上启下的作用, 对上:封装标准的系统调用接口给用户空间app,user space app不必关心特定文件系 ...

  7. Go 语言一本通

    什么是GO语言? Go 是一个开源的编程语言,它能让构造简单.可靠且高效的软件变得容易. Go是从2007年末由Robert Griesemer, Rob Pike, Ken Thompson主持开发 ...

  8. vim+astyle安装使用

    astyle下载安装 wget https://sourceforge.net/projects/astyle/files/astyle/astyle%203.1/astyle_3.1_linux.t ...

  9. 搞定PHP面试 - 函数知识点整理

    一.函数的定义 1. 函数的命名规则 函数名可以包含字母.数字.下划线,不能以数字开头. function Func_1(){ } //合法 function func1(){ } //合法 func ...

  10. [Office]PPT 2013如何设置图片为半透明?

    PPT里面似乎无法直接为图片设置透明度属性.下面是一种变通的办法. 1,插入一个和图片大小一致的图形(矩形):2,右键插入的矩形,然后在属性设置里选择“图片填充”,选择以需要的图片填充到该矩形里:3, ...