知蛛网
  • 首页
  • 会员
  • 活动
  • 工作台

常见问题
活动
关于我们
联系我们
隐私协议
用户协议
会员协议
© 2026 知蛛网. 保留所有权利。
首页会员工作台我的
flynn@flynn
主页wiki简历作品集
目录
全部书籍
00-路线
  • 学习路线
  • 命名与写作规范
01-计算机基础
01-计算机网络
  • 互联网是如何工作的
  • HTTP协议
  • TCP/IP协议
  • 浏览器直接打开本地html文件,请求时的协议问题
02-浏览器原理
  • 浏览器是如何渲染页面的
  • 浏览器是如何渲染页面的
  • 面试之浏览器
03-操作系统
  • 进程与线程
  • 内存管理与虚拟内存
  • IO 模型与多路复用
  • 文件系统与页缓存
04-数据结构与算法
  • 数组与链表
  • 栈与队列
  • 哈希表
  • 树与堆
  • 基础数据结构
01-基础数据结构
02-高级算法
  • 排序算法
  • 二分查找
  • 递归与回溯
  • 动态规划
  • 双指针与滑动窗口
03-leetcode刷题
02-前端核心
01-web开发
  • Web 和 Web 标准
  • web 入门
  • web 开发
  • URL
  • 域名
  • Web服务器
  • 命令行
  • 工作流程和流程
  • 超链接
  • 浏览器指纹
02-html
  • HTML基础语法
  • HTML 概述
  • HTML 发展史
  • HTML调试
  • HTML标题与段落
  • 文本格式化
  • 强调与重要性
  • 块级元素和内联元素
  • 列表
  • 区块
  • 语义元素
  • 页面结构化和语义化
  • 超链接
  • 相对路径和绝对路径
  • 图片
  • 表格
  • 表单和按钮
  • 多媒体
  • 视频/音频
  • HTML 头部
  • HTML 字符集
  • HTML颜色
  • HTML 语言代码
  • HTML 国家/地区
  • Emoji (表情符号)
  • HTML 标签简写及全称 |
  • SVG
  • Canvas 2D
  • Canvas 3D
  • 框架 `<iframe>`
  • HTML 拖放
  • HTML5 Geolocation(地理定位)
  • Web 存储
  • HTML URL 编码
  • MathML
  • 远程图片资源在自己网站中无法展示问题
03-css
  • CSS简介
  • CSS 语法
  • CSS 创建
  • CSS 发展史
  • CSS 浏览器支持
  • CSS 选择器
  • CSS `!important` 规则
  • css颜色
  • CSS 文本格式
  • CSS 盒子模型
  • CSS 尺寸
  • CSS 内边距
  • CSS 外边距
  • CSS 边框
  • CSS 轮廓
  • CSS 背景(background)
  • CSS 溢出
  • CSS 文档流
  • CSS 显示和可见性
  • CSS 浮动
  • CSS 定位
  • CSS 对齐方式
  • CSS 网页布局
  • CSS 多列布局(CSS Multi-column Layout)
  • CSS 透明度
  • CSS 响应式设计(Responsive Design)
  • CSS 媒体查询
  • CSS 列表
  • CSS 表格
  • CSS 表单
  • CSS 链接
  • CSS 用户界面
  • CSS 计数器
  • CSS 过渡
  • CSS 动画
  • CSS 2D 转换
  • CSS 3D 转换
  • CSS 变量(CSS Custom Properties)
  • CSS 原生嵌套(CSS Nesting)
  • CSS 函数(CSS Functions)
04-javascript
  • 什么是 JavaScript?
  • 编程范式(Programming Paradigm)
  • 什么是范式?
  • ECMAScript 规范
  • 什么是语法糖
  • 开发环境搭建
  • 什么是堆和栈?
  • 什么是执行上下文
  • JavaScript 垃圾回收机制
  • 作业队列与事件循环
  • 深拷贝和浅拷贝
  • 语法与类型
  • 字面量
  • 控制流与错误处理
  • 循环与迭代
  • 函数
  • 表达式与运算符
  • 数字和字符串
  • 表达日期与时间
  • 正则表达式
  • 索引集合类
  • 带键的集合
  • 对象
  • 类
  • Promise
  • async/await
  • 迭代器和生成器
  • 国际化
  • 模块
  • 资源管理
  • 属性的可枚举性和所有权
  • 闭包
  • 继承与原型链
  • 元编程
  • 内存管理
  • 内置对象
  • arguments 对象
  • BOM 对象(浏览器对象模型)
  • DOM 对象(文档对象模型)
  • bind、apply、call的区别
  • new 操作符
  • typeof 和 instanceof 的区别
  • HTML5 Web Workers
