Несколько свойств рассматриваются как отдельные аргументы в mixins
Я пытаюсь написать mixin, но я не могу заставить аргументы работать так, как я хочу: несколько свойств обрабатываются как отдельный аргумент.
Текущий код
.transition(@property: all, @time: 1s, @timing: ease-in-out) {
-moz-transition: @property @time @timing;
-webkit-transition: @property @time @timing;
-o-transition: @property @time @timing;
transition: @property @time @timing;
}
a {
.transition(color, opacity, .5s);
}
Желаемый выход
a {
-moz-transition: color, opacity .5s ease-in-out;
-webkit-transition: color, opacity .5s ease-in-out;
-o-transition: color, opacity .5s ease-in-out;
transition: color, opacity .5s ease-in-out;
}
Фактический выход
a {
-moz-transition: color opacity .5s;
-webkit-transition: color opacity .5s;
-o-transition: color opacity .5s;
transition: color opacity .5s;
}
Любые идеи?
Ответы
Ответ 1
Я бы предложил использовать функцию LESS escape, т.е.:
a:link, a:visited {
color: green;
opacity: .5;
font-size: 1em;
}
a:hover {
color: red;
opacity: 1;
font-size: 2em;
.transition(e("font-size, color"));
}
И хотя кажется, что LESS принимает это, он будет только анимировать последнее свойство в цепочке, разделенной запятыми, которую вы отправляете. Жаль.
Ответ 2
Используя найденное решение здесь работает с одним И несколькими аргументами:
.transition (@value1,@value2:X,...)
{
@value: ~`"@{arguments}".replace(/[\[\]]|\,\sX/g, '')`;
-webkit-transition: @value;
-moz-transition: @value;
-ms-transition: @value;
-o-transition: @value;
transition: @value;
}
Используя его следующим образом:
.transition(color, opacity .5s ease-in-out);
дает:
-webkit-transition: color, opacity .5s ease-in-out;
-moz-transition: color, opacity .5s ease-in-out;
-ms-transition: color, opacity .5s ease-in-out;
-o-transition: color, opacity .5s ease-in-outt;
transition: color, opacity .5s ease-in-out;
Ответ 3
Если вы хотите передать список, разделенный запятыми, в качестве аргумента для mixin, вы можете просто использовать точку с запятой для разделения аргументов.
Код ниже работает по желанию с помощью выбранного вами микширования:
a {
.transition(color, opacity; .5s);
}
Ответ 4
Меньше миксинов имеют возможность использовать разделенные запятой аргументы (а также разделенные запятыми). Они рекомендуют всегда использовать точки с запятой.
Если точка с запятой присутствует в списке аргументов при вызове mixin, все точки с запятой будут считаться аргументами, даже если эти вещи имеют в них запятые. Это позволяет передавать список, разделенный запятыми, как ОДИН аргумент. Если точка с запятой НЕ присутствует, она будет рассматривать запятые как разделители аргументов.
.transition(@property: all; @time: 1s; @timing: ease-in-out) { // NOTE THE SEMICOLONS
transition: @property @time @timing;
}
a {
.transition(color,opacity; .5s); // SEMICOLON AFTER 'opacity'
}
b {
.transition(color,opacity, .5s); // COMMA INSTEAD
}
выход:
a {
transition: color,opacity .5s ease-in-out;
}
b {
transition: color opacity .5s; // invalid syntax
}
Обратите внимание, что syntax свойства shorthand transition
должно быть разделенным запятыми списком одиночных переходов. Таким образом, b
имеет недопустимое значение, а a
имеет два перехода, в которых неуказанные значения по умолчанию имеют начальное значение:
-
color 0s ease 0s
-
opacity .5s ease-in-out 0s
Скорее всего, это не то, что вы намеревались. (Похоже, вы хотели color .5s ease-in-out 0s
и opacity .5s ease-in-out 0s
.)
Теперь вам может быть интересно: "Как передать список, разделенный запятыми, как один аргумент, когда нет других аргументов?" Просто добавьте фиктивную точку с запятой в конец списка.
.transition(@property: all; @time: 1s; @timing: ease-in-out) {
transition: @property @time @timing;
}
b {
.transition(color,opacity;); // DUMMY SEMICOLON AFTER ARGUMENT
}
i {
.transition(color,opacity); // MISSING SEMICOLON
}
выход:
b {
transition: color,opacity 1s ease-in-out; // 'color,opacity' is the first argument
}
i {
transition: color opacity ease-in-out; // 'color' is 1st arg, 'opacity' is 2nd arg
}
И снова синтаксис для i
недействителен, а b
имеет два перехода:
-
color 0s ease 0s
-
opacity 1s ease-in-out 0s