display: contents 增强页面语义

根据 W3C 对 display: contents 的定义。

The element itself does not generate any boxes, but its children and pseudo-elements still generate boxes and text runs as normal. For the purposes of box generation and layout, the element must be treated as if it had been replaced in the element tree by its contents (including both its source-document children and its pseudo-elements, such as ::before and ::after pseudo-elements, which are generated before/after the element’s children as normal).

简单翻译一下即是,将设置了该属性值的元素本身将不会产生任何盒子,但是它的从保留其子代元素的正常展示。

看个简单的例子。有如下简单三层结构:

简单的 CSS 如下:

.container {
width: 200px;
height: 200px;
background: #bbb;
}

.wrap {
border: 2px solid red;
padding: 20px;
box-sizing: border-box;
}

.inner {
border: 2px solid green;
padding: 20px;
box-sizing: border-box;
}
表现如下:

image

这个非常好理解,但是如果,我们给中间层的容器添加上 display: contents,再看看效果:

image

可以看到,没有了中间层的 border: 2px solid red 的红色边框,整个 .wrap div 好像不存在一样,但是它的子元素却是正常的渲染了。

重点,设置了display: contents的元素本身不会被渲染,但是其子元素能够正常被渲染。

这个属性我一直在思考有什么非常适合的使用点。

总结来说,这个属性适用于那些充当遮罩(wrapper)的元素,这些元素本身没有什么作用,可以被忽略的一些布局场景。

充当无语义的包裹框
最近写 React、Vue 的时候,发现这个属性在写 JSX 的时候能有很好的作用,并且也非常符合这个属性本身的定位。

我们在写 React、RN 时,经常需要输出一段模板。

return (


Title




)
我们只是想输出 .wrap div 内的内容,但是由于框架要求,输出的 JSX 模板必须包含在一个父元素之下,所以不得已,需要添加一个 .wrap 进行包裹,但是这个 .wrap 本身是没有任何样式的。

如果输出的元素是要放在其他 display: flex、display: grid 容器之下,加了一层无意义的 .wrap 之后,整个布局又需要重新进行调整,麻烦。

很多时候,这个多出来的父元素其实是没必要的。这个时候,我们可以添加上 display: contents,像是这样:

return (


Title




)
这样,它既起到了包裹的作用,但是在实际渲染中,这个 div 其实没有生成任何盒子,一举两得。并且像一些 flex 布局、grid 布局,也不会受到影响。

Codepen Demo – display: contents | display: flex 的穿透影响

有点类似于 Vue 中的 元素,但是 是不会被渲染在 DOM 树中,查看页面结构也无法看到,但是 display: contents 是存在于页面结构中的,只是没有生成任何盒子。

让代码更加符合语义化
考虑这个非常实际的场景,现在我们的页面上充斥了大量的可点击按钮,或者点击触发相应功能的文字等元素。但是,从语义上而言,它们应该是一个一个的 ,但是实际上,更多时候我们都是使用了

、 等标签进行了模拟,给他们加上了相应的点击事情而已。

像是下面这样,虽然没什么问题,但是相对而言不那么符合语义化:

Button

Click Me

.button {
width: 120px;
line-height: 64px;
text-align: center;
background-color: #ddd;
border: 2px solid #666;
}

我们不使用 的原因有很多, 相对 div 而言没那么好控制,且会引入很多默认样式。但是,有了 display: contents,我们可以让我们的代码既符合语义化,同时不需要去解决 带来的一些样式问题:

Button

Click Me

添加了 Click Me 的包裹,不会对样式带来什么影响,button 也不会实际渲染在页面结构中,但是页面的结构语义上好了不少。

CodePen Demo – Button with display: contents
深圳网站建设www.sz886.com

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值