05-typescript
  • TypeScript 类型系统基础
  • 类型体操
03-框架与跨端
01-react
  • 开发环境搭建
  • JSX
  • 组件
  • 生命周期
  • Hooks
  • 组件通信
  • 状态管理
  • React 19 新特性
  • useCallback 闭包陷阱
  • 常用的性能优化操作
  • Firbe 架构
  • React 18 新特性
  • useRef
  • 基于umijs 4.0 搭建官网
  • react+vite本地开发,如何手机联调
  • React 实现谷歌登录
  • React 项目调起 WhatsApp
02-vue
  • vue 解决跨域请求
  • 在vue2使用TinyMCE富文本编辑器
  • 使用jszip 导出新闻
  • Vue 本地开发启用 https
  • 基于vue3+vite+ts+elementplus+pinia+axios搭建后台管理系统
03-react-native
  • iOS 开发环境(RN 0.72)
  • RN 原生模块(Native Module)
  • 查看Maven包的Java包名
  • 优化 APP 启动速度
  • 安全键盘
  • 启动图与 Icon 尺寸规范
  • RN如何生成/配置iOS的开发者证书和生产证书
  • 邓白氏编码
  • 微信开放平台配置Universal Link
  • 上架至Apple App Store
04-android
  • 开发环境搭建
  • Android项目目录结构
  • 认识Gradle
04-工程化
01-git
  • 如何解决已被git跟踪文件不在跟踪
  • git标签
  • Git报错: Failed to connect to github.com port 443 解决方案
  • Git 分支操作速查
02-构建工具
  • 构建工具原理与选型
02-webpack
  • webpack 核心概念与构建流程
  • webpack 性能优化
03-vite
  • vite 为什么快
  • vite 插件与生产构建
03-测试
  • 前端测试体系
04-部署
  • Nginx 反向代理解决跨域
  • SPA 刷新非首页报 404
05-docker
  • Docker 常用命令
  • docker-compose nginx配置ssl证书
  • Docker Desktop 升级后 docker-compose 命令找不到
06-性能优化
  • 前端性能优化体系
  • 背景 GIF 优化方案
07-微前端
  • 微前端实战(qiankun)
  • 微前端 · qiankun
01-qiankun
05-后端与数据
01-nodejs
  • Node 版本与依赖的 engines 冲突
  • Express 实现 Gmail 发信(邮箱验证码)
02-php
  • 浏览器保存新闻,发布到自有网站
  • [分布式] 浏览器保存新闻,发布到自有网站
  • 邮件发送,多账号轮询
  • nginx和php-fpm通信问题导致网站页面空白
03-python
  • macOS M1 芯片 如何安装 py 和 tkinter
  • tkinter 编写的程序如何打包成桌面软件
04-架构设计
  • 后台管理系统中角色管理、管理员管理、权限设置他们三者之间的关系
05-运维
  • redis启动失败
  • 实现自动备份宝塔项目及数据库到本地
  • 宝塔面板
01-宝塔
06-实战项目
  • 实战准备工作
02-项目记录
  • AI-Chat 模块技术文档
  • CRMChat 部署
07-面试专项
01-面试
  • 面试之自我介绍
  • CSS 面试
  • JS面试
  • React面试
  • Vue面试
  • RN 面试 · 题目清单
  • RN 面试 · 答案详解
  • RN 物流公司 · 题目清单
  • RN 物流公司 · 答案详解
  • Uniapp 面试
  • 带团队经验
12-react专项
  • 一个表格,某一行的某一列数据变动了,如何优化性能?
13-reactnative专项
  • RN 开发过程中,有遇到什么棘手的问题?你是如何解决的?
14-过往面试总结
  • 冷哥传媒 · 面试题
  • 沐腾科技 · 面试题
  • 字符频率排序
02-面试八股
  • 网络八股
  • 浏览器八股
  • 工程化八股
03-算法面试题
  • 前端高频手写题
  • 场景设计题
04-真实面试经历
  • 20251027 盾蓝科技 面试
  • 20251028 芝麻甜心 面试
08-工具
01-n8n
  • 初始n8n
  • 快速入门
  • 在宝塔中搭建n8n环境
  • n8n中常用节点
  • n8n和代码的区别
