对齐方式与幽灵节点


问题引入

<!DOCTYPE html>
<html lang="en">
<head>
    <style>
        .box{
            width: 100%;
            height: 200px;
        }
        .left {
            display: inline-block;
            height: 100%;
            width: 200px;
            background-color: lightskyblue;
            
        }
        .right {
            display: inline-block;
            height: 100%;
            width: calc(100% - 200px);
            background-color: blueviolet;
        }
        .left img {
            width: 50%;
        }
    
</style>
</head>
<body>
    <div class="box">
        <div class="left">
            <img src="" alt="">
        </div>
        <div class="right"></div>
    </div>
</body>
</html>

效果如下

在这里插入图片描述

问题一:为什么出现了换行

在这里插入图片描述

照理来说,这个应该是恰好占满一行才对,但是从结果来看并没有。

经过和大佬的交流才知道,这是因为inline-block会产生空白间隙,所以需要再额外增加一些才能并列

width: calc(100% - 210px);

问题二:添加图片导致左右两部分错位

在这里插入图片描述

在解决了问题一之后,还有如上图所示的问题二

在这里插入图片描述

我们先指明宽高,再看看结果

.left img {
            width: 50px;
            height: 50px;
        }

在这里插入图片描述

不断修改宽高(这里主要考虑高度对布局的影响)观察结果

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

我们观察上图规律,可以看到图片放大,蓝色块反而偏移更少,而当height正好等于蓝色块高度时,偏移量刚好消失

在这里插入图片描述

而超出这个值时,紫色块发生偏移

(经过和大佬的有效交流讨论后)

我们发现上述几个样例都有一个共同点,那就是图片底部始终和紫色块底部对齐

这我们就联想到了对齐方式方面的因素,这可能是图片默认对齐方式为底部对齐导致的

所以我们给蓝色块添加如下样式:

vertical-align: top;

在这里插入图片描述

果然,效果就很棒

经过大佬的推理和测试,上述情况不仅会由img标签产生,也会对文字生效

因为文字也是有类似的对齐特性

(这也大概就是为什么vertical-align和text-align既对图片生效,又对文字生效的缘故了吧)

通过以上问题,我们应该更进一步地了解到一些东西:

对齐方式

概述

我们常用的几种对齐方式有

1.顶线对齐 top

2.中线对齐 middle

3.基线对齐 baseline

4.底线对齐 bottom

顶线中线这个还好理解,那么基线和底线又有什么区别呢?

还记得中学写英语作文的时候那个四线格吗?不记得也没关系,看看下图应该就知道了:

在这里插入图片描述

没错,我们可以认为,上述的四根线和图上的四线格由上自下一一对应

需要复习的是,英文大多以基线(baseline)为底书写,

这就意味着我们在选择对齐方式的时候也要用这样的标准进行参考

示例

基线对齐

这是文字的默认对齐方式

 .left {
            display: inline-block;
            height: 100%;
            width: 200px;
            background-color: lightskyblue;
            
            font-size: 64px;
            vertical-align: baseline;
        }
.right {
            display: inline-block;
            height: 100%;
            width: calc(100% - 230px);
            background-color: rgb(140, 58, 211);
        }
<div class="box">
        <div class="left">
            哇偶fg
        </div>
        
        <div class="right">
            哇偶fg
        </div>
</div>

image-20211212150936358

而且是对齐最后一行

在这里插入图片描述

其他对齐方式

在这里插入图片描述

幽灵节点

一开始我都以为问题解决了,结果龚老师又抛出这个概念叫我去学…

概念

<!DOCTYPE html>
<html lang="en">
<head>
  <style>
  div{
    background: yellow;
  }
  span{
    display: inline-block;
  }
  </style>
</head>
<body>

  <div>
    <span></span>
  </div>
  
</body>
</html>

我们这里可没有给span和div任何高度啊

在这里插入图片描述

在这里插入图片描述

span宽高为0,这没有问题,那么这div是怎么回事,它的高度从何而来?

我们就将撑开div高的这个“看不见的节点”称为 幽灵节点

此处是是因为行级块(这里的span设置成了inline-block)渲染时,先会在这个行级块前面生成一个空白节点,宽度为0,并且 继承font-size,line-height属性,这里的font-size是16px,line-height是font-size + 行距,也就是此处的20.667px

注意,这里的20.667px会因缩放而发生变化,所以对以下内容的数值计算不构成参考

分析一

我们进行如下修改,观察结果

设置line-height为0

<div style="line-height: 0;">
    <span></span>
 </div>

在这里插入图片描述

设置font-size为0

这里我的理解是,如果一行字的高度为0,那么行与行之间的距离也是0,

由于line-height = font-size + 行距,那么line-height也为0

<div style="font-size: 0;">
    <span></span>
 </div>

在这里插入图片描述

分析二

当然,幽灵节点还有其他体现形式,比如:

<!DOCTYPE html>
<html lang="en">
<head>
  <style>
  div{
    background: yellow;
  }
  img {
    width: 100px;
    height: 100px;
  }
  </style>
</head>
<body>

  <div>
    <img src="https://xxx.png" alt="">
  </div>

</body>
</html>

在这里插入图片描述

下方又出现了奇怪的空隙,这也是 幽灵节点的体现(因为img是内联块,所以也存在这种现象)

div{
  background: #ff3700;
}
span{
  display: inline-block;
  background-color: #fff;
}

在这里插入图片描述

上一个例子中,还没有考虑vertical-align的影响,这里则是因为vertical-align和line-height一起作用的结果,

添加一点文字后我们发现,图片的默认对齐方式是基线对齐,所以和底部的间距其实是和底线的距离

(这里没有padding,文字的背景色大小是line-height决定的,这里

让我们试着修改一下vertical-align

img {
    width: 100px;
    height: 100px;
    vertical-align: bottom;
  }

在这里插入图片描述

简直妙不可言

根据龚老师的提示,还可以修改dispaly,因为只有inline-block或者inline才会出现这种现象

我们只需要将其修改为block就可以了

img {
    display: block;
    width: 100px;
    height: 100px;
  }

确实管用

在这里插入图片描述

后记

查资料的过程中,也是发现了大量重复的文段,感觉应该都是出自一位叫做 张鑫旭的大佬之手,下面这篇文章提供了相当全面的分析,甚至让我重新审视HTML和CSS——大佬的博文


文章作者: Serio
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Serio !
  目录