当前位置: 首页 > 科技观察

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

时间:2023-03-14 16:13:08 科技观察

前言还记得面试时被问到“请告诉我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属性的原生浏览器*/[隐藏]{显示:无;}捉迷藏:你看不到我!3。父元素是display:none,子元素也是doomed.hidden{display:none;}.visible{display:block;}***START***我是parent!I'mson!

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