CSS必学:元素之间的空白与行内块的幽灵空白问题
作者:
WangMin
格言:努力做好自己喜欢的每一件事
CSDN原创文章
博客地址 👉 WangMin
我们在开发的过程中,难免会出现一些难以预料的问题。那么其中,CSS空白现象就是非常常见的问题之一。虽然它已经被发现很久,但仍然有许多新手和经验丰富的开发者们忽略了它对页面布局的影响。我们一起来看看吧!

元素之间空白的产生及解决方案
在学习元素之间空白的产生之前,我们需要知道块级元素与行内元素的区别
块级元素是会独占一行的,按垂直方向排列。

行内元素不会占据整行,在一条直线上排列,都是同一行,按水平方向排列

除了块级元素和行内元素,还有一种行内块元素,其实质上也是行内元素,所以多个行内块元素之间也会出现空白间隔的问题。img元素就是典型的行内块元素,这里就不举例了。
从上面我们可以明显的看出在没有设置margin的情况下,多个块级元素之间没有空白,而是从上到下紧挨这排列的
同样,行内元素span 也没有设置margin,但是多个行内元素之间存在空白部分,这是为什么呢?
因为在html中行内元素间的换行符/空格是有意义的,浏览器会在渲染时将行内元素之间的换行符/空格转换为一定像素的空白。
那知道了这个原因,就应该很容易地解决这个问题了,我们只需要在写代码的时候,将换行符删掉不就可以了吗?来试一试吧
案例1
<div class="box"><span class="span1">行内元素span</span><span class="span2">行内元素span</span><span class="span3">行内元素span</span>
</div>
<style>.box{width:400px;height: 100px;border:3px solid #fa0b0b75;background:#ccc; }span{color:#fff;}.span1{background:bisque;}.span2{background:goldenrod;}.span3{background:yellowgreen;}
</style>
案例效果如下:

这种方式虽然可以解决元素之间的空白问题,但是当页面中存在3个及以上的行内元素或者行内块元素时,这样删掉换行符会让代码看起来不清晰,很杂乱,不利于后期维护和修改,所以这种解决方式是不推荐的。
上面提到换行符/空格是有意义的,也就是说换行符/空格是属于文字,是文字的话,就可以利用font-size来控制它的大小。来试一试吧
案例2
<div class="box"><span class="span1">行内元素span</span><span class="span2">行内元素span</span><span class="span3">行内元素span</span>
</div>
<style>.box{width:400px;height: 100px;border:3px solid #fa0b0b75;background:#ccc;font-size:0;}span{color:#fff;}.span1{background:bisque;}.span2{background:goldenrod;}.span3{background:yellowgreen;}
</style>
案例效果如下:

你会发现span元素消失了,那是因为span的高度与宽度是由里面的内容撑开的,span继承了父元素div的 font-size:0属性,所以里面的内容看不见,span 也就无法呈现在页面上。如果想要span显示,就要在span元素上设置想要的字体大小。
<div class="box"><span class="span1">行内元素span</span><span class="span2">行内元素span</span><span class="span3">行内元素span</span>
</div>
<style>.box{width:400px;height: 100px;border:3px solid #fa0b0b75;background:#ccc;font-size:0;}span{color:#fff;font-size:16px;}.span1{background:bisque;}.span2{background:goldenrod;}.span3{background:yellowgreen;}
</style>
这里得到的效果就和案例1的是一样的。
这种解决方案就是给父元素设置font-size:0;在给需要显示文字的元素单独设置文字大小。 建议使用这种方式来解决元素之间空白问题。
还有一种方式就是给元素设置浮动,但是注意要给父元素清除浮动防止,父元素高度塌陷。
案例3
<div class="box"><img src="./img/5.png"/><img src="./img/5.png"/><img src="./img/5.png"/>
</div>
<style>.box{width:400px;height: 100px;border:3px solid #fa0b0b75;background:#ccc;overflow: hidden;//防止父元素高度塌陷}img{float: left;width: 100px;}
</style>
案例效果对比如下:
设置浮动之前:

设置浮动之前:

关于元素浮动导致的父元素塌陷的问题,可以参考【精选】CSS 浮动和清除浮动方法总结-CSDN博客这篇文章。
解决方案总结
1、去掉换行符和空格(不推荐)
2、给父元素设置font-size:0;在给需要显示文字的元素单独设置文字大小。(推荐)
3、给行内元素或者行内块元素设置浮动,但是要注意给父元素清除浮动,防止父元素高度塌陷。
行内块的幽灵空白问题
可能有很多人不知道行内块的幽灵空白是什么?其实这是在开发中常常会遇到的问题。你可能就遇到过,只是不清楚是什么问题,下面这张图让你明白什么是行内块的幽灵空白。这里就用典型的行内块元素img来举例。

上图红框中就是行内块产生的幽灵空白部分,那它是怎么产生的呢?
当在一个没有设置高度的块元素中添加了一个行内块元素时,幽灵空白部分就会产生。 其实这么说也不是很准确。
大家都知道其实图片垂直对齐方式默认是以文字的基线对齐的,那么这就和字母代表x和g就很大的关系了。

从上图中可以看到字母x以基线对齐的标准字母,而字母g的下半部分是超出基线的位置的,为了字母g可以完整的出现,页面中会预留出一点位置,幽灵空白部分部分就产生了。
字母x和g代表的是字母中的两种呈现方式。
关于文字对齐这里就不多说了,后面我会详细的大家说的。
我们怎么来解决这个问题呢?前面提到图片垂直对齐方式默认是以文字的基线对齐的,那改变它的垂直对齐方式是否可以解决这个问题呢?改变图片的对齐方式我们可以用vertical-align这个属性,来试一试吧!
案例4
<div class="box"><img src="./img/5.png"/>xy
</div>
<style>.box{width:400px;border:1px solid #fa0b0b75;background:blanchedalmond;}img{vertical-align:bottom}
</style>
案例效果如下:

从上图我们可以看到幽灵空白部分消失了,所以通过给图片改变其默认的垂直对齐方式是可以解决这个问题的。具体设置哪一种垂直对齐方式要看网页设计需求,这是一种比较推荐的解决方案。vertical-align属性的取值如下:
| 属性 | 属性值 | 含义 |
|---|---|---|
| vertical-align | baseline (默认值) | 与文字基线对齐 |
| vertical-align | bottom | 与文字底部对齐 |
| vertical-align | middle | 与文字中部对齐 |
| vertical-align | top | 与文字顶部对齐 |
其实也可以直接将行内块元素转换为块元素,撑开父元素就不会存在幽灵空白部分,但前提是父元素中只有行内元素,没有其他内容, 这种方式才起作用。
案例5
<div class="box"><img src="./img/5.png"/>
</div>
<style>.box{width:400px;border:1px solid #fa0b0b75;background:blanchedalmond;}img{display: block;}
</style>
案例效果如下:

上面提到图片的垂直对齐方式于文字对齐有关系,那么我们可不可以通过设置文字大小来解决这个问题呢?
其实道理跟案例2是一样的,同样给父元素设置font-size:0,如果图片后面有内容,可以在需要显示文字的元素单独设置文字大小,这里就不举例子了。
解决方案总结
1、给行内块元素设置vertical-align,但是注意属性值不能为baseline,值可以是bottom、 middle、top,根据需求而定。
2、若父元素只有一张图片,没有其他内容,将图片设置为块元素,即给图片添加display: block属性。
3、给父元素设置font-size:0,如果图片后面有内容,可以在需要显示文字的元素单独设置文字大小。
以上仅是个人见解,若有不足之处欢迎在下方评论指出,那就先分享到这里!! 😄 后续继续更新!!
相关文章:
CSS必学:元素之间的空白与行内块的幽灵空白问题
作者:WangMin 格言:努力做好自己喜欢的每一件事 CSDN原创文章 博客地址 👉 WangMin 我们在开发的过程中,难免会出现一些难以预料的问题。那么其中,CSS空白现象就是非常常见的问题之一。虽然它已经被发现很久,但仍然有许多新手和经…...
C++类中对构造函数的重载
C类中对构造函数的重载 C 允许在同一作用域中的某个函数和运算符指定多个定义,分别称为函数重载和运算符重载。 重载声明是指一个与之前已经在该作用域内声明过的函数或方法具有相同名称的声明,但是它们的参数列表和定义(实现)不…...
QtC++与QLabel详解
介绍 QLabel 类是Qt中的一个用于显示文本或图像的控件类,通常用于用户界面中以提供静态文本或图片显示的功能。以下是对QLabel在Qt中的作用的详细解释: 文本和图像显示: QLabel 可以用来显示文本和图像。这使得它成为显示标签、标题、说明或…...
090基于web+springboot的中小企业设备管理系统
欢迎大家关注,一起好好学习,天天向上 文章目录 一项目简介技术介绍 二、功能组成三、效果图四、 文章目录 一项目简介 本中小企业设备管理系统管理员有个人中心,用户管理,员工管理,设备信息管理,配件信息管…...
input 调起键盘 ,键盘距离输入框底部太近
input 调起键盘 ,键盘距离输入框底部太近 解决方法 cursorSpacing‘20’ 单位是 ‘px’ <input cursorSpacing20 type"text" v-model"replyMain" />距离底部距离 20px ,输入框距离键盘距离是20px...
前端深拷贝与浅拷贝的实现
1、浅拷贝和深拷贝的定义 1.1、浅拷贝 有两种方式,一种是把一个对象里面的所有的属性值和方法都复制给另一个对象,另一种是直接把一个对象赋给另一个对象,使得两个都指向同一个对象。浅拷贝对内存地址的复制,让目标对象指针和源…...
哆啦百宝箱APP
专门为年轻人设计的APP,主打的免费、无恶心广告、不获取任何个人信息。 哆啦百宝箱 ● 永久免费 ● 无恶心广告 ● 种类巨多 ● 全民参与 ● 爆款功能 ● 用心创造 哆啦百宝箱 提供了从日常、图片、查询、设备、趣味、娱乐等多方面的功能, 操作简单&a…...
lv9 嵌入式开发 数据库sqlite
1 数据库基本概念 数据(Data) 能够输入计算机并能被计算机程序识别和处理的信息集合 数据库 (Database) 数据库是在数据库管理系统管理和控制之下,存放在存储介质上的数据集合 2 常用的数据库 大型数据库…...
「Verilog学习笔记」异步复位的串联T触发器
专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点,刷题网站用的是牛客网 分析 这道题目里我们有两个需要明确的点: 1. 什么是异步复位 2. 什么是串联的T触发器 关于第一个点,可以看我的这篇文章,已经整理好了&a…...
什么是51单片机,,如何写代码,并且烧录?
文章目录 1.单片机介绍2.Keil 5操作1.打开Keil 5 3 新建工程3.添加文件并写代码4.添加到group5,设置6.check7.编译8.打开头文件9 调整编辑器 4.烧录1.烧录程序2.串口查询 5.Debug1.首先编译2.调试3.查询 6 51单片机汇编指令1.格式2.符号3.寻址4.数据传送与交换指令5.交换指令6 …...
Multer 实现文件上传功能
Multer 实现文件上传功能 前言:Multer 安装和使用1、安装2、使用2-1 前端代码2-2 后端代码3、实现效果前言: post请求一般有4种数据类型: application/x-www-form-urlencodedmultipart/form-dataapplication/jsontext/xml相应后端Express会使用不同的中间件来解析不同类型的…...
Excel·VBA工作表导出为图片
《Excel转图片别再截图啦!用这4个方法,高清且无损!》,excel转为图片一般方法较为简单,那么能否使用vba将excel转为图片 选中区域导出为图片 zoom设置为2,导出图片较为清晰 Sub 选中区域导出为图片()Dim …...
【零基础抓包】Fiddler超详细教学(一)
Fiddler 1、什么是 Fiddler? Fiddler 是一个 HTTP 协议调试代理工具,它能够记录并检查所有你的电脑和互联网之间的 HTTP 通讯。Fiddler 提供了电脑端、移动端的抓包、包括 http 协议和 https 协议都可以捕获到报文并进行分析;可以设置断点调试、截取…...
快速入手maven
文章目录 Maven介绍Maven安装和配置基于IDEA的Maven工程创建梳理Maven工程GAVP属性Idea构建Maven JavaSE工程Idea构建Maven JavaEE工程1. 手动创建2. 插件方式创建 Maven工程项目结构说明Maven核心功能依赖和构建管理依赖传递和冲突依赖导入失败场景和解决方案扩展构建管理和插…...
Mysql Binlog日志
Mysql Binlog是二进制格式的日志文件,但是不能把binlog文件等同于OS系统某目录下的具体文件,这是狭隘的。Binlog是用来记录Mysql内部对数据库的改动(只记录对数据的修改操作),主要用于数据库的主从复制、数据同步以及增…...
高级深入--day45
官方站点:GitHub - rmax/scrapy-redis: Redis-based components for Scrapy. scrapy-redis的官方文档写的比较简洁,没有提及其运行原理,所以如果想全面的理解分布式爬虫的运行原理,还是得看scrapy-redis的源代码才行。 scrapy-r…...
shell_66.Linux修改或移除信号捕获
修改或移除信号捕获 要想在脚本中的不同位置进行不同的信号捕获处理,只需重新使用带有新选项的 trap 命令即可: $ cat trapmod.sh #!/bin/bash #Modifying a set trap # trap "echo Sorry...Ctrl-C is trapped." SIGINT # count1 whi…...
5 ip的分配
如上一节所述,需要和其他设备通信,那么需要先配置ip. 1、如何配置ip 1.可以使用 ifconfig,也可以使用 ip addr 2.设置好了以后,用这两个命令,将网卡 up 一下,就可以了 //---------------------------- 使…...
【Python机器学习】零基础掌握StackingClassifier集成学习
如何精确地预测花的种类?一个简单但强大的方法引入了! 在现实生活中,生物学家和园艺爱好者经常面临一个问题:如何准确地识别和分类不同种类的花?这不仅仅是一个纯粹的学术问题,也有实际应用,比如在植物育种、生态研究等方面。为 了解决这个问题,一种叫做堆叠分类(St…...
Spring Boot 常见面试题
目录 1.Spring Boot 快速入门什么是 Spring Boot?有什么优点?Spring Boot 与 Spring MVC 有什么区别?Spring 与 Spring Boot 有什么关系?✨什么是 Spring Boot Starters?Spring Boot 支持哪些内嵌 Servlet 容器?如何设…...
Ostrakon-VL-8B多模态运维监控实战:智能日志分析与故障预警
Ostrakon-VL-8B多模态运维监控实战:智能日志分析与故障预警 最近和几个做运维的朋友聊天,大家普遍都在吐槽一件事:每天上班就像在“看监控”和“查日志”之间来回切换。服务器告警一响,就得一头扎进海量的日志文件里,…...
三步搞定空洞骑士模组管理:Scarab让复杂依赖关系变得简单
三步搞定空洞骑士模组管理:Scarab让复杂依赖关系变得简单 【免费下载链接】Scarab An installer for Hollow Knight mods written in Avalonia. 项目地址: https://gitcode.com/gh_mirrors/sc/Scarab 还在为《空洞骑士》模组安装的各种技术难题而头疼吗&…...
独立创业自动化系统构建指南:从副业到被动收入的实践路径
独立创业自动化系统构建指南:从副业到被动收入的实践路径 【免费下载链接】opc-methodology 《一人企业方法论》第二版,也适合做其他副业(比如自媒体、电商、数字商品)的非技术人群。 项目地址: https://gitcode.com/GitHub_Tre…...
Kotlin协程取消机制实战:用suspendCancellableCoroutine避免你的后台任务内存泄漏
Kotlin协程取消机制实战:用suspendCancellableCoroutine避免内存泄漏 当你在安卓应用中处理一个耗时任务时,用户突然退出页面会发生什么?那些未完成的网络请求、数据库查询和文件操作可能仍在后台默默消耗资源。更糟的是,如果这些…...
SpringAI与DeepSeek集成:兼容OpenAI API的流式对话实践
1. 环境准备与基础配置 在开始集成SpringAI与DeepSeek之前,我们需要确保开发环境满足以下要求: JDK 17或更高版本:Spring Boot 3.x系列需要JDK 17作为最低版本支持Spring Boot 3.4.2:这是当前推荐的稳定版本Maven或Gradle…...
实战指南:基于kimi与快马平台开发电商库存预警管理系统
最近在做一个电商后台管理系统时,遇到了库存预警的需求。传统开发方式需要从零开始写大量代码,但通过InsCode(快马)平台的Kimi模型,我快速实现了这个功能。下面分享具体实现过程: 需求分析 电商库存管理最关键的就是实时掌握库存…...
AI赋能低代码开发:JeecgBoot如何用人工智能重塑企业级应用开发
AI赋能低代码开发:JeecgBoot如何用人工智能重塑企业级应用开发 【免费下载链接】jeecg-boot 一款 AI 驱动的低代码平台,提供"零代码"与"代码生成"双模式——零代码模式一句话搭建系统,代码生成模式自动输出前后端代码与建…...
ColorControl:为什么你的显示器色彩总是不对劲?深度解析开源显示控制工具
ColorControl:为什么你的显示器色彩总是不对劲?深度解析开源显示控制工具 【免费下载链接】ColorControl Easily change NVIDIA display settings and/or control LG TVs 项目地址: https://gitcode.com/gh_mirrors/co/ColorControl 你是否曾为不…...
TranslucentTB:3分钟让Windows任务栏颜值蜕变的轻量神器
TranslucentTB:3分钟让Windows任务栏颜值蜕变的轻量神器 【免费下载链接】TranslucentTB A lightweight utility that makes the Windows taskbar translucent/transparent. 项目地址: https://gitcode.com/gh_mirrors/tr/TranslucentTB 还在忍受Windows任务…...
如何用百元电视盒子打造你的第一台Linux服务器?这个开源项目让你轻松上手!
如何用百元电视盒子打造你的第一台Linux服务器?这个开源项目让你轻松上手! 【免费下载链接】amlogic-s9xxx-armbian Supports running Armbian on Amlogic, Allwinner, and Rockchip devices. Support a311d, s922x, s905x3, s905x2, s912, s905d, s905x…...
