【问题标题】:CSS performance - to group or not to group?CSS 性能 - 分组还是不分组?
【发布时间】:2018-02-02 02:41:30
【问题描述】:

我想知道在 CSS 中对规则进行分组可能会对解析和渲染性能产生什么影响。

方法一:

.class1 {
  margin: 10px;
  padding: 20px;
  color: #ccc;
}
.class2 {
  margin: 10px;
  padding: 30px;
  color: #ddd;
}
.class3 {
  margin: 20px;
  padding: 30px;
  color: #eee;
}
.class4 {
  margin: 20px;
  padding: 20px;
  color: #fff;
}

vs 方法2:

.class1,
.class2 {
  margin: 10px;
}
.class3,
.class4 {
  margin: 20px;
}
.class1,
.class4 {
  padding: 20px;
}
.class2,
.class3 {
  padding: 30px;
}
.class1 {
  color: #ccc;
}
.class2 {
  color: #ddd;
}
.class3 {
  color: #eee;
}
.class4 {
  color: #fff;
}

当然,我们讨论的是具有相同规则分组的大型 css 文件,因此有时相同的选择器会被分割成很多块。

它对 css 解析和渲染的影响是否足以放弃这种方法以支持更大的文件,但更清洁并将所有规则收集在一个选择器中?

选择器匹配可能很昂贵。在现实生活中,这些选择器中的每一个都不仅仅是一个类,而是 2-3 个嵌套类。因此,对于每个元素,浏览器必须匹配选择器三次才能应用所有规则。首先是边距,然后是填充,然后应用颜色。第二种方法似乎非常昂贵。

【问题讨论】:

  • 另外,分组被带到了一个非常极端的水平。不是按相似元素的逻辑分组,而是按字面意思是所有具有相同规则值的元素。在我看来,它已经过度干燥了。
  • 过度干燥也是一种不好的做法joelabrahamsson.com/the-dry-obsession

标签: css performance parsing rendering css-parsing


【解决方案1】:

我准备了两个带有两个选项的代码笔:

方法 1(每个类一个选择器) - https://codepen.io/kali187/pen/EvpVdb - (刚刚输出:https://codepen.io/kali187/live/EvpVdb

@for $n from 1 through 2000 {
  .div-#{$n} {
      float: left;
      background: rgb( $n, $n, $n );
      height: 10px + 1px * $n / 2;
      width: 20px + 1px * $n / 5;
      margin: 0 1px 1px 0;
      border: 1px solid #f00;
  }
}

方法 2(一个类的多个选择器) - https://codepen.io/kali187/pen/dzjGPa - (只是输出:https://codepen.io/kali187/live/dzjGPa

$max: 1000;

@for $i from 1 through $max {
  %bg-#{$i} {
    background: rgb( $i, $i, $i );
  }
  %width-#{$i} {
    width: 20px + 1px * ceil($i / 5);
  }
  %height-#{$i} {
    height: 20px + 1px * ceil($i / 3);
  }
}

@for $n from 1 through (2*$max) {
  .div-#{$n} {
      float: left;
      @extend %bg-#{ceil($n/2)};
      @extend %width-#{ceil($n/3)};
      @extend %height-#{ceil($n/4)};
      margin: 0 1px 1px 0;
      border: 1px solid #f00;
  }
}

第一种方法的渲染结果: 解析样式和 html ~ 25ms

第二种方法的渲染结果: 解析样式和 html ~ 75ms(3 倍的时间)

如果有人想测试它,请做

【讨论】:

  • 干得好,但我认为不对!在这些测试之后,您只比较了Parse Html,但在第二次测试中整体性能看起来更好!也许解析 html 需要更长的时间,但渲染的时间更少!我认为这是一个重要的问题,也许你或其他人会在 2021 年尝试这些测试。
【解决方案2】:

组。 这使您的 CSS 文件整洁明了。它也可以提高您的渲染性能。一遍又一遍地写同样的东西不是一个好习惯。

【讨论】:

  • 我知道方法 2 的简洁代码的好处,而且看起来更干燥。但我的问题是关于实际浏览器性能和渲染影响。有人测量过这个精确的东西吗?
  • 选择器匹配可能很昂贵。在现实生活中,这些选择器中的每一个都不仅仅是一个类,而是 2-3 个嵌套类。因此,对于每个元素,浏览器必须匹配选择器三次才能应用所有规则。首先是边距,然后是填充,然后应用颜色。好像很贵。
【解决方案3】:

如果项目中很多地方都有相同的属性,添加类。 或组。

【讨论】:

  • 我知道。我想知道性能影响。显然,广泛的分组会影响性能。附言我们不能添加视觉类。我们使用 BEM,而不是 OOCSS
猜你喜欢
  • 1970-01-01
  • 2020-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-31
  • 2021-01-15
  • 2011-11-13
  • 2010-10-16
相关资源
最近更新 更多