Я представляю LESS для большого проекта веб-приложений, чтобы упростить мой CSS. У меня есть несколько правил CSS, которые применяют переходы к различному числу свойств, например:
.movable {
transition-property: top, left;
transition-duration: 0.2s;
transition-timing-function: ease;
}
.fadeAndStretchable {
transition-property: opacity, width, height, margin;
transition-duration: 1.5s;
transition-timing-function: ease-out;
}
(Примечание: для краткости я здесь опускал свойства -webkit
, -moz
и -o
: в действительности каждое из этих правил имеет длину 12 строк, а не 3.)
Обратите внимание, что значения для transition-property
разделяются запятой. Это необычно для CSS: несколько значений обычно разделяются пробелом (как в border: 1px solid #f00
). LESS mixins могут использовать специальное значение @arguments
для создать список всех аргументов mixin, разделенных пробелами - но можно ли определить LESS, который принимает переменное количество параметров и превращает их в список значений, разделенных запятыми, подходящий для transition-property
?
При необходимости я доволен решением, для которого требуются два mixins: один для transition-property
и другой для transition-duration
и transition-timing-function
. Вот что я пробовал до сих пор:
Попытка 1: использование @arguments с неназванными параметрами
.transition-property() {
-webkit-transition-property: @arguments;
-moz-transition-property: @arguments;
-o-transition-property: @arguments;
transition-property: @arguments;
}
.movable {
.transition-property(top, left);
}
Результат: LESS error ( "Не найдено совпадающего определения для '.transition-property (top, left)'" )
Попытка 2: использование @arguments с именованными параметрами
.transition-property(@p1, @p2, @p3, @p4, @p5) {
-webkit-transition-property: @arguments;
-moz-transition-property: @arguments;
-o-transition-property: @arguments;
transition-property: @arguments;
}
.movable {
.transition-property(top, left);
}
Результат: LESS error ( "Не найдено совпадающего определения для '.transition-property (top, left)'" )
Попытка 3: использование именованных параметров с фиктивными значениями по умолчанию
.transition-property(@p1:p1, @p2:p2, @p3:p3, @p4:p4, @p5:p5) {
-webkit-transition-property: @p1, @p2, @p3, @p4, @p5;
-moz-transition-property: @p1, @p2, @p3, @p4, @p5;
-o-transition-property: @p1, @p2, @p3, @p4, @p5;
transition-property: @p1, @p2, @p3, @p4, @p5;
}
.movable {
.transition-property(top, left);
}
Результат: Нет ошибки LESS, но он генерирует правило CSS -webkit-transition-property: top, left, p3, p4, p5
, которое браузер игнорирует из-за непризнанных свойств.
Я пробовал различные другие подходы (например, передал свойство как строку 'top,left'
), но все они приводят к тому же: либо ошибка LESS, либо неверный CSS.
Есть ли способ обойти это? Или мне нужно укусить пулю и определить набор перегруженных миксинов по arity, например.
.transition-property(@p1) {...}
.transition-property(@p1, @p2) {...}
.transition-property(@p1, @p2, @p3) {...}
.transition-property(@p1, @p2, @p3, @p4) {...}
etc.