如何在lesscss中解决问题

时间:2014-05-08 19:41:32

标签: css3 variables themes less

由于我正处于开发应用程序的预生产周期中,因此我经常更改视觉效果,以便汇聚到客户将要验证的内容。

同一页面的一些视觉效果(称之为主题)会很有意思,以便我可以快速地将它们呈现给客户。

我发现的方法是创建一个我放在身上的外观类,通过更改它我可以相应地更改页面本身。

这就是说,我对全局变量较小的变量感兴趣如下:

// default appearance
@navBarHeight: 50px;

.appearanceWhite {
    @navBarHeight: 130px;
}
.appearanceBlack {
    @navBarHeight: 70px;
}

这样,后来在.less中,我提出如下课程:

#navBar {
    height: @navBarHeight;

    // appearance handling
    .appearanceBlack & {
        background-color: black;
    }
    .appearanceWhite & {
        background-color: white;
    }
}

当然,实际情况如果更复杂。

是否可以根据外观CSS类定义(或重新定义)较少的变量?

1 个答案:

答案 0 :(得分:2)

这完全取决于主题之间有多少样式和变量不同,例如(非常)基本的凝视点可能是这样的:

@themes:
    blue   rgb( 41, 128, 185),
    marine rgb( 22, 160, 133),
    green  rgb( 39, 174,  96),
    orange rgb(211,  84,   0),
    red    rgb(192,  57,  43),
    purple rgb(142,  68, 173);

// usage:

#navBar {
    .themed(background-color);
}

// implementation:

@import "for";

.themed(@property) {
    .for(@themes); .-each(@theme) {
        @name:  extract(@theme, 1);
        @color: extract(@theme, 2);

        .theme-@{name} & {
            @{property}: @color;
        }
    }
}

然后使用Pattern MatchingRuleset Arguments等等,你可以自动生成任何复杂的外观/主题层次......

例如几乎相同的简单示例,但具有更多可自定义的方法:

// usage:

#navBar {
    .themed({
        color:            @fore-color;
        background-color: @back-color;
    });
}

// themes:

.theme(@name: green) {
    @fore-color: green;
    @back-color: spin(@fore-color, 180);
    .apply();
}

.theme(@name: blue) {
    @fore-color: blue;
    @back-color: (#fff - @fore-color);
    .apply();
}

.theme(@name: black-and-white) {
    @fore-color: black;
    @back-color: white;
    .apply();
}

// etc.

// implementation:

.themed(@style) { 
    .theme(); .apply() {
        .theme-@{name} & {
            @style();
        }
    }
}