LESS 目前还没有办法创建真正的“函数”,所以我们应对它。
First
你可以只使用单位函数,像这样:
LESS
.someClass { padding: unit(@basevalue, @unit); }
.someOtherClass { padding: unit(@basevalue*0.5, @unit); }
CSS
.someClass {
padding: 1em;
}
.someOtherClass {
padding: 0.5em;
}
Second
The mixin 作为函数在某些情况下是可以的,但正如您发现的,有以下限制仅设置该值一次在第一次调用时(假设该范围内不存在同名变量)。
LESS(第一个工作正常,第二个不行)
.returnUnit(@val:1) {
@return: unit(@basevalue*@val, @unit);
}
.someThirdClass {
.returnUnit(0.4);
padding: @return;
}
.someOoopsClass {
.returnUnit(0.4);
padding: @return;
.returnUnit(0.3);
margin: @return;
}
CSS输出
.someThirdClass {
padding: 0.4em;
}
.someOoopsClass {
padding: 0.4em;
margin: 0.4em; /* Ooops! Not 0.3em! */
}
Third
第二个想法的限制可以通过第二次包装来避免,因为它隔离了返回的每个变量的范围.returnUnit()
,像这样:
LESS
.someAccurateClass {
& {
.returnUnit(0.4);
padding: @return;
}
& {
.returnUnit(0.3);
margin: @return;
}
}
CSS输出
.someAccurateClass {
padding: 0.4em;
margin: 0.3em; /* Yes! */
}
Fourth
通过添加一些全局变量并执行以下操作来合并第一和第三的想法可能会更好:
LESS
@unit:em;
@basevalue:1;
@val: 1;
@setUnit: unit(@basevalue*@val, @unit);
.someAwesomeClass {
& {
@val: .2;
padding: @setUnit;
}
& {
@val: .1;
margin: @setUnit;
}
}
CSS输出
.someAwesomeClass {
padding: 0.2em;
margin: 0.1em;
}
所以这里我们使用的是unit
函数仍然是第一个想法,但已将其分配给变量@setUnit
,因此每次调用该变量时,它都会运行该函数。我们仍然使用隔离我们的财产块& {}
语法类似于第三个解决方案,但现在我们只需设置@val
到我们想要的并称之为@setUnit
我们想要的地方。