易于维护CSS还是轻量级HTML?

时间:2012-05-02 10:03:18

标签: html css performance class

我负责监督网站的整个IT方面(包括基础设施和开发),而且我与领先的前端开发人员有不同的意见。他的方法是创建单独的类,每个类带来一个功能,并根据需要组合多个类来设置元素的样式:

HTML
<div class="float_left padding_10 width_60_percent"></div>
<div class="float_left width_30_percent"></div>
<div class="float_left padding_10 width_10_percent"></div>
CSS
.float_left { float: left; }
.padding_10 { padding: 10px; }
.width_60_percent { width: 60%; }
.width_30_percent { width: 30%; }
.width_30_percent { width: 10%; }

优点:

- 通过HTML理解CSS :只需查看HTML中的类名,即可了解CSS的用途。
- 易于创建:一旦定义了一组类,只需将它们组合在HTML中,您就不必经常编写新的CSS。 - 易于维护:与上述原因相同。
- 可移植性:您可以对您工作的任何网站使用相同的方法(这对他来说是有意义的,因为他是从事不同项目的承包商)。 - 较小的CSS :只要您的布局达到一定的临界尺寸,即相同的类一次又一次地重复使用(适当的布局就是这种情况,但显然没有反映出来)以上是因为例子的简洁。)

缺点:

- 更大的HTML
- HTML难以阅读如果您对CSS部分(我的后端开发人员创建视图不感兴趣)不感兴趣。

- 更难集成基于类选择器的Javascript (我们正在使用jQuery)。

我的方法不是由编写/维护CSS本身的容易程度决定的,而是由于担心我们的HTML代码的很大一部分将仅用于集成我们的CSS,这将影响性能:我相信最好有一个更大的CSS,它可以提供服务和缓存一次,而更小的HTML可以节省每个页面视图的带宽,而不是相反。因此,我会选择以下方法:

HTML
<div id="column_left"></div>
<div id="column_middle"></div>
<div id="column_right"></div>
CSS
#column_left { float: left; padding: 10px; width: 60%; }
#column_middle { float: left; width: 30%; }
#column_right { float: left; padding: 10px; width: 10%; }

优点/缺点
与上面相反。

我觉得拥有轻量级HTML代码对于实现网站增长至关重要:
页面加载会更快,这将有助于SEO和用户体验 - 可以使用相同的带宽提供更多页面,从而节省基础架构成本。

为了获得事实上的答案,我们扫描了“大”网站,以查看HTML的哪一部分已分配给使用ID和类。这是代码:

<?php
require_once 'simple_html_dom.php';
$pages = array('http://www.amazon.com', 'http://www.ebay.com', 'mywebsite.html', 'http://stackoverflow.com','facebook.html');
foreach ($pages as $page) {
    echo "\n$page\n";
    $html = new simple_html_dom();
    $string = file_get_contents($page);
    $total = mb_strlen($string);
    echo "HTML = " . $total . " characters\n";
    $html->load($string);
    foreach (array('id', 'class') as $attribute) {
        $count = 0;
        $elements = $html->find("*[$attribute]");
        foreach ($elements as $element) {
            // length of id or classes, + id="..." or class="..."
            $count = $count + mb_strlen($element->$attribute) + mb_strlen($attribute) + 3;
            //echo $element->$attribute . "\n";
        }
        echo "  -from $attribute attributes = $count -> " . round($count / $total * 100) . "%\n";
    }
}

以下是结果:

http://www.amazon.com
HTML = 101680 characters
  -from id attributes = 943 -> 1%
  -from class attributes = 6933 -> 7%

http://www.ebay.com
HTML = 71022 characters
  -from id attributes = 1631 -> 2%
  -from class attributes = 4689 -> 7%

ourwebsite.html
HTML = 35929 characters
  -from id attributes = 754 -> 2%
  -from class attributes = 2607 -> 7%

http://www.imdb.com/
HTML = 74178 characters
  -from id attributes = 1078 -> 1%
  -from class attributes = 5653 -> 8%

http://stackoverflow.com
HTML = 204169 characters
  -from id attributes = 3376 -> 2%
  -from class attributes = 39015 -> 19%

facebook.html
HTML = 419001 characters
  -from id attributes = 6871 -> 2%
  -from class attributes = 85016 -> 20%

