CSS visibility 属性

CSS visibility 语法

在 CSS 中,visibility 属性用于控制网页中某个元素是否可见。它可以让元素 “看不见”,但不会从页面上 “消失”,也就是说它还会占据空间。

语法:

visibility: 关键字;

说明:

visibility 属性有 3 种取值,如下表所示。

visibility 属性取值
取值 说明
visible(默认值) 元素是可见的
hidden 元素是不可见的,但它仍然占据文档流中的空间
collapse 主要用于表格行、列、列组和行组

当取值为 collapse 时,需要分为以下 2 种情况。

  • 对于表格行、行组、列、列组,collapse 会隐藏元素,并且该空间可以被表格的其他内容使用。这可能会导致表格的其他部分的尺寸减小,从而高效地移除行或列而不会破坏表格布局。
  • 对于其他元素,collapse 的行为与 hidden 相同。

对于 visibility 属性,小伙伴们还需要清楚以下几点。

  • visibility: hidden; 不会响应鼠标事件(类似透明玻璃,点击穿透)。
  • visibility 属性可以触发 重绘(repaint),但不会触发 回流(reflow)。
  • visibility 属性不适用于完全隐藏元素的动画过渡效果。

提示:

  • visibility 通常配合 JavaScript 来控制元素的显示和因此,而不会破坏页面布局。
  • visibility 可以用于实现鼠标悬停显示某些内容(如下拉菜单)。

CSS visibility 摘要

属于 CSS 盒子模型
使用频率
是否继承
默认值 visible
兼容性 查看
官方文档 查看
MDN 查看

CSS visibility 示例

接下来,我们通过几个简单的例子来讲解一下 CSS visibility 属性是如何使用的。

示例 1:visibility 基本用法

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title></title>
    <style>
        div {
            width: 100px;
            height: 100px;
            margin: 10px;
        }
        .box1 {
            visibility: visible;     /* 默认值,元素可见 */
            background-color: lightblue;
        }
        .box2 {
            visibility: hidden;     /* 元素隐藏但占据空间 */
            background-color: lightgreen;
        }
        .box3 {
            visibility: visible;    /* 元素可见 */
            background-color: lightcoral;
            
        }
    </style>
</head>
<body>
    <div class="box1">可见元素1</div>
    <div class="box2">隐藏元素</div>
    <div class="box3">可见元素2</div>
</body>
</html>

页面效果如下图所示。

visibility 基本用法

分析:

在这个示例中,我们为 box1 和 box3 设置了 visibility: visible;,所以它们正常显示出来。然后为 box2 设置了 visibility: hidden;,所以它被隐藏了。

但需要注意的是,box2 原来占据的空间是仍然保留着的,因此我们可以看到可见元素 1 和可见元素 2 之间有一个空白区域。

visibility: hidden; 与 display: none; 的区别

visibility: hidden; 与 display: none; 都可以用于隐藏元素,但它们之间有着本质的区别,主要体现在以下 4 个方面。

1. 是否占据空间

display: none; 元素会被完全从文档流中移除。它不会占据任何空间,就像它从来不存在一样。display: none; 会影响其他元素的布局,其他元素会填补被移除元素留下的空白。

visibility: hidden; 元素虽然被隐藏了,但它仍然占据着原本的空间。它的盒子模型(包括宽度、高度、边距等)仍然存在于文档流中,只是内容不可见。其他元素的布局不会因为它的隐藏而改变。

2. 是否渲染

display: none; 元素不会被渲染。

visibility: hidden; 元素会被渲染,只是设置为不可见。

3. 子元素的继承

display: none; 子元素也会被隐藏,并且无法通过设置 display: block; 等属性来重新显示。

visibility: hidden; 子元素会继承 visibility: hidden; 属性而隐藏。但是子元素可以通过设置 visibility: visible; 来重新显示,即使父元素是隐藏的。

4. 事件处理

display: none; 元素完全不存在于布局中,无法接收任何事件(如点击、悬停等)。

visibility: hidden; 虽然元素不可见,但在某些情况下(特别是在旧浏览器或特定设置下),它仍然可能接收事件。不过通常为了确保兼容性,隐藏的元素不应该依赖于接收事件。子元素如果通过 visibility: visible; 恢复可见,则可以接收事件。

5. 屏幕阅读器(Accessibility)

display: none;:元素从可访问性树中移除,屏幕阅读器不会读取。

visibility: hidden;:元素也会从可访问性树中移除,屏幕阅读器不会读取(这点与 opacity: 0 不同,opacity: 0 依然会被读取)。

提示: 如果小伙伴们对 display 属性理解不深,可以查看:display 属性

示例 2:visibility: hidden; vs display: none;

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title></title>
    <style>
        div {
            width: 100px;
            height: 100px;
            margin: 10px;
        }
        .box1 {
            background-color: lightcoral;
        }
        .box2 {
            background-color: lightskyblue;
            display: none;
        }
        .box3 {
            background-color: lightseagreen;
        }

    </style>
</head>
<body>
    <div class="box1">box1</div>
    <div class="box2">box2</div>
    <div class="box3">box3</div>
</body>
</html>

页面效果如下图所示。

display: none; 的效果

分析:

在这个例子中,我们给 box2 设置了 display: none;,此时 box2 会完全隐藏起来。如果我们将 display: none; 改为 visibility: hidden;,此时页面效果如下图所示。

visibility: hidden; 的效果

当使用 visibility: hidden; 时,虽然 box2 变成空白了,但它占据的位置依然保留了下来。

上一篇: box-shadow

下一篇: resize

给站长反馈

绿叶网正在不断完善中,小伙伴们如果发现任何问题,还望多多给站长反馈,谢谢!

邮箱:lvyenet@vip.qq.com

「绿叶网」服务号
绿叶网服务号放大
关注服务号,微信也能看教程。
绿叶网服务号