当前位置: 首页 > Web前端 > CSS

CSS魔堂:display-none和visibility-hidden之间的恩怨

时间:2023-03-30 14:18:48 CSS

前言还记得面试时被问到“请告诉我display:none和visibility:hidden的区别”吗?回答后display:none不占原位,visibility:hidden保留原位,面试官会不会会心一笑?其实,远不止这么简单!这篇文章,我们将一起深究两人之间的恩怨情仇,在接下来的采访中,我们可以更好地解答!深挖display:none我们都知道,当一个元素设置为display:none时,该元素将不会显示在界面上,该元素不占用布局空间,但我们仍然可以通过JavaScript对该元素进行操作。但为什么?这就涉及到浏览器的渲染原理:浏览器会解析HTML标签生成DOMTree,解析CSS生成CSSOM,再将DOMTree和CSSOM合成生成RenderTree。RenderTree中的元素对应0个或多个盒子,然后浏览器Layout,用盒子模型的信息渲染界面。设置为display:none的元素并不会在RenderTree中生成对应的boxmodel,那么后续的布局和渲染工作自然就没什么了,至于DOM操作,还是可以的。但是除了以上知识点之外,还有以下8点我们需要注意1.原生默认display:none的元素其实浏览器原生元素中有很多display:none的元素,比如aslink,script,style,dialog,input[type=hidden],etc.2.HTML5中增加了hidden布尔属性,允许开发者自定义元素的隐藏/*兼容不支持hidden属性的原生浏览器*/[hidden]{display:none;捉迷藏:你看不见我!3.父元素是display:none,后代元素也是doomed.hidden{display:none;}.visible{display:block;}***START***我是parent!我是儿子!

***END***浏览器直接显示为***START****END***4.无法获得焦点。没有箱子,哪来的焦点?^_^即使通过tab键,也没办法hidden
5。不能响应任何事件,无论是捕获,命中和冒泡阶段都不允许,因为display:none这个元素根本不会在界面上渲染,也就是连1个像素都不占,所以自然不能被鼠标点击命中,元素不能获得焦点,也就不能成为键盘。事件的命中目标;当父元素的display为none时,子元素的display必然为none,这样元素就没有机会在事件捕获或者冒泡阶段的路径上,所以display:none的元素无法响应事件。6、不延迟form表单提交数据虽然我们看不到display:none元素,但是在提交表单时,隐藏的input元素的值还是会被提交。
7.CSS中的计数器将忽略display:elementofnone.start{counter-reset:son0;}.son{counter-increment:son1;}.son::before{content:counter(son)".";}son1
son2son3结果是:1.son12。son38.Transition对显示变化不感兴趣。具体可以参考CSS魔法殿堂:Transition太好玩了,display:inline表示元素位于IFC中,也就是说display的作用是设置元素所属的布局上下文。如果修改了显示值,则表示该元素采用的布局方式发生了变化。没有触发回流很奇怪!深入了解可见性可见性有两种不同的功能。它用于隐藏表格的行和列。它用于隐藏元素而不触发布局。4个有效值1.visible没什么好说的,显示在界面上。2.hidden使元素在会议上不可见,但保留元素的原始位置。3.collapse用于表格子元素(如tr、tbody、col、colgroup)时,效果与display:none相同,用于其他元素时,效果与visibility:hidden相同。但是由于各个浏览器的实现效果不同,一般不会使用这个值。4.inherit继承父元素的可见性值。display:none和visibility:hidden做个明确的对比上面display:none我们列出了8个注意点,那么我们只需要对照它一一列出visibility,这样就清晰可见了吗?1、父元素visibility:hidden,子元素可以设置visibility:visible生效div{border:solid2pxblue;}.visible{visibility:visible;}.hidden{visibility:hidden;}我是家长。我是儿子。结果:2.同display:none,不能获得焦点3.可以响应冒泡阶段的事件由于设置了visibility:hidden的元素的子元素可以是visibility:visible,所以隐藏元素可能位于事件冒泡的路径上。因此,在下面的代码中,当鼠标移动到.visible时,.hidden会响应hover事件display。div{border:solid2pxblue;}.visible{visibility:visible;}.hidden{visibility:hidden;}.hidden:hover{visibility:visible;}我是家长。class="visible">我是儿子。4.同display:none,不妨碍表单的提交5.css中的counter不会被忽略6.transition对visibility的变化有效7.visibility的变化不会触发回流。设置从可见到隐藏时,不会改变元素布局相关的属性,所以不会触发回流。它只是安静地等待浏览器与其他渲染变化一起定期重绘界面。总结现在我们应该对display:none和visibility:hidden有了更深的理解,在接下来的面试中我们的答案会更加丰富多彩!尊重原创,转载请注意转载自:https://www.cnblogs.com/fsjoh...胖约翰^_^引自https://css-tricks.com/almana...https://juejin.im/post/5b406f...