在Less中使用未知值作为选择器

时间:2016-12-13 18:02:40

标签: css less

鉴于此标记:

<div class="parent" data-active="typeA">
    <div class="child" data-show="typeA">Show only when parent=typeA</div>
    <div class="child" data-show="typeB">Show only when parent=typeB</div>
    <div class="child" data-show="typeC">Show only when parent=typeC</div>
</div>

我正在尝试编写一个全局适用的LESS规则,该规则仅在其data-show属性与父级data-active属性匹配时才显示该子级。

这样的事情:

.parent {
    .child { display:none; }
    &[data-active="?"] .child[data-show="?"] { display:block; }
}

...其中?不应该是固定值,而是一个条件,无论值是什么,只要它们是相同的。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

由于LESS被编译为CSS并且在CSS中没有通用的方法,我只想出一个解决方案,要求你知道每个可能的类型

.parent {
    .child { display: none; }     
    &[data-active="typeA"] {
        .child[data-show="typeA"] { display: block; }
    }
    &[data-active="typeB"] {
        .child[data-show="typeB"] { display: block; }
    }
    &[data-active="typeC"] {
        .child[data-show="typeC"] { display: block; }
    }
}

根据您的偏好并避免冗余,您还可以定义添加不同类型的功能。

.parent {
    .child { display: none; }
    .addType("typeA");
    .addType("typeB");
    .addType("typeC");    
}

.addType(@type) {
    &[data-active="@{type}"] {
        .child[data-show="@{type}"] { display: block; }
    }
}

如果你想让它更通用,你可以定义一个类型数组,并为每个类型调用.addType,如下所示:

@types: "typeA", "typeB", "typeC";

.parent {
    .child { display: none; }
    .-(@i: length(@types)) when (@i > 0) {
        @type: extract(@types, @i);
        .addType(@type);
        .-((@i - 1));
    } .-;
}

.addType(@type) { /* see above */ }