visible:hidden和display:none有什么区别?


1173

CSS规则visibility:hidden以及display:none两者均导致该元素不可见。这些是同义词吗?

Answers:


1475

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

14
对彼此的性能没有评论?我很好奇使用哪种方法来隐藏绝对定位的元素,这些元素经常被显示和隐藏。
托马什Zato -恢复莫妮卡

2
总的来说,我还没有做任何测试,但我想它们差不多。只要屏幕上发生更改,整个屏幕就会重新呈现(至少以前是这样),所以这并不重要。您仍在强制屏幕重新粉刷。但是,这可能非常适合每个浏览器,实际上,可能比集中精力于这些更好的方法来优化代码。
kemiller2002

13
@Kevin是在正确的visibility: hiddendisplay: none会,因为他们被同样高性能两者再触发布局,涂料和复合材料。但是,opacity: 0它在功能上等同于visibility: hidden并且不会重新触发布局步骤,因此,如果您不介意仍在分配空白空间,则建议使用该方法(否则请使用display: none)。
jayrobin 2015年

76
在讨论可见性与显示时,请务必牢记css转换。例如,从可见性切换:隐藏;可见性 允许使用CSS转换,而从显示切换:无;显示:才不是。可见性:隐藏具有不捕获javascript事件的额外好处,而不透明度:0; 捕获事件。
Michael Deal

9
opacity: 0在处理输入或按钮时应谨慎使用,因为它们仍将存在并可能引起奇怪的用户交互。
雅克·穆埃特

233

它们不是同义词。

display:none 从页面的常规流程中删除该元素,从而允许其他元素填充。

visibility:hidden 将元素留在页面的正常流程中,使其仍占据空间。

想象一下,您在游乐园中排队,而排队中的某人变得粗暴到使安全人员将他们从排队中撤出。然后,排队的每个人都会向前移动一个位置,以填补现在空的位置。这就像display:none

与之类似的情况则与此相反,但是在您面前的某人戴上了隐形斗篷。在查看线条时,看起来好像有一个空白空间,但是人们无法真正填充那个空白的空间,因为有人还在。这就像visibility:hidden


3
它们之间还有另一个很大的区别:至少在Chrome中,可见性可以与过渡延迟一起使用,但显示会忽略它。
SapphireSun2015年

1
有趣的解释方式,但很有趣。:)
Elango Paul Victor

107

值得一提的是,尽管没有要求,但还有第三种方法可以使对象完全透明。考虑:

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.

(请务必点击上方的“运行代码段”按钮以查看结果。)

已经指出1和2之间的差异(即2仍然占用空间)。但是,2和3之间是有区别的。在情况3中,鼠标悬停在链接上时,鼠标仍将切换到手形,用户仍然可以单击链接,并且Javascript事件仍将在链接上触发。这通常不是您想要的行为(但有时是吗?)。

另一个区别是,如果选择文本,然后将其复制/粘贴为纯文本,则会得到以下信息:

1st link.
2nd  link.
3rd unseen link.

在第3种情况下,文本确实会被复制。也许这对于某些类型的水印有用,或者如果您想隐藏如果用户不小心复制/粘贴了您的内容就会显示的版权声明?


@greenoldman您能提供一个例子吗?这是一个jsfiddle,其中隐藏元素(我尝试过div和span)是其容器中的唯一元素,并且仍然占用空间:jsfiddle.net/rmb5wdLd/1
Kip

@Kip,很奇怪-我现在不能这样做(而且我也更改了自己的项目)。好的,我最好删除我之前的评论,当我有一个可靠的测试用例时,我将显示它,对不起。
greenoldman

89

display:none 从布局流程中删除元素。

visibility:hidden 隐藏它,但留出空间。


70

在子节点方面有很大的不同。例如:如果您有一个父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将不显示。


好一点,这很容易错过。显示:none / block不会触发转换,因此使用可见性:隐藏可以起作用,但是子元素也需要可更改性:隐藏同时
Drenai

18

