**本文首发于个人博客 http://www.lijundong.com/image-and-line-height/ **

今天在做一个静态页面时,图片底部出现一条 3px 高度的白边,既不是 margin 也不是 padding,找了好久没能解决,后来才发现与 line-height 相关,问题解决后查缺补漏,这里作下笔记。

解决问题之前需要理清楚几个概念,基线、line-height、vertical-align、inline 元素。

基线(baseline)

基线(Baseline) 是字体排印学中的概念,指的是多数字母排列的基准线,大多字母都沿着红色基线排列,举个例子辅助理解



图中 xHh 字母的下边缘红线就是基线的所在,那么有没有一个特定的条件来定义基线呢?这里有个概念可供参考

字母x的下边缘(线)就是基线的所在。

这里又引出了 x-height 的概念,此处不表。

line-height

关于 line-height 如何定义的讨论,有说法是两条基线之间的距离,看到这个结论我首先想到第一行的行高如何处理,后来去找了资料,发现两条基线之间的距离即是 line-height 这样的结论并不准确。

关于 line-height 的定义,MDN 阐述如下:

On block level elements, the line-height property specifies the minimum height of line boxes within the element.
On non-replaced inline elements, line-height specifies the height that is used to calculate line box height.

block 元素中, line-height 的值等于元素中高度最低的行框(line box) 的高度值。
在 non-replaced inline 元素中,line-height 的值等于行框(line box) 的高度值。

**注:**
**replaced element 对比 non-replaced element** - replaced element: 例如 img、video、canvas 此类渲染出的内容引用外部的元素
- non-replaced element: 渲染自身的 content

例如 <a href="lijundong.com">Leeon Blog</a> 此类,渲染出的内容来自自身。

inline(内联) 元素

HTML5 中的常见 inline 元素如下:

  • inline:span、strong、em
  • inline-block:input、button、textarea、select、img

vertical-align

vertical-align 作用于 inline 元素 以及 table-cell 元素,还有 ::first-letter::first-line,更多内容可以参见 MDN

属性分类:

适用于 inline 元素的属性:

/* keyword values */
vertical-align: baseline; /*基于基线对齐*/
vertical-align: sub;
vertical-align: super;
vertical-align: text-top;
vertical-align: text-bottom;
vertical-align: middle;
vertical-align: top;
vertical-align: bottom; /* <length> values */
vertical-align: 10em;
vertical-align: 4px; /* <percentage> values */
vertical-align: 20%; /* Global values */
vertical-align: inherit;
vertical-align: initial;
vertical-align: unset;

适用于 table-cell 的属性:

vertical-align: top;
vertical-align: bottom;
vertical-align: middle;

回到问题

问题代码示例如下,

<style >
* {
padding: 0;
margin: 0;
}
body {
background-color: #ccc;
}
img {
width: 100px;
}
div ,p {
font-size: 100px;
background-color: #fff;
}
</style>
<body>
<div >
<img src="headpic.png">
</div>
</body>

代码效果图如下,红框圈出部分为出现的白条

通过对代码稍作修改可以轻松看出问题所在,实图如下

有了上面的铺垫,现在回头看遇到的问题,就很简单了,究其原委,首先 img 元素默认对齐方式为 vertical-align: baseline;,这就导致了,baseline 以下的部分被空了出来,显示了背景的白色。

问题找到了,对症下药可得出下面的解决方案:

  • 根本上消除 img 的对齐方式 —— 块状化:
img {
display: block;
}
  • 更改 img 对齐方式,以下三种均可
img {
vertical-align: top;
vertical-align: middle;
vertical-align: bottom;
}
  • 更改行高,行高是两条 baseline 之间的距离,因此可以暴力的让行高消失
{
line-height: 0;
/* font-size: 0; 当 line-height 使用数值、百分比或者 rem 定义时也可用这种方式,因为 line-height 参照的是 font-size 的值*/
}

总结

遇到问题多多求证,即便是很常见的问题也会挖出大学问,在求证的过程中也不能尽用拿来主义,多参考 w3c 和 MDN 的文档。

写的过程中,修修补补了好几回,关于 vertical-align 的内容讲的很仓促,后面会补上,如果文中表达有误,烦请指出,感谢。


参考:

inline「一」:从 image 底部白边初识 line-height的更多相关文章

  1. TYVJ2032 「Poetize9」升降梯上

    P2032 「Poetize9」升降梯上 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 开启了升降梯的动力之后,探险队员们进入了升降梯运行的那条竖直的隧道, ...

  2. 「BZOJ2654」tree

    「BZOJ2654」tree 最小生成树+二分答案. 最开始并没有觉得可以二分答案,因为答案并不单调啊. 其实根据题意,白边的数目肯定大于need条,而最小生成树的白边数并不等于need(废话),可以 ...

  3. [LOJ#3022][网络流]「CQOI2017」老 C 的方块

    题目传送门 定义有特殊边相邻的格子颜色为黑,否则为白 可以看出,题目给出的限制条件的本质是如果两个小方块所在的格子 \(x\) 和 \(y\) 为两个相邻的黑格,那么 \(x\) 和 \(y\) 之间 ...

  4. 「JSOI2013」哈利波特和死亡圣器

    「JSOI2013」哈利波特和死亡圣器 传送门 首先二分,这没什么好说的. 然后就成了一个恒成立问题,就是说我们需要满足最坏情况下的需求. 那么显然在最坏情况下伏地魔是不会走回头路的 因为这显然是白给 ...

  5. 「CH6901」骑士放置

    「CH6901」骑士放置 传送门 将棋盘黑白染色,发现"日"字的两个顶点刚好一黑一白,构成一张二分图. 那么我们将黑点向源点连边,白点向汇点连边,不能同时选的一对黑.白点连边. 当 ...

  6. 「数据结构」Link-Cut Tree(LCT)

    #1.0 简述 #1.1 动态树问题 维护一个森林,支持删除某条边,加入某条边,并保证加边.删边之后仍然是森林.我们需要维护这个森林的一些信息. 一般的操作有两点连通性,两点路径权值和等等. #1.2 ...

  7. 「2014-3-13」Javascript Engine, Java VM, Python interpreter, PyPy – a glance

    提要: url anchor (ajax) => javascript engine (1~4 articles) => java VM vs. python interpreter =& ...

  8. LOJ_2305_「NOI2017」游戏 _2-sat

    LOJ_2305_「NOI2017」游戏 _2-sat 题意: 给你一个长度为n的字符串S,其中第i个字符为a表示第i个地图只能用B,C两种赛车,为b表示第i个地图只能用A,C两种赛车,为c表示第i个 ...

  9. Loj #2192. 「SHOI2014」概率充电器

    Loj #2192. 「SHOI2014」概率充电器 题目描述 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品--概率充电器: 「采用全新纳米级加工技术,实现元件与导线能否通电完 ...

随机推荐

  1. IIS7无后缀URL部署问题 MVC4 MVC URL映射 windows server 2008

    前言和中间一段都是我找到问题的过程和思维方法.没兴趣的可以直接跳过看后面的问题和解决. 前言: 问题发生在站点完成后,部署到服务器上.以为这个是最轻松的工作.结果悲剧了.windows server ...

  2. iOS之SDWebImage清理缓存

    .找到 SDWebImage找到SDImageCache类 添加如下方法 - (float)checkTmpSize { float totalSize = 0; NSDirectoryEnumera ...

  3. 用php自动发邮件的简单实现

    如何自动发送邮件? php自带mail方法,不过只能在linux下直接使用,windows下要配置smtp服务器,有点麻烦. 可以用一些现成的类来实现,比如很有名的phpmailer,功能很强大,代码 ...

  4. FastCgi与Cgi

      转载请注明出处:http://www.cnblogs.com/stonehat/p/6286966.html  他们之间的不同在于   FastCgi的进程是常驻的,监听一个socket, 无线循 ...

  5. 用PS给图标添加外发光效果

    最近在做app的时候用到了图标需要根据点击和非点击显示两种状态(原始状态和外发光状态). 如下图: 没办法,因为这是毕业设计的东西,总不能叫同事帮忙处理下.所以自己充当了回美工. 做法如下: 1.打开 ...

  6. 左偏树初步 bzoj2809 & bzoj4003

    看着百度文库学习了一个. 总的来说,左偏树这个可并堆满足 堆的性质 和 左偏 性质. bzoj2809: [Apio2012]dispatching 把每个忍者先放到节点上,然后从下往上合并,假设到了 ...

  7. linux下实现ftp匿名用户的上传和下载文件功能

    1.配置/etc//vsftpd/vsftpd.conf 文件如下: 打开文件,改变如下选项,如果文件中没有该选项,需要自己手动编写该选项 write_enable=YES anonymous_ena ...

  8. flask-sqlalchemy relationship

    http://www.ergo.io/blog/sqlalchemy-relationships-from-beginner-to-advanced class Cabinet(db.Model): ...

  9. UVa 10945 - Mother bear

    题目大意:给一个字符串,判断是否回文(忽略大小写,忽略非字母字符). #include <cstdio> #include <cctype> #include <cstr ...

  10. ecshop中ajax的调用原理 1

    ecshop中ajax的调用原理   1:首先ecshop是如何定义ajax对象的. ecshop中的ajax对象是在js/transport.js文件中定义的.里面是ajax对象文件.声明了一个va ...