Есть ли возможность создавать объекты в меньшем (css)?

На данный момент я пытался создавать миксины за меньшие деньги, но мне кажется, что это сложнее, чем я сначала аспектировал. Например, я попытался создать условие if, и мой заголовок выглядит так:

.ifClauses(
   @checkParam,
   @conditions:{
    isnumber(@checkParam),
    ispercentage(@checkParam),
    ispixel(@checkParam)
   },
   @thens:{
    .first(){height:@checkParam * 1px;},
    .second(){height:@checkParam;},
    .third(){height:@checkParam;}
   }
)

Я знаю, что массив был определен как:

@array: first,second,third;

.

Может быть, я мог бы использовать это как объект, так сказать, как я могу записать массив в параметры миксинов, когда параметры были разделены запятыми?


person myolli4    schedule 01.07.2015    source источник
comment
Я не уверен, что понял вас полностью, но вы можете использовать extract(@array, 1) для извлечения только первого значения из строки, разделенной запятыми.   -  person Harry    schedule 01.07.2015
comment
Это зависит от того, как вы собираетесь использовать эти объекты. В общем случае оба миксина/набора правил (в т.ч. detached) можно интерпретировать как своего рода ООП-типы и объекты (в определенной степени). Однако для вашего конкретного случая (эмуляция оператора if?) строгая объектная абстракция - это не то, что действительно подходит лучше всего. Примеры таких if эмуляций см.: 1, 2 и т. д.   -  person seven-phases-max    schedule 01.07.2015
comment
Остальное зависит от того, что все эти 1st, 2nd, 3rd etc должны означать. Другими словами, было бы разумно предоставить более подробную информацию о вашем фактическом варианте использования, иначе шансы попасть в ловушку XY-проблемы слишком высоки. -›   -  person seven-phases-max    schedule 01.07.2015
comment
-› (Поскольку Less не является языком сценариев, это довольно распространенная ошибка, когда кто-то пытается использовать не менее дружественные шаблоны проектирования из языков сценариев (например, JavaScript) и, таким образом, должен имитировать поведение, подобное сценарию, поэтому нагромождать различные кладжи и обходные пути на поверх друг друга для решения проблемы, которую в противном случае (не всегда, но довольно часто) гораздо проще решить с помощью нативных Less (или, в общем случае, любых декларативных) шаблонов проектирования.)   -  person seven-phases-max    schedule 01.07.2015
comment
Конечно, я знаю, что less — это не язык сценариев. Я просто надеялся, что есть возможность создавать миксины с массивом в параметрах или, если это не сработает, есть какая-либо функция, чтобы получить более простое условие, используя меньше. На мой взгляд, после ваших полезных комментариев я понял, что другого, более элегантного решения нет. Спасибо тоже :)   -  person myolli4    schedule 01.07.2015
comment
Ну, это ваше решение :) (лично я не понимаю, зачем вообще нужны все эти отдельные условия и примеси и как и почему они должны быть связаны с массивами... И из-за этого я всегда подозреваю, что это XY-задача).   -  person seven-phases-max    schedule 01.07.2015


Ответы (1)


Теперь я решил это так:

.height(@param: @_tablet_slider_-height){

      @active : false;

      & when(isnumber(@param)){
        height: @param * 1px;
        @active: true;
      }
      & when(isunit(@param)){
        height: @param;
        @active: true;
      }

      & when(ispixel(@param)){
        height: @param;
        @active: true;
      }

      & when(isem(@param)){
        height: @param;
        @active: true;
      }
      & when(ispercentage(@param)){
        height: @param;
        @active: true;
      }

      & when(@active = false){

        &:before{
          content:"Error in parsing less"
        }

      }  
}

Я надеюсь, что некоторые из вас могут использовать это, или у кого-то есть лучшее решение :)

person myolli4    schedule 01.07.2015
comment
На самом деле в коде есть ошибка. Наборы правил (включая & {}) не выставляют свое содержимое во внешнюю область... Таким образом, переменная @active, которую вы установили с помощью & {}, не будет иметь никакого влияния на последнюю (таким образом, она всегда false там)... Вам придется использовать вместо этого миксины... Хотя, учитывая, что есть и другие способы упростить все это: "nofollow noreferrer">пример вам вообще не нужны @active. - person seven-phases-max; 01.07.2015
comment
Более того: для этого конкретного фрагмента мне интересно, нужны ли вам все эти условия вообще ;) Обратите внимание, что 1 * 1px всегда приводит к 1px, а 1anythingelse * 1px также всегда приводит к 1anythingelse ( и если один из операндов умножения не является числом, Less автоматически выдаст ошибку). Другими словами, лучшее решение так же просто, как: height: @whatever * 1px; Нет необходимости в условиях или примесях! (теперь вы можете догадаться, почему я каждый раз жалуюсь на XY-проблему :). - person seven-phases-max; 01.07.2015
comment
(В Less также есть много вариантов использования для сложных условий - хороший пример - но выше определенно не из таких). - person seven-phases-max; 01.07.2015
comment
Спасибо :))) есть ли возможность создавать собственные плагины дешевле?? Я подумал, что лучше спросить тебя :D - person myolli4; 05.08.2015
comment
@seven-phases-max Спасибо ???????? - person myolli4; 06.08.2015