Sass 避免SCSS规则重复
我有一个文件,其中定义了边界阴影、渐变等的CSS3规则。Sass 避免SCSS规则重复,sass,rule,repeat,Sass,Rule,Repeat,我有一个文件,其中定义了边界阴影、渐变等的CSS3规则。 为了便于比较,我需要添加行为:url('/assets/css3pie.htc')用于IE中的支持。 行为规则是为我的大多数CSS3添加的,如边界阴影、渐变和边界半径 不幸的是,我注意到,在输出中,当我使用两个或多个CSS3规则时,我也会得到一个以上的行为:url('/assets/css3pie.htc')给定对象的规则 一个示例输出是: 哪一个是最好的解决方案?有没有办法检查继承树以及是否已经定义了规则?传递另一个参数并使用@fo
为了便于比较,我需要添加
行为:url('/assets/css3pie.htc')代码>用于IE中的支持。
行为规则是为我的大多数CSS3添加的,如边界阴影、渐变和边界半径
不幸的是,我注意到,在输出中,当我使用两个或多个CSS3规则时,我也会得到一个以上的行为:url('/assets/css3pie.htc')代码>给定对象的规则
一个示例输出是:
哪一个是最好的解决方案?有没有办法检查继承树以及是否已经定义了规则?传递另一个参数并使用@for
指令指定mixin是否应该输出额外的代码:
@mixin box-shadow($props, $css3pie: true) {
-webkit-box-shadow: #{$props};
-moz-box-shadow: #{$props};
box-shadow: #{$props};
@if $css3pie {
behavior: url('/assets/css3pie.htc');
}
}
@include box-shadow(2px 2px 2px black) // Include behavior
@include box-shadow(2px 2px 2px black, false) // Don't include behavior
我建议使用名为
编写这些类型的mixin
这个库已经有了一个全面的CSS3mixin列表,如果您需要的话,它还支持css3pie。看起来它是一个SCSS错误
在类似的情况下,大多数属性都会被覆盖,但有些属性可以多次定义,如background
这就是为什么它不是SCSS覆盖规则的默认行为。行为
属性的定义不像属性那样应该被覆盖的原因是一个bug
解决此问题最漂亮的方法是删除行为
定义属性并定义一个css3pie
mixin,如下所示:
然后,要使用它,请向每个启用CSS3的元素添加以下行:
在处理一个类似的案例时,我提出了这个解决方案
由于:
IE解释相对于源的行为属性的URL
HTML文档,而不是像其他文档一样相对于CSS文件
CSS属性
(),url保存在一个变量中,可以根据项目轻松更改:
$pie-path: "/myproject/PIE.htc";
无需前缀,除非2.1 Android及以下版本和3.2 iOS及以下版本,或IE8及以下版本的CSS3PIE,因此不再需要此混音-
无需前缀,除非3安卓及以下版本和4.3 iOS及以下版本或IE8及以下版本的CSS3PIE——
关于“!optional
”的注意事项:此标志用于避免SASS在@extend不起作用时抛出错误(例如:占位符位于IE的.scss文件中,而不在常规文件中,但mixin由两者调用)–
占位符选择器:位于文件开头,允许以下规则覆盖任何位置/固定属性。
关于“position:relative
”的说明:这里声明它是为了解决z索引问题(背景/边框/阴影消失)–。
根据css和项目,此规则可能会破坏布局
%pie {
behavior: url($pie-path);
position: relative;
}
用法
输出
.item1,
.item2,
.item3 {
behavior: url("/myproject/PIE.htc");
position: relative;
}
.item1 {
border-radius: 10px;
}
.item2 {
border-radius: 5px;
-webkit-box-shadow: 10px 10px 10px rgba(0, 0, 0, 0.3);
box-shadow: 10px 10px 10px rgba(0, 0, 0, 0.3);
}
.item3 {
-webkit-box-shadow: 10px 10px 10px rgba(255, 153, 0, 0.8);
box-shadow: 10px 10px 10px rgba(255, 153, 0, 0.8);
}
行为规则不重复,css更干净,属性只声明一次,从而促进了IE和非IE之间的风格分离。我通过向web浏览器提供正确的内容类型来实现它。
换句话说,我在apache.htaccess
文件中添加了以下行:
AddType text/x-component .htc
这可能是SCS中的一个bug;没有正当理由在生成的输出中包含重复的属性,因此这应该在SCSS本身中解决,您不应该被要求解决这个问题。我建议你为SCSS发布一个bug报告。事实上,@lanzz,这不是bug,关于它有一个讨论@electric\g你提到的问题似乎与重复属性有关;我说的是重复的完整规则,即相同的属性具有相同的值。@lanzz所以除了手动操作(如下面的答案)或等待修复外,没有其他解决方案?我在这里创建了一个问题:我不会称之为bug,因为这是需要的行为。不过我会投票,因为更多的分离会产生更好的代码,而且它很好地解决了您的问题。这是期望的行为,因为如果不这样做,您永远无法覆盖任何属性。
$pie-path: "/myproject/PIE.htc";
@mixin border-radius ($val) {
@each $prefix in '' {
#{$prefix}border-radius: $val;
}
@extend %pie !optional;
}
@mixin box-shadow ($val...) {
@each $prefix in -webkit-, '' {
#{$prefix}box-shadow: $val;
}
@extend %pie !optional;
}
%pie {
behavior: url($pie-path);
position: relative;
}
.item1 {
@include border-radius(10px);
}
.item2 {
@include border-radius(5px);
@include box-shadow(10px 10px 10px rgba(#000, .3));
}
.item3 {
@include box-shadow(10px 10px 10px rgba(#F90, .8));
}
.item1,
.item2,
.item3 {
behavior: url("/myproject/PIE.htc");
position: relative;
}
.item1 {
border-radius: 10px;
}
.item2 {
border-radius: 5px;
-webkit-box-shadow: 10px 10px 10px rgba(0, 0, 0, 0.3);
box-shadow: 10px 10px 10px rgba(0, 0, 0, 0.3);
}
.item3 {
-webkit-box-shadow: 10px 10px 10px rgba(255, 153, 0, 0.8);
box-shadow: 10px 10px 10px rgba(255, 153, 0, 0.8);
}
AddType text/x-component .htc