到目前为止,我们一直在使用“my”方法,我很高兴看到我们将与id and class`属性相关的代码百分比保持在与其他大型网站相同的比例(周围)分别为2%和7%)。尽管如此,为了验证这一选择,我想问下列问题,希望有经验的开发人员/网站管理员能够回答:

Q1:您是否看到其他优点/缺点支持/反对两种方法中的任何一种?

Q2:根据您的经验,担心使用轻量级HTML代码是否至关重要,或者使用压缩和其他标准可以忽略这一点(例如,您将花费更多资金与前端开发人员进行斗争)?

通过查看结果,您会发现与idclass属性相关的代码数量似乎存在模式(虽然我知道扫描更多网站会提供更多准确的图片):
- 所有网站的HTML代码约有1%到2%与id属性相关 其中-4个网站的HTML代码约有7%与classes相关 - 其他人有大约20%的HTML代码与classes相关。

问题3:这些模式是否有技术解释(例如Facebook和Stackoverflow使用相同的框架生成CSS)?

3 个答案:

答案 0 :(得分:3)

您的前端开发人员正在做什么称为面向对象的css(OOCSS),有人认为这可能有利于您网站的速度。

我不想在这里重新讨论OOCSS的论点,所以请阅读这个FAQ:

https://github.com/stubbornella/oocss/wiki/faq

编辑:在编码标准方面,我宁愿在facebook / stack方面犯错,而不是amazon / ebay。请注意,更先进的网站(fb / stack)似乎有更高的类百分比?

答案 1 :(得分:3)

我是企业网络软件项目的前端开发人员,大约有50人编写代码,其中大多数是后端代码。最初我同意尽可能少的类来使代码更轻,在css中使用大量的继承。所以我们一直在使用“尽可能少的课程”方法。

A1 :使用少数类方法,许多css定义将使用元素名称来添加样式,类似.left-column section li a 这样可以让开发人员的生活更轻松,但实际上是css较慢,因为css是从右到左分析的。在我的示例中,浏览器首先检查所有链接,然后检查所有列表元素,依此类推。如果我只有a.lc-link,那么css的使用速度会更快,需要的元素更少。

我们遇到的另一个问题是缺乏模块化。我可以设计一个很好的元素,我们称它为.flight-dates,它的效果很好。然后出现了一个新的用例,有人想在表单中间使用,而不是主页面模块。但是表单构建为在表单标记上使用单个类,其他所有内容都使用继承。所有继承都会污染.flight-dates所以我需要返回并为css添加更高的特异性,因此所有.flight-dates样式都有一个额外的定义,以确定它们何时是表单的子项。

这种事情每周发生3到4次。 较少的课程=较少的灵活性+具有极高特异性的丑陋样式表,是我从中获取的。

A2 :随着网页上发生javascript的数量,现在使用的课程数量几乎无关紧要。它对我所知道的DOM操作速度没有任何影响。所以我们已经失去了从少数班级方法中获得的任何优势。

参考你的测试,记住,下载css和解析css不是一回事

此外,上述css修正案实际上使后端和前端开发人员的事情变得更慢。因为我们尝试使用尽可能少的类来使后端变得更容易,所以如果你把它们放在新的上下文中,后端会留下像婴儿一样哭的组件,并且前端必须改变6个月前写的css。我个人浪费了几个星期。

我会说它让工作变得更慢,并且没有值得谈论的性能优势。

A3 :像Sass和Less这样的东西往往导致css中的常见模式。此外,许多好的网格和相关的CSS框架使用公共类名。想想jQuery ui或960网格。

如果你想从我们的错误中吸取教训,请听听你的前端人员。 您的后端人员会更快乐,因为组件将始终按照他们期望的方式运行。 你的前端人员会更快乐,因为他们能够编写健壮,即发即弃的css,每次弹出它们时都不必为新的用例重新进行操作。 你的html会更大一些,但说实话,差异是可以忽略不计的,我不认为它会导致任何重大的瓶颈。 你的CSS会跑得更快。 工作最终将花费更少的时间。

答案 2 :(得分:0)

我最近看到谷歌的一篇文章显然鼓励采用oocss方法,但它几乎肯定会产生更大的html和css,这对大型网站来说真的很重要。

我从未见过使用oocss的开发人员,这会让我建议,如果该网站正在被其他开发人员处理,或者很可能在未来,那么采用更多开发人员的方法可能会更好遵循