我喜欢使用具有像素回退的rem单位来进行CSS大小调整,并且尝试使mixin来帮助.对于font-size,这很简单:
@mixin font-size($size) { font-size: $size + px; font-size: ($size / 10) + rem; }
但是对于填充,边距等,mixin需要接受可变参数,这可以根据Sass文档http://sass-lang.com/documentation/file.SASS_REFERENCE.html#variable_arguments进行
然而,使用以下mixin,而不是除以10,mixin只是在数字之间添加斜杠.就是这样:
@mixin padding($padding...) { padding: $padding + px; padding: ($padding / 10) + rem; } .class { @include padding(24); }
输出:
.class { padding: 24px; padding: 24/10rem; }
而不是这样,像我所期望的:
.class { padding: 24px; padding: 2.4rem; }
有没有办法确保Sass将变量识别为数字,从而正确地使用除法运算符?
此外,在进行了更多测试之后,我意识到连接只发生在最后一个变量上.
解决方法
看来,我真正需要使用的是一个列表,而不是一个可变参数,以便分别操作每个值.
我首先尝试使用@each指令,但无法弄清楚如何在声明中使用它.这会引发错误:
@mixin padding($padding) { padding: @each $value in $padding { $value + px }; padding: @each $value in $padding { ($value / 10) + rem }; }
所以我最终写了一些更详细的东西,分别处理四种可能的情况(即通过1,2,3或4个参数).看起来像这样,按照我想要的方式工作:
@mixin padding($padding) { @if length($padding) == 1 { padding: $padding+px; padding: $padding/10+rem; } @if length($padding) == 2 { padding: nth($padding,1)+px nth($padding,2)+px; padding: nth($padding,1)*0.1+rem nth($padding,2)*0.1+rem; } @if length($padding) == 3 { padding: nth($padding,2)+px nth($padding,3)+px; padding: nth($padding,2)*0.1+rem nth($padding,3)*0.1+rem; } @if length($padding) == 4 { padding: nth($padding,3)+px nth($padding,4)+px; padding: nth($padding,3)*0.1+rem nth($padding,4)*0.1+rem; } }
我收集了包括这个作为Gist这里的rem mixins https://gist.github.com/doughamlin/7103259