行高 line-height

一、行高的定义
line-height(行高):两行文字基线之间的距离

1、什么是基线?
2、为何是基线?
3、需要两行吗?

1、什么是基线?

 

我们上学的时候都用过,抄写英文字母的时候。其中有一条红线,这个红线就是基线,是为了写英文的时候对齐用的。

 


2、为何是基线?
为什么不是底线,不是中线呢?因为基线乃*线定义之根本!

3、需要两行吗?
两行的定义已经决定了一行的表现!

 

如图,首先基线与基线之间的距离就是行高

接下来我们看看line-height:200px跟这个基线到底怎么纠葛,起作用的呢?

 


然后我们脑补一下,如果行高为0会怎么样子呢,他会重合。

4、为何line-height可以让单行文本垂直居中?
首先真的垂直举重了吗?

 

如图,会发现这个x跟这个破折号的中心并没有跟中线重合在一起。也就是实际上并没有完全居中的,只是看上去垂直居中了。
二、line-height与行内框盒子模型
1、什么是行内框盒子模型
所有内联元素的样式表现都与行内框盒子模型有关!例如浮动的图文环绕效果...
<p>这是一行普通的文字,这里有个<em>em</em>标签</p>
上面是一行普通的文字,有个em标签。但是,却包含了4种盒子。
1)、“内容区域”(content area),是一种围绕文字看不见的盒子。"内容区域"(content area)的大小与font-size大小相关。个人理解,可以是选中文字的时候,那一块区域
2)、“内联盒子”(inline boxes), “内联盒子”不会让内容成块显示,而是排成一行。如果外部含inline水平的标签(span,a,em等),则属于“内联盒子”。如果是光秃秃的文字,则属于“匿名内联盒子”;
3)、“行框盒子”(line boxes),每一行就是一个“行框盒子”,每个“行框盒子”又是由一个一个“内联盒子”(inline-boxes)组成
4)、<p>标签所在的“包含盒子”(containing box),此盒子由一行一行的“行框盒子”(line boxes)组成。

了解行内框盒子模型,对理解line-height有什么现实意义?

三、line-height对高度机理(机理是机制原理对简称)
先看一个小小的例子
<body><p>这是一行普通的文字,这里有个<em>em</em>标签。</p><script>console.log(document.querySelector("p").clientHeight);// mac chrome:22 firefox:23// windows chrome:21 ie:19 firefox:22</script>
</body>
那么这个元素高度是从何而来的呢?是不是由里面的文字撑开的?非也,是由line-height决定的
<style>.test1{font-size: 36px;line-height: 0;border: 1px solid #ccc;background: #eee;margin-top:50px;}.test2{font-size: 0;line-height: 36px;border: 1px solid #ccc;background: #eee;margin-top:50px;}
</style>
<body><div class="test1">测试1</div><div class="test2">测试2</div>
</body>
看这个demo,能看到test1文字长的很大,高度就是边框的高度,2px,test2有高度,文字没有,36px。所以内联元素的高度是由行高决定的

那么问题来了,line-height命名是两基线距离,单行文字哪来行高,还控制了高度?这就有点尴尬了。
1、行高由于其继承性,影响无处不在,即使单行文本也不例外;也就是说页面上所有元素,每个角落都有行高的。
2、行高只是幕后黑手,高度的表现不是行高,而是内容区域和行间距。
只不过,正好... 内容区域高度+行间距 = 行高
1)、内容区域高度只与字号以及字体有关,与line-height没有任何关系
2)在simsun(宋体)字体下,内容区域高度等于文字大小值。
simsun字体下:
font-size + 行间距 = line-height
那么什么是行间距呢?行间距 = 行高 - font-size
把行间距上下拆分,就有了“半行间距”。
总结:行高决定内联盒子高度;行间距墙头草,可大可小(甚至负值),保证高度正好等同于行高

那么问题来了,如果行框盒子里面有多个不同行高的内联盒子?由行高最高的那个盒子决定?似是而非!看上去好像是对的,其实是不正确的。
<body><p>这是一行普通的文字,这里有个<em style="line-height: 80px;">em</em>标签</p><script>console.log(document.querySelector('p').clientHeight);</script>
</body>
发现clientHeight正好是80px。如果是这个例子看,那句话是正确的。
<body><p>这是一行普通的文字,这里有个<em style="line-height: 80px; vertical-align:40px;">em</em>标签</p><script>console.log(document.querySelector('p').clientHeight);</script>
</body>
这个时候再来看一下这个行高的高度,91,不是80了。发生了一些变化,比预计的要高了。所以那句话是不准确的。那么vertial-align是个非常重要,也非常深的一个东西。等会讲这个东西。结论是91px不等于高度最高的内联元素。