它们不是同义词- display: none从页面流中删除元素,而页面的其余部分就好像不在那里一样。

visibility: hidden 从视图中隐藏元素,但不隐藏页面流,从而在页面上为其留出空间。


15

display: none 从页面中完全删除该元素,并且该页面的构建就好像该元素根本不存在。

Visibility: hidden 即使您无法再看到它,也会在文档流中留下空间。

这可能会或可能不会有很大的不同,具体取决于您在做什么。


使用$('#element')。remove()会从页面(DOM)中完全删除该元素。不显示或不使用空间并不意味着将其删除。您仍然可以使用简单的$('#element')。show()更改其状态,因此不会“完全删除”它。
foxont​​herock

11

随着visibility:hidden对象仍占用垂直高度在页面上。随着display:none它被完全删除。如果您在图片下方有文字并且您这样做了display:none,那么该文字将向上移动以填充图片所在的空间。如果您进行可见性:隐藏,则文本将保留在同一位置。


隐藏的保留空间仅是垂直尺寸。水平呢?
克里斯·诺

2
水平尺寸也被保留。
JB Hurteaux

9

display:none将隐藏元素并折叠空间所占用的空间,而visibility:hidden将隐藏元素并保留元素的空间。display:none也不会影响IE和Safari较旧版本中javascript的某些属性。


7

除了所有其他答案之外,IE8还有一个重要区别:如果使用display:none并尝试获取元素的宽度或高度,则IE8返回0(而其他浏览器将返回实际大小)。IE8仅针对返回正确的宽度或高度visibility:hidden


7

visibility:hidden保留空间;display:none没有。


6
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


由于网站上的已知错误,我建议不要链接到w3schools。
Skere,

5

如果可见性属性设置为"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>

查看详情


4

visibility:hidden 会将元素保留在页面中并占用该空间,但不会显示给用户。

display:none 在页面中将不可用,并且不占用任何空间。



2

差异超出了样式,并反映在使用JavaScript操作元素时的行为方式。

的作用和副作用display: none

  • 目标元素从文档流中取出(不影响其他元素的布局);
  • 所有后代均受影响(也不会显示,也无法“捕捉”此继承);
  • 测量无法进行目标元素,也不是它的后代-他们不是在所有的渲染,因此他们的clientWidthclientHeightoffsetWidthoffsetHeightscrollWidthscrollHeightgetBoundingClientRect()getComputedStyle(),所有返回0秒。

的作用和副作用visibility: hidden

  • 目标元素从视图中隐藏,但并未从流程中移出并影响布局,占据其正常空间;
  • innerText(但不是innerHTML)目标元素和后代返回空字符串。

1

display:none;既不会显示元素,也不会在页面上为元素分配空间,而visibility:hidden;不会在页面上显示元素,但会在页面上分配空间。在两种情况下,我们都可以访问DOM中的元素。为了更好地理解它,请查看以下代码: display:none vs visible:hidden


0

这里有很多详细的答案,但是我认为我应该添加它来解决可访问性,因为这会产生影响。

display: none;visibility: hidden;并非所有屏幕阅读器软件读取。请记住,视障用户会遇到什么。

该问题还询问同义词。text-indent: -9999px;彼此大致相等。与的重要区别text-indent在于它通常会被屏幕阅读器读取。由于用户仍然可以跳至链接,因此可能会带来不好的体验。

为了实现可访问性,我今天所使用的是多种样式组合,以在屏幕阅读器可见的同时隐藏元素。

{
  clip: rect(1px, 1px, 1px, 1px);
  clip-path: inset(50%);
  height: 1px;
  width: 1px;
  margin: -1px;
  overflow: hidden;
  padding: 0;
  position: absolute;
}

一个很好的做法是创建一个“跳至内容”链接,以链接到内容主体的锚点。视力障碍的用户可能不想在每个页面上都收听完整的导航树。使链接在视觉上隐藏。用户只需点击选项卡即可访问链接。

有关可访问性和隐藏内容的更多信息,请参见:

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.