行内元素(inline标签)设置了行高为什么不生效,还是表现为父盒子的行高?行内元素行高问题终极解释

最近在看张鑫旭大佬的《css世界》,读到5.2.4  内联元素 line-height 的“大值特性” ,产生了疑惑,

在开发中确实也遇到了同样的问题,深入探究后得出结果,先说结论吧,论证内容有点长,结论:

  行内元素自身并没有行高这个属性,虽然设置可以设置行高,但是最终作用的地方并不是自身,而是其自身所在的行框盒子上!如果你不知道什么是行框盒子,建议你好好读读张大佬的《css世界》,这里我简单的画一画

如上如所示,我的结论是:

  内联盒子没有行高这一属性,给它设置line-height,最终是作用在行框盒子上,而行框盒子最终会取内部行高最高的那个作为最终行高,而此行高将在其内部所有内联盒子中生效!

上代码:

<style>
       p{
           line-height: 96px;
       }
       span{
           line-height: 20px;
       }
</style>

<!--------分割线---------->

<p>
        <span>span标签中的文字</span>
</p>

为了让文字换行体现效果,我把浏览器缩窄一些,span标签中的文字放多一点,上述代码页面表现为:

如上图,span的line-height属性确实设置上了,并且覆盖了继承的来自父元素p的line-height:96px;但是从换行来看,span的表现,依然是line-height:96px; !!

张大佬的书中只解释了父盒子的高度问题,简单回顾下:因为幽灵空白节点继承了父元素p的行高,所以撑起了p元素的高,所以整个的高度为96px。按照张大佬的解释理解,

span的行高应该是24px,幽灵空白节点的行高为96px,行高撑起了高度,所以父元素的高度为最高的高度。

但是,这里通过换行我们可以发现span表现的并不是20px,而是96px !而且通过调试器我们发现,上下调整span的line-height页面根本一点变化都没有,纹丝不动!

这时候小白就要说话了,行内元素的行高设置无效!聪明的你试一下就会发现,行内元素当然是可以设置行高属性的。那这里为什么会设置无效呢?其实当你设置span的行高超过父元素的时候,你就会发现,有意思的现象出现了!

没错,span的行高生效了!

那么问题来了,说不生效吧,比父元素行高大的时候它生效了,说生效吧,小于父元素行高的时候多少都没用,什么情况?问题不急着回答,再看下面一个例子:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
       p{
           line-height: 20px;
       }
       span{
           line-height: 40px;
       }
       em{
        line-height: 80px;
       }
       b{
        line-height: 160px;
       }
    </style>
</head>
<body>
    <p>
        <span>span标签中的文字</span><em>em中的文字</em><b>b中的文字</b>
    </p>
</body>
</html>

高度不用说,按照张大佬得出的大值特性,肯定是160px。那行高呢?各位不妨猜猜最终的表现,

我猜你肯定猜到了,没错,就是这样:

结合上述盒子模型图,在这个例子中应该是这样的

幽灵空白节点继承父元素的行高属性 ,各个内联盒子自身有自身的行高属性,但是这些“行高属性”都不是作用在自身而是作用在如图的行框盒子上,

而行框盒子又反过来让其内的所有内联盒子表现出行高的特性。打个通俗点的比方讲就是,爸爸问自己的儿子们今晚吃啥,儿子们提意见,爸爸其中一个的意见后发出命令,今晚大家都吃这个!

儿子们自己决定不了,但可以提意见,切回行高就是,内联盒子决定不了自己所在行的行高,但是可以告诉行框盒子,我想是这么多!(line-height:***)

最后带来一个小例子,提醒一下各位看官,行框盒子的行高也不是固定,什么意思呢?还是上例的样式(为了方便观看,我为对应元素加上底色,

同时去掉margin和padding的影响),请看:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        *{
            margin: 0;
            padding: 0;
        }
       p{
           line-height: 20px;
       }
       span{
           line-height: 40px;
           background-color: red;
       }
       em{
        line-height: 80px;
        background-color: green;
       }
       b{
        line-height: 160px;
        background-color: blue;
       }
    </style>
</head>
<body>
    <p>
        <span>span标签中的文字很长很长很长很长很长很长很长很长很长很长很长很长</span>
        <em>em中的文字很长很长很长很长很长很长很长很长很长很长很长很长</em>
        <b>b中的文字很长很长很长很长很长很长很长很长很长很长很长很长</b>
    </p>
</body>
</html>

调整浏览器的宽度,使换行,效果如下:

就不卖关子,直接说了,这里变成了这样:

一个包含盒子(包含块)p,4个行框盒子,4个行框盒子。

第一个行框盒子里包含了幽灵空白节点+span标签的前部分,

第二个行框盒子包含了幽灵空白节点、span标签的后部分和em标签的前部分,

第三个行框盒子包含了幽灵空白节点、em的后部分和b标签的前部分,