前面讲的是单行文本的高度,如果是多行文本高度呢,多行文本的高度就是单行文本高度累加。

若行框盒子里面混入inline-block水平元素(如图片),高度如何表现呢?
四、line-height各类属性值
line-height支持的属性值大概这些
normal
<number>
<length>
<percent>
inherit
我们一个个来看一下

1)line-height:normal
默认属性值,跟着用户的浏览器走,且与元素字体关联。
比如我用的火狐,你用的chrome,这个normal的值可能就不一样
<body><p>这是一行普通的文字,这里有个<em>em</em>标签。</p><script>console.log(document.querySelector("p").clientHeight);// mac chrome:22 firefox:23// windows chrome:21 ie:19 firefox:22</script>
</body>
还有另外一种,字体不一样,normal的值也不一样
<body><div style="font-family:雅黑">字体</div>
</body>
family不一样,normal的值也会不一样。

2)line-height:<number>
使用数值作为行高值。例如
line-height:1.5;
根据当前元素的font-size大小计算。

假设文字大小(font-size)20px.则实际的行高像素值是:
line-height = 1.5 * 20px = 30px

3) line-height:<length>
使用具体长度值作为行高值,例如
line-height: 30px;

4) line-height:<percent>
使用百分比作为行高值。例如
line-height:150%;
相对于设置了该line-height属性的元素的font-size大小计算。

假如文字大小(font-size)20像素,则实际的行高像素值是:
line-height = 150% * 20px = 30px;

5) line-height:inherit
行高继承: ie8+,行高天生好像就会继承,那么为什么还要这个继承呢?
input{ line-height: inherit; }
input框等元素默认行高是normal,使用inherit可以让文本框样式可控性更强。

此继承非彼继承。input的行高默认是normal,不是继承外面的,默认不受外面影响。这个时候可能需要继承一下

这里有一个有意思的问题
line-height:1.5,
line-height:150%,
line-height:1.5em
有什么区别?
我是这么认为的,从计算上来讲,是没有任何差别的。比如20px,计算出来,高度全是30px。差别在什么地方呢
应用元素有差别
1)line-height:1.5所有可继承元素根据font-size重计算行高;
2)line-height:150%/1.5em 当前元素根据font-size计算行高,继承给下面的元素;
这语言很苍白,不懂,看例子
<body><div style="line-height:1.5; width:500px;"><span style="font-size:60px;">我的font-size为60px</span></div><div style="line-height:150%; width:500px;"><span style="font-size:60px;">我的font-size为60px</span></div>
</body>
浏览器看会有什么不一样?上面的是90px,下面的是40px。上面的行高会重新计算扩大,下面的不会

body全局数值行高使用经验
body{ font-size:14px; line-height:?}
假如是博客,这种阅读为主的,行高至少1.5到1.6。如果主要是网页开发,面向用户的。一半匹配20px的使用经验-方便心算。
line-height = 20px / 14px = 1.42857
body{ font-size:14px; line-height:1.42857?}
这个很怪,火狐里面是19px;所以要向上取值
body{ font-size:14px; line-height:1.4286}
五、line-height与图片的表现
首先思考一个问题,行高会不会影响图片实际占据的高度?也就是行高从一百改成两百,这个图片占据的高度会不会变。不会变。
<p style="background:#eee"><img src="imgs/text.png" alt="" style="width:200px;"></p>
首先这么一张图片,会看到图片下面会有一段间隙,为什么会有间隙呢?这个时候在图片后面加一段文字,纹丝不动。没有任何变化。会发现图片的下边缘和文字的边缘是对齐的。这是为什么呢?因为默认是根据基线对齐的。这个时候改变行高,发现下边缘也变高了。
<body><p style="background:#eee; line-height: 60px"><img src="imgs/text.png" alt="" style="width:200px;"><span style="display:inline-block; background:#fff;">图片高度177px,字体14px</span></p>
</body>
会发现行高的高度就是文字的高度。因为要让文字根据基线对齐,所以下面的高度变高了。所以现在解释刚开始的下面的空隙。因为要把文字进行基线对齐,所以不得已,图片下面有空隙。那么为什么刚开始没有文字的时候,表现跟有文字一样呢。这里有个概念,叫做隐匿文本节点,这是自己的理解,就是里面好像有个文本,但是看不到,摸不到,js获取不到。