02-Trae
  • Figma MCP 配置指南
03-UI_UX_pro_max
  • UI_UX_pro_max的使用
04-开发环境
  • VMWare虚拟机安装
  • PowerShell 执行策略与编码设置
98-杂项
  • A股股票交易相关费用
99-手册
  • iOS 开发者账号申请流程及费用
  • 邓白氏编码申请及费用
  • App 推送通道申请及费用
  • App 开发收费项目清单
  • 注册AWS账号
  • 使用Amazon Polly实现文本转语音
  • Google 翻译 Key 申请与前端调用
  • 使用SmsForwarder转发短信

CSS 显示和可见性

03-css2026/11/14

CSS 的 display 和 visibility 都是控制元素显示和隐藏的重要属性,但它们的工作方式和效果有本质区别。

display 属性

display 属性定义元素应该生成的框的类型,它决定了元素如何参与页面流式布局。

1. 常用 display 值

块级元素:

  • 独占一行
  • 可以设置宽度、高度
  • 默认宽度为父元素的 100%
  • 示例:<div>, <p>, <h1>-<h6>, <section>
.element {
    display: block; /* 元素显示为块级元素,前后有换行符 */
}

行内元素:

  • 在一行内显示
  • 不能设置宽度、高度
  • 宽度由内容决定
  • 示例:<span>, <a>, <strong>, <em>
.element {
    display: inline; /* 元素显示为行内元素,前后无换行符 */
}

行内块元素:

  • 像行内元素一样排列(不换行)
  • 像块级元素一样可以设置宽度、高度
  • 示例:<img>, <button>, <input>
.element {
    display: inline-block; /* 行内块元素 */
}

隐藏并移除布局:

.element {
    display: none; /* 元素隐藏,且不占据空间 */
}

2. 现代布局 display 值

Flexbox 布局:

又称:弹性布局

.container {
    display: flex; /* 块级弹性容器 */
    display: inline-flex; /* 行内弹性容器 */
}

Grid 布局:

又称:网格布局

.container {
    display: grid; /* 块级网格容器 */
    display: inline-grid; /* 行内网格容器 */
}

其他值:

.element {
    display: table; /* 像表格一样显示 */
    display: table-cell; /* 像表格单元格一样显示 */
    display: list-item; /* 像列表项一样显示 */
}

visibility 属性

visibility 属性控制元素是否可见,但不改变元素的布局位置。

常用 visibility 值:

.element {
    visibility: visible; /* 默认值,元素可见 */
    visibility: hidden; /* 元素不可见,但仍占据空间 */
    visibility: collapse; /* 主要用于表格元素,在 table-row 中可折叠行 */
}

display vs visibility 的根本区别

上一篇CSS 文档流
下一篇CSS 浮动
本页目录
`display` 属性1. 常用 `display` 值2. 现代布局 `display` 值`visibility` 属性常用 `visibility` 值:`display` vs `visibility` 的根本区别视觉与布局效果对比常见使用场景1. 使用 `display: none` 适用场景2. 使用 `visibility: hidden` 适用场景`display` 常见细节与陷阱1. `inline` 元素不能设置 `width/height`2. `display` 切换会影响 `animation/transition`3. `visibility: hidden` 仍能被点击(取决于浏览器)性能与可访问性考虑1. 性能影响2. 可访问性现代 CSS 的替代方案1. 使用 opacity2. 使用 clip-path`inline-block` 常见问题汇总问题 1:`inline-block` 之间出现“神秘空隙”问题 2:`inline-block` 会受 `vertical-align` 影响(导致对齐异常)问题 3:宽度被内容撑开,无法自动换行问题 4:`inline-block` 遇到中文时对齐异常问题 5:`inline-block` 超宽被挤压换行问题 6:`inline-block` 元素高度不一致时对齐错乱`inline-block` 的最佳实践
属性是否可见是否占空间会不会影响布局
display: none不可见不占空间会影响
visibility: hidden不可见占空间会影响布局

视觉与布局效果对比

假设有三个盒子:

[A] [B] [C]

display: none

[A] [C]      (B 完全消失)

visibility: hidden

[A] [ ] [C]  (B 的空间还在,只是透明)

常见使用场景

1. 使用 display: none 适用场景

  • 隐藏菜单项
  • 弹窗(modal)显示/关闭
  • SPA 页面切换
  • 移动端切换 tab 内容
  • 动态添加移除 DOM

