css 行内元素排版 内联盒模型

521 阅读5分钟

1.概念

1. 块级元素 block

定义

display:block;

特点

  • 独占一行
  • 可以设置宽高,宽度默认100%
  • 从上到下垂直排版

常用标签

<div></div>
<p></p>
<ul></ul>
<li></li>
<h1></h1>

2.行内元素inline

定义

display:inline;

常用标签

<a></a>
<b></b>
<em></em>
<span></span>
<code></code>
<mark></mark>

特点

  • 从左到右排版,依次紧挨,放不下换行
  • 不能设置宽,根据自身内容+margin,padding border设置影响

3.行内块元素inline-block

定义

display:inline-block;

常用标签

<button/>
<input/>
<textarea/>
<select/>
<img/>

特点

  • 是块级元素和行内元素的混合体
  • 从左到右排版,依次紧挨,放不下换行
  • 可以设置宽高,默认根据自身内容+margin,padding border设置影响

4.替换元素与不替换的区别

1. 替代元素

不直接显示html内容的元素

<img />
<input />
<iframe />
  • 可以设置width 和 height
  • 当是inline-box时, inline-box高度 = line-height

2. 非替代元素

直接显示html内容的元素

<div></div>
<span></span>
  • 不能设置 width 和 height
  • line-height = font-size + 行间距(上下等分) = inline-box高度
  • 当是inline-box时 ,inline-box高度 = 元素自身高度 + 垂直padding + 垂直border + 垂直margin

2.行内元素

image.png

container-box包含块

是包裹在所有line-box行框外面的那层盒子。

line box行框

包含多个inline-box内联盒子

由单行内联元素形成的一个区域,如果有3行,那就有3个line-box 是由一行同级或多级inline或inline-box元素组成的区域

line-box里面 最大的元素的 line-height 和 vertical-align 决定了 内容显示baseline的位置。

inline-box内联盒子

inline-box内联盒子,通常inline标签包裹形成, 如

<span>我是一个内联盒子 哈哈哈</span>

最常用的如<span>标签包裹文字会形成内联盒子,

anonymous inline box匿名内联盒子

纯文字在标签里的内容,会自动包裹一个inline-box

 <p>aaa<span>bbb</span>ccc</p>

这里的aaa 和 ccc就是 匿名内联盒子

line-height

image.png

一般理解的行高 = 两行之间 baseline 的差值

image.png

一般单行文字的

line-height = font-size + 行间距

常见的设置

  • normal  默认属性值,不同浏览器表现不同,且与元素字体关联。

  • <number>使用数值作为行高值,根据当前元素的font-size大小计算

  • <length>使用具体长度值作为行高值

  • <percent>使用百分比值作为行高值,相当于设置了该line-height属性的元素的font-size大小来计算

  • inherit行高继承。如input框等元素默认行高是normal,使用inherit可以让文本样式可控性更强

vertical spacing行间距,leading

上下斜线部分为行间距。

行间距分为上下两端,分别的间距的一半

image.png

inline box 和 content-area 高度的差异叫做 leading, 和行间距是一个概念

leading 被等分在顶部不底部中间,

所以content area 一直是在inline box 垂直居中显示。

font-size: 240px;
line-height: 360px;

行间距 360px - 240px = 120px

半行间距 120px /2 = 60px

行距

行距 = line-height - font-size

content area内容区域

是一连串字符,如由上面多个em框组合而成内容区。

一般和line-height 是一样的高度

x-height

x字符高度 ,1ex就是x-height的值,

该元素的中心点与父元素基线加上x-height高度的一半对齐。

非代替元素

内容高度 = 字体 + font-szie

可以理解为 content box

替换元素

内容高度 = 自有宽高

content area 的高度与 **** 的高度差就是 leading,这个 leading 会等分被添加到 content area 的顶部与底部,所以说 content area 永远位于 inline box 的中间(垂直居中)

em-box(em框,单个字符框)

在字符串中,每一个字符都是一个em框。 em框只存在非代替元素。 em框高度 = 字体大小 font-size image.png

font-size

指定文字em框高度

  • 设置为em、百分比时,按父元素font-size计算(如父元素font-size: 20px,子元素font-size: 0.5em,则子元素实际font-size为20 * 0.5 = 10px)

  • font-size继承时(即自身没有设置font-size)得到的是计算值(如父元素font-size: 1em,需先计算成px值后再由子元素继承)

text-align

用于block、inline-block元素(inline-block对外表现为inline、对内为block)
可继承

  • left(默认值)
  • right
  • center
  • justify(行框中文字向两侧对齐)

vertical-align

vertical-align 设置line-height的参考位置,默认为baseline,可以通过设置vertial-align调整。

包含多个状态

  • top
  • text-top
  • middle
  • baseline
  • text-bottom
  • bottom

image.png

strut

strut : 空白节点 或叫 支柱 行框前面有一个宽为0的空字符。

浏览器认为每一个 line box 的起始位置都存在一个宽度为 0,没有任何字符的 匿名 inline box,会从父元素继承 line-height 的,因此它的高度会影响整个 line box 高度的计算。

baseline基线

4线格里,倒数第二条就是我们写文字的基线。 image.png

当然字体不同基线所在的位置也就不同。

1.元素基线

  • 非替换由字体决定,可理解为小写字母x的下边缘\
  • 替换元素为其inline-box的底部

2.行框基线

可以理解为在幽灵节点中的插入一个虚拟的小写字母“x”,行框基线则是这个字母“x”的底部 vertical-align值永远是默认值baseline,所以可以代表行框的基线

实战列子

已知

<!DOCTYPE html>
<html>
<head>
    <style>
        .box{ 
          border: 1px solid black; 
        } 
        img{ 
           width: 100px;
           height: 100px;
           border: 1px solid red;
        } 
    </style>
</head>
<body>
    <div class="box">
        <img src="//www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png" alt="">
    </div> 
</body>
</html>

image.png

由于浏览器会为行框插入默认空的em框 strut,所以图片会跟随着strut的baseline 对齐

image.png

等价于插入了x,可以看到 图片合x的 baseline是在一个水平上。

image.png

解决办法

  1. 设置行框 line-heigt:0
.box{ 
  border: 1px solid black; 
   line-height: 0px;
} 
  1. 设置行框 font-szie 为 0
.box{ 
  border: 1px solid black;  
   font-size: 0;
} 
  1. 设置图片的 vertical: bottom
img{ 
   width: 100px;
   height: 100px;
   border: 1px solid red;
   vertical-align: bottom;
} 
  1. 设置图片的显示方式为 block
img{ 
   width: 100px;
   height: 100px;
   border: 1px solid red; 
   display: block;
}