我厌倦了每次使用它时都为calc
函数编写所有供应商前缀:
width: calc(100px - 50px);
width: -o-calc(100px - 50px);
width: -moz-calc(100px - 50px);
width: -webkit-calc(100px - 50px);
我通常做的是在sass
中创建一个集成供应商前缀的mixin
(该示例适用于box-shadow
(:
@mixin box-shadow($args...) {
-webkit-box-shadow: $args;
-moz-box-shadow: $args;
box-shadow: $args;
}
有没有办法为calc
函数编写类似的?(我没能做到(
这可能不是对您的问题的直接回答,而是建议您不再需要为calc
添加供应商前缀的建议。就IE而言,不存在供应商前缀的问题。
关于其他浏览器,calc
现在得到了很好的支持。如需进一步参考,您可以查看CanIUse
- Firefox 支持版本 4 的
calc
(当前版本为 57( - Chrome 支持版本 19 的
calc
(当前版本为 62( - Opera 支持版本 15 的
calc
(当前版本为 48(
Internet Explorer 版本 9 也支持此功能。所以我认为你不需要使用供应商前缀,因为它在这里完全无关紧要。
溶液
我想出了这个
$props: ("width": "100px - 50px", "height": "100px - 20px");
@mixin calc($props) {
$vendor-prefixes: ("moz", "o", "webkit");
@each $prop, $i in $props {
@each $prefix in $vendor-prefixes {
#{$prop}: -#{$prefix}-calc(#{$i});
}
#{$prop}: calc(#{$i});
}
}
body {
@include calc($props);
}
您可以在SassMeister尝试我的解决方案
在这里,我所做的是使用 SASS 列表功能,它就像一个关联数组。您构建属性数组并将其提供给mixin,它也将生成相同的供应商前缀版本。
请注意,我将非前缀版本放在循环的末尾,因为建议将非前缀版本放在前缀版本之后。
有关 SASS 列表的更多信息
以下内容来自一个更大的项目,用于声明性而不是css
属性或值的自动供应商前缀...
@mixin calc($property, $value, $fallback: false) {
@if $fallback {
#{$property}: #{$fallback};
} @else {
@warn "Consider setting a fallback for #{$property}";
}
@include render-vendor-prefixes(
$property: $property,
$value: calc(#{$value}),
$vendor-list: (
-webkit, // Old - Chrome 19-25, Safari 6
-moz // Old - Firefox 4-15
),
$prefix: value,
);
}
请注意,上述内容取决于可以在存储库的
lib
目录中找到的另外两个scss
文件。
示例用法
@import '_scss/modules/vendor-prefixes/lib/map-vendor-prefixes.scss';
@import '_scss/modules/vendor-prefixes/lib/render-vendor-prefixes.scss';
@import '_scss/modules/vendor-prefixes/calc.scss';
.something {
@include calc(
$property: width,
$value: 100% - 40px,
$fallback: 85%
);
}
请注意,上述
@include
可以压缩为一行,并且为了便于阅读而展开。
示例输出...
.something {
width: 85%;
width: -webkit-calc(100% - 40px);
width: -moz-calc(100% - 40px);
width: calc(100% - 40px);
}
虽然浏览器支持在css
calc()
中变得更好,但仍有一些不支持它,因此上面显示了如何在@mixin
中设置回退property
value