2. 使用 visibility: hidden 适用场景

  • 保持布局不变隐藏内容
  • 表格某列隐形但保持宽度
  • 防止跳动的动画
  • 保留元素位置但不显示(占位)

display 常见细节与陷阱

1. inline 元素不能设置 width/height

2. display 切换会影响 animation/transition

许多 CSS 动画无法对 display 做过渡,因此常用:

opacity + visibility 实现淡入淡出

.fade {
    opacity: 0;
    visibility: hidden;
    transition: 0.3s;
}
.fade.show {
    opacity: 1;
    visibility: visible;
}

3. visibility: hidden 仍能被点击(取决于浏览器)

多数浏览器中:

  • visibility: hidden = 不可点
  • 但 opacity: 0 = 可点击(容易踩坑)

性能与可访问性考虑

1. 性能影响

/* 频繁切换时考虑性能 */
.high-performance {
    visibility: hidden; /* 重绘但不重排 */
}

.low-performance {
    display: none; /* 可能引起重排 */
}

2. 可访问性

/* 错误的可访问性做法 */
[aria-hidden="true"] {
    display: none; /* 对屏幕阅读器隐藏 */
}

/* 确保焦点管理 */
.hidden-element {
    display: none; /* 从焦点顺序中移除 */
}

.visible-but-hidden {
    visibility: hidden; /* 仍在焦点顺序中,可能有问题 */
}

现代 CSS 的替代方案

1. 使用 opacity

.fade-element {
    opacity: 0; /* 透明但占据空间 */
    pointer-events: none; /* 禁用交互 */
    transition: opacity 0.3s ease;
}

.fade-element.visible {
    opacity: 1;
    pointer-events: auto;
}

2. 使用 clip-path

.clip-hidden {
    clip-path: inset(50%); /* 隐藏但占据空间 */
    transition: clip-path 0.3s ease;
}

.clip-visible {
    clip-path: inset(0); /* 完全显示 */
}

inline-block 常见问题汇总

问题 1:inline-block 之间出现“神秘空隙”

现象:两个 inline-block 元素之间会出现 3px~6px 的空白间距:

<div class="item"></div>
<div class="item"></div>
<!-- 中间出现空隙! -->

原因:

HTML 中换行/空格会被当成空白字符处理,浏览器会把它渲染为 inline 元素间距。

解决方案:

方案 1:HTML 写在同一行

<div class="item"></div>
<div class="item"></div>

方案 2:移除中间的换行(注释法)

<div class="item"></div>
<!--
-->
<div class="item"></div>

方案 3:父元素设置 font-size: 0(最常用)

.container {
    font-size: 0;
}
.item {
    font-size: 16px; /* 恢复 */
}

方案 4:用 flex 或 grid 替代 inline-block(现代方案)

.container {
    display: flex;
}

问题 2:inline-block 会受 vertical-align 影响(导致对齐异常)

现象: 多个 inline-block 元素可能顶对齐、底对齐不一致。

原因: inline-block 本质仍是 inline,因此会受 line-height 与 vertical-align 影响。

解决:

inline-block-element {
    vertical-align: middle; /* 中线对齐 */
}
/* 或者 */
inline-block-element {
    vertical-align: top; /* 顶部对齐 */
}

问题 3:宽度被内容撑开,无法自动换行

现象:多个 inline-block 元素如果宽度不足,会自动换行,但换行位置难以控制。

解决:一般使用 flex-wrap 更可控:

.container {
    display: flex;
    flex-wrap: wrap;
}

问题 4:inline-block 遇到中文时对齐异常

原因: 中文字体行高不同,line-height 影响更明显。

解决:

.inline-block {
    line-height: 1;
}

问题 5:inline-block 超宽被挤压换行

如果父容器宽度太小,inline-block 元素会自动换行(和 inline 一样)。

解决:

/* 要禁止换行 */
parent {
    white-space: nowrap;
}

问题 6:inline-block 元素高度不一致时对齐错乱

默认 vertical-align 情况下高度不同会导致底部不齐。

解决:

.inline-block {
    vertical-align: top; /* 或 middle/bottom,按需求 */
}

inline-block 的最佳实践

推荐使用 flex 或 grid 替代 inline-block

inline-block 在现代布局中使用越来越少,因为:

  • 有空白间隙问题
  • vertical-align 影响布局
  • 多行对齐困难
  • 不是响应式设计友好