在 :before 和 :after 上为每个元素声明“content”属性是否会带来巨大的性能问题?

2024-04-26

您可能知道,如果您愿意使用:before and/or :after伪元素没有在其中设置文本,您仍然需要声明content: '';使它们可见。

我刚刚将以下内容添加到我的基本样式表中:

*:before, *:after {
    content: '';
}

……所以我不必再进一步声明了。

除了这个事实之外*我知道选择器是反性能的(假设上面是一个例子,我可以找到更好的方法来声明这一点,例如列出标签),这真的会减慢速度吗?我在当前项目中没有注意到任何视觉上的东西,但在我将其绝对粘贴到我将用于每个项目的基本样式表中之前,我想确保它可以安全使用......

有人深入测试过吗?对此你有什么想说的?

(BTW, I do know正确的 CSS3 语法使用双分号 (::before, ::after)因为这些是伪元素而不是伪类。)


所以我根据@SWilk 的建议进行了一些测试。我是这样做的:

1) 设置一个基本的 HTML 页面,其中包含一个空的<style>标签在<head>以及他在中提供的简单示例<script>标签位于底部<body> :

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8" />
    <title>Performance test</title>

    <style>
/**/
    </style>
</head>

<body onload="onLoad()">
    <div class="container"></div>

    <script>
function onLoad() {
    var now = new Date().getTime();
    var page_load_time = now - performance.timing.navigationStart;
    console.log("User-perceived page loading time: " + page_load_time);
}
    </script>
</body>

</html>

2)填写div.container带有 HTML 负载。就我而言,我访问了 html-ipsum.com(无意做广告),复制了每个样本,将其全部缩小,然后重复了很多次。我的最终 HTML 文件是1.70 MB,以及div.container had 33264后代(直系或非直系后代;我通过致电发现console.log(document.querySelectorAll('.container *').length);).

3) 我在最新的 Firefox 和 Chrome 中运行了这个页面 10 次,每次缓存都是空的.

以下是没有可怕的 CSS 规则集的结果(以毫秒为单位):

Firefox :
1785
1503
1435
1551
1526
1429
1754
1526
2009
1486
Average : 1600

Chrome :
1102
1046
1073
1028
1038
1026
1011
1016
1035
985
Average : 1036

(如果你想知道为什么这两者之间有如此大的差异,我在 Firefox 上有更多的扩展。我让它们打开是因为我认为让测试环境更加多样化会很有趣。)

4)在空白处添加我们要测试的CSS<style> tag :

html:before, html:after,
body:before, body:after,
div:before, div:after,
p:before, p:after,
ul:before, ul:after,
li:before, li:after,
h1:before, div:after,
strong:before, strong:after,
em:before, em:after,
code:before, code:after,
h2:before, div:after,
ol:before, ol:after,
blockquote:before, blockquote:after,
h3:before, div:after,
pre:before, pre:after,
form:before, form:after,
label:before, label:after,
input:before, input:after,
table:before, table:after,
thead:before, thead:after,
tbody:before, tbody:after,
tr:before, tr:after,
th:before, th:after,
td:before, td:after,
dl:before, dl:after,
dt:before, dt:after,
dd:before, dd:after,
nav:before, nav:after {
    content: '';
}

...然后重新开始。这里我指定了页面中使用的每个标签,而不是*(因为它本身是反性能的,并且我们只想监视伪元素触发)。

因此,以下是触发所有伪元素的结果(仍然以毫秒为单位):

Firefox :
1608
1885
1882
2035
2046
1987
2049
2376
1959
2160
Average : 1999

Chrome :
1517
1594
1582
1556
1548
1545
1553
1525
1542
1537
Average : 1550

根据这些数字,我们可以得出结论,声明时页面加载确实较慢(大约 400-500 毫秒)content: ''在每个伪元素上.

现在,剩下的问题是:考虑到所使用的相对较大的测试页面,我们在这里可以看到的额外加载时间很重要?我想这取决于网站/项目的规模,但如果他们愿意的话,我会让更多了解网络性能的人在这里发表他们的意见。

如果您运行自己的测试,也请随意在这里发布您的结论,因为我对阅读它们非常感兴趣 - 而且我想我不会是唯一的一个。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 :before 和 :after 上为每个元素声明“content”属性是否会带来巨大的性能问题? 的相关文章

