【发布时间】:2010-09-13 01:56:08
【问题描述】:
CSS 规则visibility:hidden 和display:none 都导致元素不可见。这些是同义词吗?
【问题讨论】:
标签: css visibility
CSS 规则visibility:hidden 和display:none 都导致元素不可见。这些是同义词吗?
【问题讨论】:
标签: css visibility
display:none 从布局流中移除元素。
visibility:hidden 将其隐藏但留下空间。
【讨论】:
display:none 表示该标签根本不会出现在页面上(尽管您仍然可以通过 dom 与它进行交互)。其他标签之间不会有空间分配给它。
visibility:hidden 表示与display:none 不同,标签不可见,但在页面上为其分配了空间。标记已呈现,只是在页面上看不到。
例如:
test | <span style="[style-tag-value]">Appropriate style in this tag</span> | test
将[style-tag-value] 替换为display:none 会导致:
test | | test
将[style-tag-value] 替换为visibility:hidden 会导致:
test | | test
【讨论】:
visibility: hidden 和 display: none 将具有同等的性能,因为它们都重新触发布局、绘制和合成。但是,opacity: 0 在功能上等同于visibility: hidden,并且不会重新触发布局步骤,因此如果您不介意仍在分配的空白空间,我建议您使用它(否则使用display: none)。
opacity: 0 在处理输入或按钮时应谨慎使用,因为它们仍然存在并可能导致奇怪的用户交互。
display: none 将元素从页面中完全移除,并且页面的构建就像该元素根本不存在一样。
Visibility: hidden 会在文档流中留下空间,即使您看不到它。
这可能会或可能不会有很大的不同,具体取决于您在做什么。
【讨论】:
它们不是同义词 - display: none 从页面流中删除元素,页面的其余部分就像它不存在一样流动。
visibility: hidden 隐藏元素而不是页面流,在页面上为它留出空间。
【讨论】:
使用visibility:hidden,对象仍然占据页面的垂直高度。使用display:none,它被完全删除。如果您在图像下方有文本并且您执行display:none,则该文本将向上移动以填充图像所在的空间。如果你做可见性:隐藏文本将保留在同一位置。
【讨论】:
display:none 将隐藏元素并折叠占用的空间,而visibility:hidden 将隐藏元素并保留元素空间。 display:none 还会影响旧版本 IE 和 Safari 中 javascript 提供的一些属性。
【讨论】:
它们不是同义词。
display:none从页面的正常流程中移除元素,允许其他元素填充。
visibility:hidden 将元素留在页面的正常流程中,因此仍然占用空间。
想象一下,您在游乐园排队兜风,而排队的人非常吵闹,以至于安全人员将他们从队伍中拉了出来。然后,排队的每个人都将向前移动一个位置以填补现在的空位。这就像display:none。
将此与类似的情况进行对比,但您面前的某个人披上了隐形斗篷。在查看线路时,看起来好像有一个空白空间,但人们无法真正填满那个看起来空白的空间,因为有人仍然在那里。这就像visibility:hidden。
【讨论】:
值得补充的一点是,虽然没有被问到,但还有第三个选项可以使对象完全透明。考虑:
1st <a href="http://example.com" style="display: none;">unseen</a> link.<br />
2nd <a href="http://example.com" style="visibility: hidden;">unseen</a> link.<br />
3rd <a href="http://example.com" style="opacity: 0;">unseen</a> link.
(一定要点击上方的“运行代码sn-p”按钮查看结果。)
1 和 2 的区别已经指出(即 2 仍然占用空间)。但是,2 和 3 有区别:在情况 3 中,鼠标悬停在链接上时仍然会切换到手,用户仍然可以点击链接,并且仍然会在链接上触发 Javascript 事件。这通常不是您想要的行为(但有时可能是?)。
另一个区别是如果你选择文本,然后复制/粘贴为纯文本,你会得到以下内容:
1st link.
2nd link.
3rd unseen link.
在情况 3 中,文本确实被复制了。也许这对于某种类型的水印很有用,或者如果您想隐藏一个版权声明,如果用户不小心复制/粘贴了您的内容就会出现?
【讨论】:
如果可见性属性设置为"hidden",浏览器仍会在页面上为内容占用空间,即使它是不可见的。
但是当我们将对象设置为"display:none" 时,浏览器不会在页面上为其内容分配空间。
例子:
<div style="display:none">
Content not display on screen and even space not taken.
</div>
<div style="visibility:hidden">
Content not display on screen but it will take space on screen.
</div>
【讨论】:
除了所有其他答案之外,IE8 还有一个重要区别:如果您使用display:none 并尝试获取元素的宽度或高度,IE8 会返回 0(而其他浏览器将返回实际大小)。 IE8 仅为visibility:hidden 返回正确的宽度或高度。
【讨论】:
visibility:hidden 保留空间; display:none 没有。
【讨论】:
visibility:hidden 将元素保留在页面中并占用该空间但不向用户显示。
display:none 在页面中将不可用且不占用任何空间。
【讨论】:
子节点有很大的不同。例如:如果您有一个父 div 和一个嵌套的子 div。所以如果你这样写:
<div id="parent" style="display:none;">
<div id="child" style="display:block;"></div>
</div>
在这种情况下,所有 div 都将不可见。但是如果你这样写:
<div id="parent" style="visibility:hidden;">
<div id="child" style="visibility:visible;"></div>
</div>
然后子 div 将可见,而父 div 将不显示。
【讨论】:
另一个区别是visibility:hidden 可以在非常非常旧的浏览器中工作,而display:none 不能:
【讨论】:
display: none;
它不会在页面上可用并且不占用任何空间。
visibility: hidden;
它隐藏了一个元素,但它仍然会占用与以前相同的空间。该元素将被隐藏,但仍会影响布局。
visibility: hidden 保留空间,而display: none 不保留空间。
显示无 示例:https://www.w3schools.com/css/tryit.asp?filename=trycss_display_none
可见性隐藏示例:https://www.w3schools.com/cssref/tryit.asp?filename=trycss_visibility
【讨论】:
display:none; 既不会显示元素,也不会在页面上为元素分配空间,而visibility:hidden; 不会在页面上显示元素,但会在页面上分配空间。
在这两种情况下,我们都可以访问 DOM 中的元素。
为了更好地理解它,请查看以下代码:
display:none vs visibility:hidden
【讨论】:
差异不仅仅在于样式,还反映在使用 JavaScript 操作时元素的行为方式。
display: none的作用和副作用:
clientWidth、clientHeight、offsetWidth、offsetHeight、scrollWidth、scrollHeight、@ 987654328@,getComputedStyle(),都返回0s。visibility: hidden 的影响和副作用:
innerText(但不是innerHTML)和后代返回空字符串。【讨论】:
这里有很多详细的答案,但我认为我应该添加这个来解决可访问性问题,因为这会产生影响。
display: none; 和 visibility: hidden; 可能无法被所有屏幕阅读器软件读取。请牢记视障用户的体验。
该问题还询问同义词。 text-indent: -9999px; 是另一个大致相同的。与text-indent 的重要区别在于它通常会被屏幕阅读器阅读。这可能会带来一些糟糕的体验,因为用户仍然可以通过 Tab 跳转到链接。
对于可访问性,我今天看到的是一种样式组合,用于隐藏元素同时对屏幕阅读器可见。
{
clip: rect(1px, 1px, 1px, 1px);
clip-path: inset(50%);
height: 1px;
width: 1px;
margin: -1px;
overflow: hidden;
padding: 0;
position: absolute;
}
一个很好的做法是创建一个“跳到内容”链接到内容主体的锚点。视障用户可能不想在每个页面上都听完整的导航树。使链接在视觉上隐藏。用户只需点击标签即可访问链接。
有关可访问性和隐藏内容的更多信息,请参阅:
【讨论】:
显示:无
它将元素从页面的正常流程中移除,允许其他元素填充。
一个元素根本不会出现在页面上,但我们仍然可以通过 DOM 与它进行交互。 其他元素之间不会为其分配空间。
可见性:隐藏
它将使元素留在页面的正常流程中,从而仍然占用空间。
一个元素是不可见的,并且在页面上为它分配了元素的空间。
其他一些隐藏元素的方法
使用z-index
#element {
z-index: -11111;
}
将元素移出页面
#element {
position: absolute;
top: -9999em;
left: -9999em;
}
关于可见性的有趣信息:隐藏和显示:无属性
visibility: hidden 和 display: none 的性能相同,因为它们都重新触发布局、绘制和合成。但是,opacity: 0 的功能等同于visibility: hidden,并且不会重新触发布局步骤。
CSS-transition 属性也是我们需要注意的重要事项。因为从visibility: hidden 切换到visibility: visible 允许使用CSS 转换,而从display: none 切换到display: block 则不允许。 visibility: hidden 具有不捕获 JavaScript 事件的额外好处,而 opacity: 0 捕获事件
【讨论】:
总结所有其他答案:
| visibility | display |
|---|---|
| element with visibility: hidden, is hidden for all practical purposes (mouse pointers, keyboard focus, screenreaders), but still occupies space in the rendered markup | element with display:none, is hidden for all practical purposes (mouse pointers, keyboard focus, screenreaders), and DOES NOT occupy space in the rendered markup |
| css transitions can be applied for visibility changes | css transitions can not be applied on display changes |
| you can make a parent visibility:hidden but a child with visibility: visible would still be shown | when parent is display:none, children can't override and make themselves visible |
| part of the DOM tree (so you can still target it with DOM queries) | part of the DOM tree (so you can still target it with DOM queries) |
| part of the render tree | NOT part of the render tree |
| any reflow / layout in the parent element or child elements, would possibly trigger a reflow in these elements as well, as they are part of the render tree. | any reflow / layout in the parent element, would not impact these elements, as these are not part of the render tree |
| toggling between visibility: hidden and visible, would possibly not trigger a reflow / layout. (According to this comment it does: What is the difference between visibility:hidden and display:none? and possibly according to this as well https://developers.google.com/speed/docs/insights/browser-reflow) | toggling between display:none to display: (something else), would lead to a layout /reflow as this element would now become part of the render tree |
| you can measure the element through DOM methods | you can not measure the element or its descendants using DOM methods |
| If you have a huge number of elements using visibility: none on the page, the browser might hang while rendering, as all these elements require layout, even though they are not shown | If you have a huge number of elements using display:none, they wouldn't impact the rendering as they are not part of the render tree |
【讨论】:
正如本堆栈其他地方所述,这两者不是同义词。 visibility:hidden 将在页面上留下空间,而 display:none 将完全隐藏元素。我认为谈论这如何影响给定元素的子元素是很重要的。如果您要使用visibility:hidden,那么您可以使用正确的样式显示该元素的子元素。但是使用display:none,无论您是否使用display: block | flex | inline | grid | inline-block,您都会隐藏孩子。
【讨论】: