供参考: SCSS .extend()
关于这个问题的类似帖子: Using extend for clearfix
假设我要创建一些可以在整个项目中扩展和重用的类:
例如,一个类可以是:
//common boilerplate for most of my parent divs
.scaffold
{
position: relative;
-moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box;
height: 100%;
width: 100%;
margin: 0;
padding: 0;
}
//or a typical clearfix
.group:after {
content: "";
display: table;
clear: both;
}
假设我在属性中有十几个具有各种目的和/或差异的类。在什么时候扩展课程会对性能造成伤害?例如 - 如果这个班级有50个不同类别的逗号
SCSS类之一的书面示例
.site-header
{
@extend .group;
@extend .scaffold;
background: papayawhip;
border-bottom: 1px #ccc solid;
}
示例编译的clearfix可以是CSS
.group:after, .site-header, .route-nav, .main-article, .article-header, .side-bar, .site-footer
//this could go on for a while
{
content: "";
display: table;
clear: both;
}
示例HTML
<!DOCTYPE html>
<html lang="en">
<body>
<header class="site-header">
<nav class="route-nav">
<nav>
</header>
<article class="main-article">
<header class="article-header"></header>
</article>
<aside class="side-bar">
</aside>
<footer class="site-footer">
</footer>
</body>
</html>
我觉得这可能是编写CSS的最干燥方法之一。我觉得在编写一个页面的几个部分后,这种方法可以变得非常有效和成功。此外,大多数这些类可以通过许多项目进行改进和使用。我真的想尝试一下但我担心从长远来看会导致一些性能问题,尤其是当类开始使用伪类时:例如:after:before。
与仅仅添加课程或编写混音相比,是否会有性能影响?有没有人有任何统计数据来备份最佳路线?
答案 0 :(得分:4)
我喜欢制作scss占位符并通过@extend重新使用它们的想法。这被一些人称为“OOSCSS”方法,如果你谷歌那么你可以找到更多相关信息。它有助于编写DRY代码并促进重用和一致性。我认为你的想法一般都在正确的轨道上,但特别是你的脚手架类似乎可能更好:
.scaffold
{
position: relative;
-moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box;
height: 100%;
width: 100%;
margin: 0;
padding: 0;
}
边距,填充可以使用CSS重置方法全局设置为0,因此无需每次都设置它们。可以使用*选择器设置Box-sizing,因为我不确定您是否想要在同一页面上混合使用不同的盒子模型。让每个元素的位置相对可能会导致问题,我不确定我会这样做,除非有充分的理由。对于块级元素,100%宽度是默认值,对于内联元素不会执行任何操作。根据我的经验,100%的高度很少是一个令人满意的解决方案。
所以我真的认为根本不需要那个班级。这只是一个例子,一般来说,如果你在构建HTML和CSS时要小心,那么你可以从@extend中获得大量的重用,而不会在生成的CSS中有很多行逗号。我发现如果@ extend'ed类很小且具体,它们的效果最好,例如:站点颜色方案中的不同颜色的类,然后根据需要将它们包含在各种更具体的类中。它需要一些规则(例如,不要在colors.scss中的任何其他地方定义颜色,并且如果有更好的方法,每次你扩展它时都要考虑),但最后会给出非常一致的DRY代码。
在表现方面,我认为这基本上不是问题,不值得担心。调试是一个更大的问题,因为太多扩展单个类将使用巨大的选择器“垃圾”Chrome / FF CSS开发人员工具,这使得更难以追踪问题。有关统计信息,请查看http://www.stevesouders.com/blog/2009/03/10/performance-impact-of-css-selectors/
最大的惊喜是delta从基线到最复杂,性能最差的测试页面的小小。平均放缓 所有浏览器都是50毫秒,如果我们看一下大的浏览器(IE 6&amp; 7, FF3),平均增量仅为20 ms。今天的70%或更多 用户,改进这些CSS选择器只需要20毫秒 改善。
优化您的选择器最多只能提供50ms的性能提升 - 这是4年前的数据,所以差异可能比现在差。编写专为可维护性,一致性和重用而设计的CSS是一个更高优先级的IMO,因为它对性能的微优化获得的收益几乎不可察觉。
答案 1 :(得分:1)
选择器的解析与性能无关。这是如何跟踪匹配的一切。 *
很明显,你必须更新每个元素。长查询需要大量遍历来确定元素是否与查询匹配。逗号?它们并不重要,重要的是每个选择器的内容
答案 2 :(得分:0)
它不是强制你可以嵌套或分组的课程数量,但我不理解你背后的逻辑。让我用例子来解释。
.a{
color:white;
}
.b{
font-size:10px;
}
.c{
background-color:red;
}
HTML中的
<div class="a b c">TEST</div>
你为什么要这样做?
你实际上可以这样做
.a{
color:white;
font-size:10px;
background-color:red;
}
HTML中的
<div class="a">TEST</div>
您的CSS文件是由浏览器下载的,因此如果非常的CSS样式文件需要更多时间加载,请记住这一点。您可以随意在分组中添加更多类,但是更多无用的类将在那里加载网站的速度越慢。它会降低你的表现。
如果你担心一遍又一遍地混合类,那么你不应该担心,因为我们为什么要在代码中的任何地方使用CSS及其类,并在顶部声明一次。它类似于php中的函数,你可以在任何地方使用函数,但你可以使用不同参数的函数,因此结果会有所不同。
例如在CSS中,
.hidden{
display:none;
overflow:hidden;
}
.text{
font-size:10px;
color:black;
}
#id .text{
font-size:20px;
color:green;
}
现在在HTML中
如果我们将使用
<diiv id="id">
<div class="text">Text</div>
</div>
和
<div class="text">Text</div>
结果不一样.. :)