第12篇元素的显示类型与可见性HTML 元素默认有不同的显示类型——块级、行内、行内块等。理解display属性的各种取值是控制页面布局的关键。本篇还将讲解visibility与opacity在隐藏元素时的本质区别。学习目标掌握 display 的五大类取值外部值、内部值、列表值、属性值、混合值理解块级元素与行内元素的本质区别掌握 inline-block 的使用场景与常见问题理解 visibility: hidden 与 display: none 的区别了解 display: contents 和 display: none 的现代用法掌握元素的隐藏策略选择display/visibility/opacity核心知识点一、display 的分类CSSdisplay属性值繁多可以按功能分为几大类外部显示值Outer Display决定元素在流中的行为值说明block块级元素独占一行inline行内元素随文本流排列run-in实验性浏览器支持差内部显示值Inner Display决定子元素的布局方式值说明flow正常流布局默认flow-root创建 BFC类似 block 但行为更规范flexFlexbox 布局gridGrid 布局table表格布局组合写法/* 新版语法外部 内部 */.container{display:block flow;/* 等价于 display: block */display:block flex;/* 等价于 display: flex */display:inline flex;/* 等价于 display: inline-flex */} 实际开发中简写形式block、flex、inline-flex等更常用。二、块级元素 vs 行内元素块级元素Block-leveldiv, p, h1-h6, ul, ol, li, section, article, header, footer, aside, nav, form, table{display:block;}特征独占一行前后有换行可以设置 width、height、margin、padding默认宽度为父容器的 100%高度由内容决定默认.block-demo{display:block;width:200px;height:100px;padding:20px;margin:10px 0;background:#e3f2fd;}行内元素Inlinespan, a, strong, em, i, b, code, label, input, img, button{display:inline;}特征不独占一行随文本流排列不能设置 width 和 height无效水平方向的 margin 和 padding 有效垂直方向可能影响布局但不撑开容器宽度由内容决定.inline-demo{display:inline;width:200px;/* ❌ 无效 */height:100px;/* ❌ 无效 */padding:10px;/* 水平有效垂直可能重叠 */margin:0 10px;/* 水平有效垂直无效 */background:#e8f5e9;}行内块元素Inline-block结合了两者的优点.inline-block-demo{display:inline-block;/* 可以设置 width/height像 block */width:100px;height:100px;/* 同时不独占一行像 inline */padding:10px;margin:5px;background:#fff3e0;}经典应用场景横向导航菜单.nav-list{list-style:none;padding:0;}.nav-list li{display:inline-block;padding:10px 20px;background:#4a90d9;color:white;}inline-block 的幽灵空白问题divclasscontainerspanclassitemA/spanspanclassitemB/spanspanclassitemC/span/div.item{display:inline-block;width:100px;height:100px;background:#e3f2fd;}/* A、B、C 之间会有约 4px 的空白间隙来自 HTML 中的换行符 */解决方案/* 方案 1父元素设置 font-size: 0 */.container{font-size:0;}.container .item{font-size:16px;/* 子元素重新设置字号 */}/* 方案 2HTML 中不写换行不推荐代码可读性差 */spanA/spanspanB/spanspanC/span/* 方案 3使用 Flexbox现代推荐 */.container{display:flex;gap:0;/* 无间隙 */}三、display 的其他重要取值display: none.hidden{display:none;}元素完全从文档流中移除不占据任何空间无法交互不能点击、不能获取焦点子元素也全部不可见display: contents.wrapper{display:contents;}元素本身消失但其子元素仍然保留在文档流中元素本身不再生成盒子用于减少多余的 DOM 层级对布局的影响divclassgrid-containerdivclasswrapper!-- display: contents --divclassitemA/div!-- 直接参与 grid 布局 --divclassitemB/div/divdivclassitemC/div/divdisplay: list-itemli{display:list-item;/* 生成块级盒子 列表标记盒子 */}四、visibility: hidden vs display: none vs opacity: 0三种隐藏元素的方式本质完全不同属性占据空间可交互子元素可见性过渡动画display: none❌ 否❌ 否❌ 全部不可见❌ 不可过渡visibility: hidden✅ 是❌ 否❌ 全部不可见✅ 可过渡opacity: 0✅ 是✅ 是需配合 pointer-events✅ 子元素也透明✅ 可过渡/* display: none — 彻底移除 */.modal-hidden{display:none;}/* visibility: hidden — 占位但不可见 */.skeleton-loading{visibility:hidden;transition:visibility 0.3s;}/* opacity: 0 — 透明但仍可交互注意 */.fade-out{opacity:0;transition:opacity 0.3s;pointer-events:none;/* 禁用交互防止误点 */}实战配合过渡动画的显示/隐藏/* 从 opacity 过渡到 display: none 的技巧 */.fade-element{opacity:1;transition:opacity 0.3s;}.fade-element.hidden{opacity:0;/* 还需要 JS 在动画结束后设置 display: none */} 现代 CSS 可以使用starting-style和display的过渡Chrome 116.dialog{display:none;opacity:0;transition:opacity 0.3s;}.dialog.open{display:block;starting-style{opacity:0;}opacity:1;}五、显示类型的转换/* 将行内元素转为块级 */a.block-link{display:block;padding:10px;}/* 将块级元素转为行内 */li.inline-item{display:inline;}/* 行内块既保持行内特性又能设置宽高 */.button-group button{display:inline-block;width:120px;height:40px;}动手练习练习 1导航菜单布局实现一个横向导航菜单使用inline-block实现横向排列解决 inline-block 之间的空白间隙每个菜单项有固定宽度垂直居中练习 2三种隐藏方式对比创建三个相同的卡片分别用display: none、visibility: hidden、opacity: 0隐藏观察它们对页面布局的影响尝试在隐藏状态下点击元素为visibility和opacity添加过渡动画练习 3display: contents 实战给定以下 HTML 结构divclassgriddivclasswrapperdivclassitem1/divdivclassitem2/div/divdivclassitem3/divdivclassitem4/div/div给.grid设置display: grid; grid-template-columns: repeat(4, 1fr);给.wrapper设置display: contents观察 4 个.item是否均匀分布为 4 列常见误区 ⚠️误区真相“display: none和visibility: hidden一样”display: none不占据空间visibility: hidden占据空间但不可见“opacity: 0的元素不可点击”opacity: 0的元素仍然可交互需要配合pointer-events: none“行内元素不能设置 padding”可以设置但垂直 padding 不会撑开父元素高度“inline-block不会有布局问题”inline-block 元素间有 4px 左右的幽灵空白间隙“所有元素默认都是 block”不同元素默认值不同div 是 blockspan 是 inlineimg 是 inline“display: contents会隐藏子元素”不会它只隐藏元素自身子元素直接参与父布局“display可以过渡动画”传统上display不可过渡现代浏览器支持displaystarting-style“width: auto的 inline-block 和 block 一样”inline-block的width: auto由内容决定block则尽可能宽速查卡片 display 取值速查值外部行为内部行为block块级正常流inline行内正常流inline-block行内块级格式化none无移除—flex块级Flexboxinline-flex行内Flexboxgrid块级Gridinline-grid行内Gridcontents自身消失子元素上浮隐藏元素对比display:none;/* 彻底消失不占位不可交互 */visibility:hidden;/* 隐形占位不可交互 */opacity:0;/* 透明占位默认可交互 */opacity:0;pointer-events:none;/* 透明占位不可交互推荐方案 */inline-block 间隙解决.parent{font-size:0;/* 消除间隙 */}.parent *{font-size:16px;/* 子元素恢复字号 */}扩展阅读MDN: displayMDN: visibilityMDN: opacityCSS-Tricks: display: contents英文配套代码CODE/12/display-types.html — 显示类型对比演示CODE/12/visibility-demo.html — 三种隐藏方式对比下一步进入 第13篇背景系统详解学习如何用背景属性创造丰富的视觉效果。
第12篇:元素的显示类型与可见性
发布时间:2026/6/15 0:37:13
第12篇元素的显示类型与可见性HTML 元素默认有不同的显示类型——块级、行内、行内块等。理解display属性的各种取值是控制页面布局的关键。本篇还将讲解visibility与opacity在隐藏元素时的本质区别。学习目标掌握 display 的五大类取值外部值、内部值、列表值、属性值、混合值理解块级元素与行内元素的本质区别掌握 inline-block 的使用场景与常见问题理解 visibility: hidden 与 display: none 的区别了解 display: contents 和 display: none 的现代用法掌握元素的隐藏策略选择display/visibility/opacity核心知识点一、display 的分类CSSdisplay属性值繁多可以按功能分为几大类外部显示值Outer Display决定元素在流中的行为值说明block块级元素独占一行inline行内元素随文本流排列run-in实验性浏览器支持差内部显示值Inner Display决定子元素的布局方式值说明flow正常流布局默认flow-root创建 BFC类似 block 但行为更规范flexFlexbox 布局gridGrid 布局table表格布局组合写法/* 新版语法外部 内部 */.container{display:block flow;/* 等价于 display: block */display:block flex;/* 等价于 display: flex */display:inline flex;/* 等价于 display: inline-flex */} 实际开发中简写形式block、flex、inline-flex等更常用。二、块级元素 vs 行内元素块级元素Block-leveldiv, p, h1-h6, ul, ol, li, section, article, header, footer, aside, nav, form, table{display:block;}特征独占一行前后有换行可以设置 width、height、margin、padding默认宽度为父容器的 100%高度由内容决定默认.block-demo{display:block;width:200px;height:100px;padding:20px;margin:10px 0;background:#e3f2fd;}行内元素Inlinespan, a, strong, em, i, b, code, label, input, img, button{display:inline;}特征不独占一行随文本流排列不能设置 width 和 height无效水平方向的 margin 和 padding 有效垂直方向可能影响布局但不撑开容器宽度由内容决定.inline-demo{display:inline;width:200px;/* ❌ 无效 */height:100px;/* ❌ 无效 */padding:10px;/* 水平有效垂直可能重叠 */margin:0 10px;/* 水平有效垂直无效 */background:#e8f5e9;}行内块元素Inline-block结合了两者的优点.inline-block-demo{display:inline-block;/* 可以设置 width/height像 block */width:100px;height:100px;/* 同时不独占一行像 inline */padding:10px;margin:5px;background:#fff3e0;}经典应用场景横向导航菜单.nav-list{list-style:none;padding:0;}.nav-list li{display:inline-block;padding:10px 20px;background:#4a90d9;color:white;}inline-block 的幽灵空白问题divclasscontainerspanclassitemA/spanspanclassitemB/spanspanclassitemC/span/div.item{display:inline-block;width:100px;height:100px;background:#e3f2fd;}/* A、B、C 之间会有约 4px 的空白间隙来自 HTML 中的换行符 */解决方案/* 方案 1父元素设置 font-size: 0 */.container{font-size:0;}.container .item{font-size:16px;/* 子元素重新设置字号 */}/* 方案 2HTML 中不写换行不推荐代码可读性差 */spanA/spanspanB/spanspanC/span/* 方案 3使用 Flexbox现代推荐 */.container{display:flex;gap:0;/* 无间隙 */}三、display 的其他重要取值display: none.hidden{display:none;}元素完全从文档流中移除不占据任何空间无法交互不能点击、不能获取焦点子元素也全部不可见display: contents.wrapper{display:contents;}元素本身消失但其子元素仍然保留在文档流中元素本身不再生成盒子用于减少多余的 DOM 层级对布局的影响divclassgrid-containerdivclasswrapper!-- display: contents --divclassitemA/div!-- 直接参与 grid 布局 --divclassitemB/div/divdivclassitemC/div/divdisplay: list-itemli{display:list-item;/* 生成块级盒子 列表标记盒子 */}四、visibility: hidden vs display: none vs opacity: 0三种隐藏元素的方式本质完全不同属性占据空间可交互子元素可见性过渡动画display: none❌ 否❌ 否❌ 全部不可见❌ 不可过渡visibility: hidden✅ 是❌ 否❌ 全部不可见✅ 可过渡opacity: 0✅ 是✅ 是需配合 pointer-events✅ 子元素也透明✅ 可过渡/* display: none — 彻底移除 */.modal-hidden{display:none;}/* visibility: hidden — 占位但不可见 */.skeleton-loading{visibility:hidden;transition:visibility 0.3s;}/* opacity: 0 — 透明但仍可交互注意 */.fade-out{opacity:0;transition:opacity 0.3s;pointer-events:none;/* 禁用交互防止误点 */}实战配合过渡动画的显示/隐藏/* 从 opacity 过渡到 display: none 的技巧 */.fade-element{opacity:1;transition:opacity 0.3s;}.fade-element.hidden{opacity:0;/* 还需要 JS 在动画结束后设置 display: none */} 现代 CSS 可以使用starting-style和display的过渡Chrome 116.dialog{display:none;opacity:0;transition:opacity 0.3s;}.dialog.open{display:block;starting-style{opacity:0;}opacity:1;}五、显示类型的转换/* 将行内元素转为块级 */a.block-link{display:block;padding:10px;}/* 将块级元素转为行内 */li.inline-item{display:inline;}/* 行内块既保持行内特性又能设置宽高 */.button-group button{display:inline-block;width:120px;height:40px;}动手练习练习 1导航菜单布局实现一个横向导航菜单使用inline-block实现横向排列解决 inline-block 之间的空白间隙每个菜单项有固定宽度垂直居中练习 2三种隐藏方式对比创建三个相同的卡片分别用display: none、visibility: hidden、opacity: 0隐藏观察它们对页面布局的影响尝试在隐藏状态下点击元素为visibility和opacity添加过渡动画练习 3display: contents 实战给定以下 HTML 结构divclassgriddivclasswrapperdivclassitem1/divdivclassitem2/div/divdivclassitem3/divdivclassitem4/div/div给.grid设置display: grid; grid-template-columns: repeat(4, 1fr);给.wrapper设置display: contents观察 4 个.item是否均匀分布为 4 列常见误区 ⚠️误区真相“display: none和visibility: hidden一样”display: none不占据空间visibility: hidden占据空间但不可见“opacity: 0的元素不可点击”opacity: 0的元素仍然可交互需要配合pointer-events: none“行内元素不能设置 padding”可以设置但垂直 padding 不会撑开父元素高度“inline-block不会有布局问题”inline-block 元素间有 4px 左右的幽灵空白间隙“所有元素默认都是 block”不同元素默认值不同div 是 blockspan 是 inlineimg 是 inline“display: contents会隐藏子元素”不会它只隐藏元素自身子元素直接参与父布局“display可以过渡动画”传统上display不可过渡现代浏览器支持displaystarting-style“width: auto的 inline-block 和 block 一样”inline-block的width: auto由内容决定block则尽可能宽速查卡片 display 取值速查值外部行为内部行为block块级正常流inline行内正常流inline-block行内块级格式化none无移除—flex块级Flexboxinline-flex行内Flexboxgrid块级Gridinline-grid行内Gridcontents自身消失子元素上浮隐藏元素对比display:none;/* 彻底消失不占位不可交互 */visibility:hidden;/* 隐形占位不可交互 */opacity:0;/* 透明占位默认可交互 */opacity:0;pointer-events:none;/* 透明占位不可交互推荐方案 */inline-block 间隙解决.parent{font-size:0;/* 消除间隙 */}.parent *{font-size:16px;/* 子元素恢复字号 */}扩展阅读MDN: displayMDN: visibilityMDN: opacityCSS-Tricks: display: contents英文配套代码CODE/12/display-types.html — 显示类型对比演示CODE/12/visibility-demo.html — 三种隐藏方式对比下一步进入 第13篇背景系统详解学习如何用背景属性创造丰富的视觉效果。