Less在实践中的应用

刚刚接触到LESS的时候,看到它的名字,马上就想到了jQuery的那句口号“write less,do more”。看了它的介绍就让人感觉这东西一定很有用,我用less写css后,确有此感。

1. LESS带给我的惊喜

它可以设置全局的变量,例如页面的风格颜色

它可以设置全局的class,例如定义文字超过一行/两行时隐藏

它可以定义函数,并且可以给函数默认的参数

它可以......它可以做的太多,具体请看Less官方网站

2. 项目背景

工作中遇到很多页面的排版布局都是相似的,只是风格的变换。行业网站那边提出了栅格系统,所谓栅格系统就是网页的骨架。栅格系统就像是这样一个书架:它有N层,每一层被分成了不同宽度的窗格,这些格格框框就是栅格,我们要做的就是将每个格子填满书。

整体的大布局规定好后,剩下的就是去编写适应不同窗格的组件,我们将它称为Widget。将这些Widget的边框,背景,文字的颜色设置成与网页整体风格一致,然后塞到相应的框里就形成了整个网页。栅格系统保证了所有行业的大布局的统一性,Widget保证网页内容的丰富性和展示的多样性。项目demo

正如项目demo中所呈现的,网页的每一个区块儿都很明显。这里面包含的Widget就有:SN、市场动态、热销商品、排行榜、优质供应商、offer展示区域、TAB等等。其中还有相同模块儿的不同版本。这个页面是所有Widget的集合。

3. Less在项目中的作用

必须提到的是LESS有效地加快了项目的进度,提高了开发效率。

本项目的特点是,相同Widget的不同版本之间区别不大,这样就特别适合用面向对象的思想去做,less将css中的继承和覆盖的思想体现的淋漓尽致。而且比起普通的css书写方式更像是在写程序,下面会有示例。

本项目还有一个特点就是,当Widget够丰富以后,搭建页面变得特别容易,只需要在配置文件中更改相应的配置项的值即可,下面也会有介绍。

4. Less走马上任

先看一段代码:

.tabs-v1(@width: @tabsWidthOffer){
    color: @contentColor;
    ul{
        border: 1px solid @tabsBorderColor;
        border-width: 0 0 0 1px;
        li{
            width: @width;
            height: 30px;
            font-size: 12px;
            line-height: 30px;
            float: left;
            text-align: center;
            border: 1px solid @tabsBorderColor;
            border-width: 1px 1px 0 0;
            background-color: @tabsBgColor;
            cursor: pointer;
            position: relative;
            &.cur{
                color: @floorHeadMoreColor;
                border-bottom-color: white;
                background-color: white;
                font-weight: bold;
                top: 1px;
                height: 32px;
                margin-top: -2px;
            }
            &.last{
                width: @width+3;
            }
        }
    }
}

这段代码就是项目demo中看到的控制tab样式的代码。我们可以看到这里定义了一个叫做.tabs-v1的函数,没错!我说过了less可以写函数。这个函数有一个变量叫@width,它的默认值是@tabsWidthOffer。我们可以从这段代码中看出它显得很整洁,层次结构非常清晰。相比普通的css来说整洁是一个优点,另一个优点就是它不用像普通的css那样每次都要在子元素的class前面加上父元素的class。例如,你再也不用这样写了:

.tabs-v1{
    ......
}
.tabs-v1 ul{
    ......
}
.tabs-v1 ul li{
    ......
}

是不是很酷?还有更酷的呢!我们看到代码中有许多以@开头的属性值,这就是less中的变量,我这里用到的都是配置文件里定义好的,如果哪天需要更改页面的风格了,只需要更改配置文件即可。.tabs-v1中为什么传入@width这个变量呢?这是因为我在offer区域用到的tab宽度与排行榜中用到的宽度不一样。这样我就可以通过传宽度值来控制不同的tab而不必重写代码了。例如,控制offer中的tab样式的文件我取名叫做offertab.less,内容如下:

.offerTab{
    .tabs-v1(@tabsWidthOffer);
}

可以看到,我只需要调用一下.tabs-v1这个函数传入我想要的宽度就行了,这个宽度我也在配置文件中事先配置好了。

再比如说,排行榜的tab要比offer区域的tab短一些,控制排行榜的tab样式文件我取名为:ranktab.less,内容如下:

.rankTab{
    .tabs-v1(@tabsWidthRank);
    ul{
        li{
            color: #444;
            font-weight: normal;
            &.cur{
                color: #444;
            }
        }
    }
}

从上面的代码可以看出我仍然调用了.tabs-v1函数,但是下面还有一行代码,这就体现了面向对象的思想。因为排行榜的样式跟offer区域的样式有些不同,我就覆盖了部分样式以达到要求。

好了,该说说配置文件了,我的配置文件取名为config_xxx.less:

@titleColor: #333;
@contentColor: #444;
@linkHoverColor: #ff7300;
@numberColor: #cc0000;
@assistColor: #888;


@styleColor: #3d86c8;
@tabsWidthOffer: 193px;
@tabsWidthRank: 97px;
@tabsWidthOfferV2: 130px;
@tabsBorderColor: #e1e1e1;
@tabsBgColor: #f8f8f8;
@backgroundImg: "http://img.china.alibaba.com/cms/upload/2012/736/183/381637_261003913.png";
@snHeadBgColor: #edf7ff;
@snMoreBgColor: #f6f6f6;
@snHeadBottomColor: #d5e3ee;

@floorHeadBgColor: #eff5fb;
@floorHeadBreakLineColor: #c6dae8;
@floorHeadMoreColor: #397ebe;

.Title{
    color: @titleColor;
    font-size: 14px;
    font-weight: bold;
    height: 30px;
    line-height: 30px;
}
.Rank{
    width: 14px;
    height: 14px;
    line-height: 14px;
    font-size: 10px;
    font-weight: bold;
    text-align: center;
    font-family: Tahoma;
    color: #fff;
    background-color: #999;
}
.floorMoreBtn{
    color: @floorHeadMoreColor;
    width: 67px;
    height: 30px;
    float: left;
    padding-left: 26px;
    background: url("@{backgroundImg}") right 8px no-repeat; 
}

.catMoreBtn{
    color: @styleColor;
    float: right;
    margin: 0 9px 0 0;
    height: 22px;
    padding-right: 19px;
    font-weight: bold;
    background: url("@{backgroundImg}") right 8px no-repeat; 
}
.BreakWord(@row:1){
    height: 18px*@row;
    line-height: 18px;
    overflow: hidden;
    word-wrap: break-word;
    word-break: break-all;
}

.AStatus(@color: @contentColor){
    color: @color;
    &:hover{
        color: @linkHoverColor;
    }
}

配置文件中我定义了tab的背景色@tabsBgColor,整个页面用到的背景图地址@backgroundImg,大家一看就明白了,这里就不多说了。

LESS给CSS的书写带来了一次革命性的改变,也带来了另外一种编程享受,I LOVE LESS!


blog comments powered by Disqus