Как повторно использовать миксин, чей селектор формируется с помощью конкатенации

В Меньше я могу написать:

.outer {  
    .inner {  
        color: red;  
    }  
}

.test {  
    .outer .inner;
}

Но когда я пишу:

.outer {  
    &-inner {  
        color: red;  
    }  
}

.test {  
    .outer-inner;
}

Когда я удаляю .test, .outer-inner вывод правильно, но когда я добавляю его обратно, компилятор говорит

.outer-inner не определен.

Есть ли в любом случае повторно использовать стили .outer-inner?

1 ответ

Вызов миксина, чей селектор образован конкатенацией, в настоящее время невозможен при использовании Less. Однако то же самое возможно для селекторов, сформированных во время компиляции с использованием интерполяции (также называемых динамически сформированными селекторами).

Ниже (интерполированный / динамически сформированный селектор) будет работать нормально.

@selector: .box;
@{selector}{
    color: red;
    .child{
        color:blue;
    }
}
.demo{
    .box; /* will create both parent & child */
}
.container{
    &.box{
        background: black;
    }
}
.demo2{
    .container.box;
}

тогда как следующий пример не будет работать.

.container{
    &-box{
        color: blue;
    }
}
.demo2{
    .container-box; /* this will not work */
}

В настоящее время одним из обходных путей для рассматриваемого сценария является создание двух отдельных файлов Less.

В первом файле (test.less) добавьте приведенный ниже код и скомпилируйте его в файл CSS.

.outer {  
    &-inner {  
        color: red;  
    }  
}

Во втором файле импортируйте CSS, созданный из первого файла с (less) директива, а затем вызвать / повторно использовать миксин.

@import (less) "test.css";
.test {  
    .outer-inner;
}

Примечание. Как отмечается в комментариях к семи-максимальным, эта проблема аналогична этому пункту. Однако оба эти вопроса не совпадают с extend не будет работать как с интерполированным селектором (динамически сформированным), так и со сцепленным селектором.


Вариант 2. Другой вариант - написать фиктивный миксин или отдельный отдельный набор правил с общими свойствами и использовать его, как показано ниже.

@dummy: {color: red}; // detached ruleset

.outer{
    &-inner{
        @dummy();
    }
}

.test{
    @dummy();
}

или же

.dummy() {color: blue}; // dummy mixin and would produce no extra selector in output as it has parentheses.

.outer{
    &-inner{
        .dummy;
    }
}

.test{
    .dummy;
}
Другие вопросы по тегам