随机推荐

  • 如何在 ionic 2 中使用 lokijs-cordova-fs-adapter

    我正在尝试在我的 ionic 2 应用程序中使用 lokijs 我能够使用 lokijs js 当尝试坚持使用适配器时 我无法做到 我准备好 lokijs cordova fs adapter 就可以使用了 但是当我在我的应用程序中引用它时
  • 如何抑制“common-java”规则的警告

    我需要暂时忽略规则 单元测试分支覆盖率不足 common java InsufficientBranchCoverage Reading http docs sonarqube org display SONAR Frequently As
  • 使用 SwiftMailer 批量发送电子邮件

    我目前正在使用迅捷邮递员 http swiftmailer org向多个用户 最多 50 个 发送电子邮件 我已将其设置并正常工作 但是 我不太确定如何从 MySQL 数据库中提取收件人并迭代发送它们 这是我目前拥有的
  • getopts 未提供参数

    如何检查是否没有提供必需的参数 我发现 switch case 中的 选项应该足以达到此目的 但它永远不会进入该 case 代码块 我是否将 冒号大小写 放在开头或其他位置并不重要 我的代码 while getopts a b OPTION
  • 销毁与解除分配

    在 Accelerated C 第 11 章中 作者提出了一个使用数组模拟 std vector 行为的 Vector 类 他们使用分配器类来处理内存管理 的作用uncreate函数是销毁数组的每个元素并释放为数组分配的空间 templat
  • conda创建环境没有响应

    我想安装 python 2 7 作为 conda 环境 conda create n python2 python 2 7 anaconda Collecting package metadata current repodata json
  • 拥有集合侦听器的好方法?

    有没有比将 Java 集合包装在实现观察者模式的类中更好的方法来在 Java 集合上设置侦听器 你应该检查一下釉面清单 http publicobject com glazedlists 它包含可观察的 List 类 每当添加 删除 替换元
  • @Transactional 注释的替代方案

    spring中回滚事务除了 Transactional注解还有什么替代方案 我已经使用了这个注释 但我想要在 catch 块中回滚事务的方式 有什么办法吗 提前致谢 这是一个草稿 public class SomeService imple
  • Firebase云功能不触发onCreate

    尝试使用 Cloud Functions 处理联系表单提交以发送电子邮件 Hello World 功能正常启动 所以我认为设置很好 该表单填充 消息 集合 但我没有收到以下触发器的日志条目 或错误 const functions requi
  • @types/jest index.d.ts 文件返回错误

    我刚刚将 types jest 安装到了我的 stenciljs 入门应用程序中 现在 当我开始我的项目时 新安装的节点包返回了几个错误 这是我访问时返回的错误npm start我的项目 ERROR TypeScript node modu
  • 自动调整 ggplot 中条形的大小以实现多个图形 R 的均匀性

    我在循环中生成几个条形图 它们都根据输出大小 从绘图 设备大小假设 而不是根据条形大小调整大小 这意味着具有两个条形图的图具有粗条形图 而具有 6 个条形图的图具有细条形图 但两个输出的大小相同 下面的代码代表了我的带有可重现数据的脚本 我
  • 在 C#4 中向 ProgressChanged 事件添加额外参数

    这是我的代码 简单下载器 public void DownloadFile string urlAddress string location using webClient new WebClient webClient Download
  • SQL——排序数据

    因此 我的学校老师要求我从现有数据库中整理一些数据 这很容易手动完成 但如果记录超过 100 条 则时间太长 他是这样问我的 有单独的桌子 其中一个称为 联系人 有 2 列 ID 姓名 第二个称为电子邮件 和第三个 CONT EMAIL 他
  • 将 uint64_t 转换为 std::string

    如何将 uint64 t 值传输到 std string 我需要构造包含该值的 std string 例如这样的事情 void genString uint64 t val std string str some code for str
  • 如何从 FinalBuilder 输出将被 TeamCity 捕获的消息?

    我正在运行 TeamCity Professional 4 5 3 和 FinalBuilder Pro 6 TeamCity 使用命令行任务运行 FinalBuilder 项目 如何让 FinalBuilder 将消息打印到构建日志中 以
  • 如何限制素材输入中的特殊字符

    我有一个材料输入控件 我在用户输入时限制了特殊字符 但是当在任何编辑器中键入一些单词并复制并粘贴带有特殊字符的单词时 这是不起作用的 我已经为此编写了指令以防止特殊字符 但是可以在复制粘贴中提供更好的解决方案限制 应用程序组件 html
  • 强连通分量有什么用?

    我发现了几种可以解释的算法how在有向图中找到强连通分量 但没有解释why你会想要这样做 强连通分量有哪些应用 您应该查看 Coursera 上 Tim Roughgarden 的算法简介课程 对于他所讨论的每一种算法 他都会解释其一些应用
  • 使用 Active Directory 验证 Sharepoint?

    只需要找到一种简单的方法来让 AD 进行身份验证作为 Sharepoint 站点的登录名 这相当快速和简单地开始吗 Thanks 对于 SharePoint 2007 请参阅此article http technet microsoft c
  • 更改 R 中函数的默认参数

    我正在跟进这个答案 https stackoverflow com a 62946040 7223434 我想知道是否有办法设置参数的默认值rug to FALSE和论证multiline to TRUE在生成的图中library effe
  • 在 :before 和 :after 上为每个元素声明“content”属性是否会带来巨大的性能问题?

    您可能知道 如果您愿意使用 before and or after伪元素没有在其中设置文本 您仍然需要声明content 使它们可见 我刚刚将以下内容添加到我的基本样式表中 before after content 所以我不必再进一步声明了