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 容器?如何设…...
wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...
微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...
Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...
mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...
GitHub 趋势日报 (2025年06月06日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...
GO协程(Goroutine)问题总结
在使用Go语言来编写代码时,遇到的一些问题总结一下 [参考文档]:https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现: 今天在看到这个教程的时候,在自己的电…...
Bean 作用域有哪些?如何答出技术深度?
导语: Spring 面试绕不开 Bean 的作用域问题,这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开,结合典型面试题及实战场景,帮你厘清重点,打破模板式回答,…...
tomcat入门
1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效,稳定,易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...
