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

琐事!使用Display-Contents来实现幽灵节点?

时间:2023-03-22 13:29:12 科技观察

display:contents是一个比较陌生的属性。虽然属于display,基本上是最常用的CSS属性,但是contents的值基本用不到。但它从2016年开始被Firefox支持。本文将仔细研究这个有趣的属性值。基本用法基于W3C[1]的display:contents定义。该元素本身不会生成任何框,但其子元素和伪元素仍会生成框,并且文本会正常运行。为了盒子的生成和布局,元素必须被视为它在元素树中被它的内容替换了(包括它的源文档子元素和它的伪元素,比如::before和::after伪元素,通常在元素的子元素之前/之后生成)。简单翻译一下set具有该属性值的元素本身不会生成任何框,但它保留其后代元素的正常显示。看一个简单的例子。有一个简单的三层结构如下:

简单的CSS如下:.container{width:200px;高度:200px;背景:#bbb;}.wrap{边框:2px纯红色;填充:20px;box-sizing:border-box;}.??inner{border:2pxsolidgreen;填充:20px;box-sizing:border-box;}表现如下:这个很好理解,但是如果我们在中间层的container中加上display:contents,再看效果:
可以看到中间层没有边框:2pxsolidred.wrapdiv的红色边框好像不存在,但是它的子元素渲染正常。重要的是,设置了display:contents的元素本身不会被渲染,但是它的子元素可以正常渲染。我一直在思考什么是非常适合这个属性的。综上所述,该属性适用于作为包装器的元素,其本身没有任何作用,在某些布局场景中可以忽略。那就是幽灵DOM节点。最近在写React和Vue的时候,发现这个属性在写JSX时可以起到很好的作用,也很符合这个属性本身的定位。我们在写DOM结构的时候,经常需要输出一个模板,或者一些非语义的鬼节点。return(

Title

...
)我们只想输出.wrapdiv里面的内容,但是由于框架要求输出的JSX模板必须包含在一个父元素下,所以不得已需要加一个.wrap来包装,但是这个.wrap本身并没有任何样式。如果输出元素要放在其他display:flex,display:gridcontainers下,加上一层无意义的.wrap后,整个布局需要重新调整,麻烦。一种方法是使用框架提供的容器,它不会向页面插入任何额外的节点。Vue中类似的是