那么如何消除图片底部间隙?我们实际开发中是不需要的。
1、图片块状话-无基线对齐
img{ display: block; }
2、图片底线对齐
img{ vertical-align: bottom; }
3、行高足够小-基线位置上移
.box{ line-height:0; }

 

六、line-height的实际应用
像居中啊,边距什么的,上面都说过,就不探讨了。
1、大小不固定的图片,多行文字的垂直居中
<style>.box{line-height: 300px;text-align: center;background: #eee;}.box > img {vertical-align: middle;}
</style>
<body><div class="box"><img src="imgs/text.png" style="width:200px" alt=""></div>
</body>
这个时候图片会近似的垂直居中,这里又用到了vertical-align;这个middle是基线1/2x的距离,下一章再具体研究下

2、多行文本水平垂直居中
<style>.box{line-height: 250px; text-align: center; background: #eee;}.box > .text{display: inline-block; line-height: normal; text-align: left; vertical-align: middle;}
</style>
<body><div class="box"><div class="text">多行文字水平垂直居中实现的原理跟上一页图片的实现是一样的,区别在于要把多行文本所在的容器的display水平转换成和图片一样的,也就是inline-block,以及重置外部继承的 text-align 和 line-height属性值。</div></div>
</body>
这里父元素text-align:center,和子元素vertical-align:middle跟图片居中是一样的。唯一不一样的就是要把text设置成inline-block;同时干掉父元素的line-height这些继承下来的东西。如果不干掉,三行文字都是250px。


接下来看几个行高的事例,产生的现象 
<style>span {background: red;}.c1 {line-height: 20px;}.c2 {line-height: 8px;}.c3 {line-height: 30px;}.c5 {line-height: 28px}
</style>
<body><div><span class="c1">inline box xfg中文</span><span class="c2">inline box</span><span class="c3">inline box</span>inline box<span class="c5">inline box</span></div>
</body>

它们的行高不一样,但是为什么渲染的高度是一样的

这个呢其实比较复杂,这个涉及到文字到排版,文字到排版中有几条线,上面叫做顶线,下面叫做底线,顶线和底线之间的区域叫做文本占据到区域。字母都会有一个基线,都是对齐的。这就是为什么行高不一样,但是却一样。第三个元素到行高是30。但是选中看高度还是22。那行高会决定什么呢?会决定它上下到多余的高度。我们选中div,发现刚好是30px。它会把外面的盒子撑起来。那么行高是由什么构成的。行高是由line-box(一行的高度)组成的。line-box是由inline-box组成的。inline-box的高度会决定line-box的高度

 

<style>.cc1 {font-size: 12px;}.cc2 {font-size: 18px;}.cc3 {font-size: 24px;}
</style>
<body><div style="border:1px solid red"><span style="background:blue; color:#fff; font-size:20px; line-height:60px">居中xfg&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;</span></div><div><span class="cc1">第一段</span><span class="cc2">第二段</span><span class="cc3">第三段</span></div><div style="background:red"><span>文字</span><img src="text.png" alt=""></div><div><div style="float:left"><span>第一段</span></div><div style="float:left"><span>第二段</span></div></div>
</body>

 

第一部分是为了大家看到的样子,div是没有定高的,里面有一个span。span是inline的元素。它也是没有定高的。因为span是inline元素,定高其实没用。它有一个背景blue。背景blue是根据字体大小来渲染的。底线和顶线之间。我们字体调大,背景也会变大。那我们的line-height是60px。60px实际上就是把整个div撑起来了。这个div是62,因为他有边框。这里有一个特性,就是行高比字体要大,要大的话,多余的高度会上下分布,让里面的inline元素垂直居中。这是一个非常重要的特性,如果要做垂直居中的话,用line-height来做就好了,而且在这种情况下都不用为div指定高度。

 

 第二部分我们看到字体的大小是不一样的。字体大小不一样,那么按照什么对齐呢。默认情况呢,是按照base-line,基线对齐。对大部分中文来说,底部基本上是基线对位置。如果要居中对齐怎么办。

那我们就设置vertical-align:middle,居中对齐,三个部分都设置居中对齐。设置top就是根据顶线对齐。设置bottom就是根据底线对齐。这里根据顶线和底线对齐并不是根据文字都顶部和底部对齐。

 

第三部分有一个文本,有一个图片。然后会发现一个很奇怪的事情。这个图片下面有一段空白。有人说我是不想要这个空白的。那怎么办呢?首先他的原因是什么,原因是因为,img这个也相当于是一个inline的这样一个元素。inline的元素就要遵守行高的构成。他会按照base-line对齐。就是基线对齐。基线对齐的话,就意味着,基线到底线之间还是有一段空隙的。这是这个空隙产生的原因。那我们要去掉这个空隙怎么办?默认是按base-line对齐,base-line跟底线是有偏差的。这个偏差的大小视字体大小而定。如果是12px的大小,那么这个图片的空隙有可能就是3px左右。那么这就是经典的图片3px缝隙问题。这个问题怎么解决呢,很简单,默认是base-line。我们改成vertical-align:bottom,按底线对齐。这样缝隙就没有了

 

转载于:https://www.cnblogs.com/wzndkj/p/10296941.html

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

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

相关文章

实验七报告

一、实验结论 part1&#xff1a;验证性实验 1.验证性实验2 如果事先不知道学生人数&#xff0c;尝试对line29做如下修改后&#xff0c;程序运行结果是否正确&#xff1f;回答问题&#xff0c;并给出运行结果截图。 运行结果正确// 将file1.txt中小写字母转换成大写后&#xff…

XPath语法规则及实例

XPath语法规则及实例 XPath语法规则一、XPath术语&#xff1a; 1.节点&#xff1a;在XPath中&#xff0c;有七种类型的节点&#xff1a;元素、属性、文本、命名空间、处理指令、注释以及文档&#xff08;根&#xff09;节点。 XML文档是被作为节点树来对待的。树的根被称为文档…

WorkPlus超级APP助力企业节省IT人力成本,实现快速移动化

在信息化时代&#xff0c;移动应用已经成为企业发展的重要组成部分。然而&#xff0c;开发和维护原生客户端的成本却相对较高&#xff0c;需要大量的iOS、安卓和桌面端工程师。为了解决这一问题&#xff0c;WorkPlus作为一个功能完备的超级APP&#xff0c;为企业节约了大量的IT…

addEventListener的click和onclick的区别

前两节都和addEventListener的click有关&#xff0c;于是在想它与onclick有什么区别呢&#xff0c;自己调试了一下&#xff0c;网上也有相关资料 事件绑定 onclick绑定方式 优点&#xff1a; - 简洁 - 处理事件的this关键字指向当前元素 缺点&#xff1a; - 不能对事件捕获或…

ApiCloud利用NVTabBar模块快速搭建起APP的框架

废话不说&#xff0c;直接上代码 模块地址&#xff1a;https://docs.apicloud.com/Client-API/Nav-Menu/NVTabBar 代码实例&#xff1a; <!doctype html> <html><head><meta charset"utf-8"><meta name"viewport" content"…

Java 8中新的并行API:Glitz和Glamour的背后

我是一个出色的多任务处理者。 即使我在写这篇文章&#xff0c;我仍然可以为昨天在一个大家都对我陌生的聚会上发表的言论感到尴尬。 好消息是&#xff0c;我并不孤单– Java 8在多任务处理方面也相当出色。 让我们看看如何。 Java 8中引入的关键新功能之一是并行数组操作。 这…

ASP.NET 中执行 URL 重写

作者&#xff1a;overred 来源&#xff1a;原创URL 重写就是把URL地址重新改写&#xff08;汗^_^&#xff09;。详情&#xff1a;http://www.microsoft.com/china/msdn/library/webservices/asp.net/URLRewriting.mspx优点&#xff1a;把url缩短等用法&#xff1a;1.下载ms的…

nine

nine Scarpy爬虫框架https://www.cnblogs.com/kermitjam/articles/10147261.html?tdsourcetags_pctim_aiomsg 高并发的爬虫框架 Runspider只能执行某个 爬虫程序.py文件 将项目根目录导入 Xpath语法 获取内容&#xff08;‘./text()’) 发送请求 ---> 获取响应数据 --->…

使用ActiveMQ –具有故障转移协议的“主/从”配置

介绍 ActiveMQ代理往往是企业中消息传递基础结构的核心部分。 此消息传递基础结构的高度可用性和可伸缩性至关重要。 请阅读此链接 &#xff0c;以了解有关创建经纪人网络以支持各种用例的更多信息。 ActiveMQ的流行用例之一是带有共享数据库的主/从配置。 使用此配置时&#x…

页面那些位置是投放广告的最佳位置

通常好的广告位置并非页面最上方的通栏广告&#xff0c;而是页面第一屏导航条下面中央和左侧的位置&#xff0c;此处放置广告会取得较好的效果。除此之外&#xff0c;页面中屏主要内容附件的位置为左侧和下侧较好&#xff0c;用户会第一时间注意到并关注这些广告。 转载于:http…

如何在Java中将字节数组转换为InputStream和OutputStream

您是否坚持使用编码&#xff0c;因为您有字节数组&#xff0c;并且链中的下一个方法需要InputStream&#xff1f; 不用担心Java有解决方案&#xff0c;您可以使用 ByteArrayInputStream 在Java中将字节数组转换为InputStream 。 此类使用字节数组作为源&#xff0c;并且由于它…

mysql 笔记打包下载_mysql 5.7压缩包安装笔记

重装系统之后准备安装mysql,看到官网上有mysql 5.7.10可以下载就点了,然后就开始了漫长的安装路程,总共折腾差不多一个多小时,最后终于安装成功了,这里把安装过程写下来,给自己做个笔记,也给后来人一个安装提示.1.下载安装包直接点击或者复制之后就可以下载了,不嫌麻烦或者想体…

Java 8 LongAdders:管理并发计数器的正确方法

我只是喜欢新玩具&#xff0c;而Java 8有很多 。 这次我想谈谈我的最爱之一-并发加法器。 这是一组用于管理由多个线程编写和读取的计数器的新类。 新的API有望显着提高性能&#xff0c;同时仍然使事情变得简单明了。 自从多核架构问世以来人们一直在管理并发计数器&#xff0…

JS中ptototype和__proto__的关系

学到原型的时候感觉头都大了/(ㄒoㄒ)/~~ 尤其是ptototype和__proto__ 傻傻分不清 通过多番查找资料&#xff0c;根据自己的理解&#xff0c;总结如下&#xff1a; 一、构造函数&#xff1a; 构造函数&#xff1a;通过new关键字可以用来创建特定类型的对象的函数。比如像Obje…

[最短路]飞行

题目描述 WFYZ的校园很大&#xff0c;这里生活着很多生物&#xff0c;比如住在钟楼上的的鸽子&#xff0c;其中鸽子冉冉和她的妹妹凝凝白天在不同的地方吃虫&#xff0c;而在晚上她们都回到钟楼休息。她俩是两只懒鸟&#xff0c;于是提出了一个计划&#xff0c;尽量减少她们在飞…

Java状态和策略设计模式之间的差异

为了在Core Java应用程序中正确使用状态和策略设计模式&#xff0c;对于Java开发人员清楚地了解它们之间的区别很重要。 尽管状态和策略设计模式的结构相似&#xff0c;并且都基于开放式封闭设计原则&#xff0c;从SOLID设计原则表示为“ O”&#xff0c;但它们在意图上完全不同…

廖雪峰Java3异常处理-1错误处理-2捕获异常

1捕获异常 1.1 finally语句保证有无错误都会执行 try{...}catch (){...}finally{...} 使用try...catch捕获异常可能发生异常的语句放在try{...}中使用catch捕获对应的Exception及其子类1.2 捕获多个异常 try{...} catch() {...} catch(){...}finally{..} 使用多个catch子句&…

更新数据库

方法一&#xff1a;在对SQL数据库进行更新时&#xff0c;用CommandBuilder对像来自动构建sql命令&#xff0c;来起到更新的作用;这种方法用起来比较方便&#xff0c;具体代码如下&#xff1a; 以下代码都在xp系统下测试通过 环境&#xff1a;vs.net2005 \ sql server 2000\xpus…

在崩溃或断电后测试Lucene的索引耐久性

Lucene有用的事务功能之一是索引持久性 &#xff0c;它可以确保一旦成功调用IndexWriter.commit &#xff0c;即使操作系统或JVM崩溃或断电&#xff0c;或者您杀死-KILL JVM进程&#xff0c;重启后索引也将保持完整&#xff08;未损坏&#xff09;&#xff0c;并将反映崩溃前的…

Jmeter、postman、python 三大主流技术如何操作数据库?

1、前言 只要是做测试工作的&#xff0c;必然会接触到数据库&#xff0c;数据库在工作中的主要应用场景包括但不限于以下&#xff1a; 功能测试中&#xff0c;涉及数据展示功能&#xff0c;需查库校验数据正确及完整性&#xff1b;例如商品搜索功能 自动化测试或性能测试中&a…