第四个行框盒子包含了幽灵空白节点、b标签的后部分。

四行表现的行高分别是 40px 、80px、160px、160px。

最后的最后来个总结:

1. 行内元素的line-height属性是去设置该元素所在行框盒子的行高,行框盒子取其内部所有内联盒子要求的行高的最大值,定为当前行的行高,所有内联盒子遵守这个最终行高来行事!

2.换行后生成新的行框盒子,新生成的行的行高,重新在当前行包含的内联盒子中选拔最高者定之!

原文地址:https://www.cnblogs.com/superjsman/p/11994451.html

时间: 2024-10-07 05:29:51

行内元素(inline标签)设置了行高为什么不生效,还是表现为父盒子的行高?行内元素行高问题终极解释的相关文章

html根标签设置font-size为100px,使用rem,body没设置字体大小

今天使用了rem来写样式,前提是要给html设置font-size:100px;这样在计算比例时相对方便点:结果在将一个span标签设置为display:inline-block;时发现span不能能和父元素div同高,然后问了大神,原来是body忘记设置font-size了. 现在,对于我来说, html{font-size: 100px;} body{font-family:"微软雅黑";font-size: 16px;} 这两句都是必不可少的前提啊(抹泪儿)! 然后我又在网上查了

父窗口中获取iframe中的元素

js 在父窗口中获取iframe中的元素 1. Js代码   格式:window.frames["iframe的name值"].document.getElementById("iframe中控件的ID").click(); 实例:window.frames["ifm"].document.getElementById("btnOk").click(); 2. Java代码   格式: var obj=document.get

css 内联元素inline 行框全解

首先看一篇文章: CSS框模型:一切皆为框 - 从行框说起 一 行框 看图说话 上图代表了框模型中的行框.line-height 属性设置行间的距离(行高).该属性会影响行框的布局.在应用到一个块级元素时 ,它定义了该元素中基线之间的最小距离而不是最大距离. line-height 与 font-size 的计算值之差(在 CSS 中成为"行间距")分为两半,分别加到一个文本行内容的顶部和底部. 可以包含这些内容的最小框就是行框line box.[来源] 二 框模型 继续看图 上图代表

HTML5 结构性标签 行内语义性标签

结构性标签: <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title>旭宝爱吃鱼</title> </head> <body> <!--文章--> <article> <!--头部--> <header> <h1>旭宝爱吃鱼<

元素绝对定位以后设置了高宽,a标签不能点击的原因总结

元素绝对定位以后设置了高宽,a标签不能点击的原因: 1.元素内并无内容 2.背景是透明的,无任何背景图或者颜色 解决方法: 1.如果不是绝对定位元素的,可以用相对定位 2.给元素加透明的背景图 3.IE可以只用 background:url(about:blank) 解决 第三种方法平时用用是可以的,但是在某种情况下会有bug, 比如JS拖动层时候,拖动的事件在一个透明层上面,你有设置了其他鼠标光标,这时候拖动就会出现光标闪烁的现象! 总结:用第二种方法,弄一个1*1PX的透明图就好!

【css】HTML标签主要类型:块状元素(block)、行间元素(inline)

问题背景 当某些HTML标签使用盒模型属性时,部分属性失效? 块状元素     独占一行(是否添加width),该元素前后其他内容都要换行     直接适用盒模型的所有css属性      行间元素     不独占一行,多个行间元素可以在一行中呈现     部分适用css盒模型属性:     ·宽度.高度设置无效     ·边距设置:左右有效,上下无效 常见块状元素 标签                           说明 <div>                           

WPF DataGrid 每行ComboBox 内容不同的设置方法

原文:WPF DataGrid 每行ComboBox 内容不同的设置方法 <toolkit:DataGridComboBoxColumn x:Name="DgCbcSignal" Header="信号源" SelectedItemBinding="{Binding SelectedSignal}" > <toolkit:DataGridComboBoxColumn.ElementStyle> <Style Targe

Django内建模版标签和过滤器

第四章列出了许多的常用内建模板标签和过滤器.然而,Django自带了更多的内建模板标签及过滤器.这章附录列出了截止到编写本书时,Django所包含的各个内建模板标签和过滤器,但是,新的标签是会被定期地加入的. 对于提供的标签和过滤器,最好的参考就是直接进入你的管理界面.Django的管理界面包含了一份针对当前站点的所有标签和过滤器的完整参考.想看到它的话,进入你的管理界面,单击右上角的Documentation(文档)链接. 内建文档中的“标签和过滤器”小节阐述了所有内建标签(事实上,本附录中的

给select标签设置下拉框高度

最近的需求涉及有下拉框,突然想到如果下拉选项过多的话可能要对下拉框的高度做一下限制,查了一下select标签,有size这个属性,原以为可以实现. <!DOCTYPE html> <html> <body> <select size="3" style="width:100px"> <option value="volvo">Volvo</option> <option