有些CSS样式比其他样式更“昂贵”吗?

9

假设我有这样的设置:

<div class="dialog">
    <div class="toolbar first">Bla</div>
    <div class="toolbar">Yada</div>
</div>

并且这个样式定义:

.toolbar { background-color: red; }

我希望两个“工具栏”之间有一个小的2像素的边框,因此我认为有两种可能:

1)给“对话框”div添加背景颜色,并给第一个“工具栏”添加外边距:

.dialog { background-color: #fff }
.toolbar.first { margin-bottom: 2px; }

2) 给第一个工具栏添加一个2像素的边框:

.toolbar.first { border-bottom: 2px solid #fff }

在渲染/应用方面,成本是否有差异?哪种更可取?

我知道这只是一个非常小的例子,可能没有真正的区别,但想象一下一个页面有数十个这样的对话框。


6
我认为只有当元素数量达到数万个时,我们才能看到真正的性能差异,否则它将停留在毫秒级别。因此,请坚持使用最易于阅读/简单的方法,最好是在第一个工具栏上添加“直接”边框。 - Shadow The Spring Wizard
你可能想考虑将这个作为答案添加,而不是一个评论 ;) - Sergi Papaseit
6个回答

6

多及时的问题!

我几天前读了一篇关于CSS性能的优秀文章。尽管与为整个页面提供服务所花费的精力相比,CSS选择器的性能非常微小,但仍需要牢记。

http://css-tricks.com/efficiently-rendering-css/

编辑

我没有注意到问题是关于CSS规则而不是选择器。现在尝试回答这个问题。

正如我在原始答案中所说,CSS性能是您的系统中可以获得最少性能提升的领域(通常情况下,除非您使用类似滤镜之类的东西),如果要微调您的网站,则应最后解决它。更好的方法是保持可读性并首先解决站点的其他部分。


问题是关于样式而不是选择器。 - BoltClock
1
@BoltClock,在我看来仍然是一个有效的贡献。 - Jakub
糟糕!我的错。我应该删除吗? - JohnP
2
@JohnP - 不要这样做!我认为这是一篇非常有趣且与主题相关的文章。 - Sergi Papaseit
我添加了一个澄清,以便保持主题的连贯性。这应该就可以了。 - JohnP

5

我认为只有当元素数量达到数万个时,我们才会看到性能上的真正差异,否则它将保持在毫秒级别。

因此,我的建议是坚持使用最易读/简单的方法,这可能是将"直接"边框添加到第一个工具栏。 :)


3

我个人认为你的第二个选项是最好的,因为你要添加一个边框,所以使用 border ;) - 不过我会反过来,将边框添加到第二个工具栏上.. 想象一下如果你有超过两个工具栏,你实际上想要的是第二个和后续的工具栏有一个顶部边框,但第一个没有。

.toolbar { border-top: 2px solid #fff }
.toolbar.first { border: 0;}

那么,.first 类的作用就是明确地覆盖其他内容。

2

不知道使用哪个浏览器,以及如何实现CSS,元素如何呈现,这些因平台硬件而异的情况很难找出。今天可能很慢,明天就可能很快(反之亦然!)

唯一可以做出的假设是所有浏览器供应商希望他们的代码尽可能地快...

保持你的CSS可读性,一致性和易于维护比“性能”更重要。


也许很难衡量,但我认为这是性能的第一条和唯一的原则:测量它。 - Paul D. Waite

0

回答你的问题,是的,有些操作比其他操作更昂贵,绝对是这样。

它们通常分为两类:

  1. 触发回流的CSS样式
  2. 不触发回流的CSS样式

一般触发回流的样式示例:

  • 宽度
  • 高度
  • 边距
  • 填充 *仅在影响相邻元素时
  • 浮动 *仅在影响相邻元素时
  • Flex属性
  • 影响边框的内容
  • 基本上任何导致DOM的某个部分(而不是当前元素)重新计算其大小的东西
  • 从列表顶部或中间删除元素

不会触发回流的样式示例:

  • 背景图片
  • 背景颜色
  • 颜色
  • 边框颜色
  • 填充 *只要它仅适用于当前元素并且不会影响相邻元素的大小
  • 从列表底部或不会导致其他元素必须重新计算其位置/大小等的部分中删除元素

0
我建议按照本意编写代码,只有在有理由时才进行优化。如果空间逻辑上属于对话框,则应将其添加到对话框中,然后您可能可以放弃“first”声明。
即使您有数百个这些对话框,您也不会注意到任何差异,无论如何,客户端浏览器将呈现页面,服务器不受影响。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接