让css动起来—-lesscss(2)
话说上次谈及lesscss的时候是去年11月份,传送门在 这里,上次介绍了lesscss的大部分应用和属性,随着2011年下半年 lesscss中文官网的出现,我觉得再多的介绍lesscss的使用已经没什么必要了,这部分的文章苏河主要给大家介绍下lesscss在项目中的应用。
下面是去年的一个项目部分使用lesscss的例子,lesscss我只做了部分尝试,就lesscss本身来说,它比较适合重用性比较高的代码(个人理解),如果是换肤的功能,我想lesscss再合适不过了。当然也有很多工程师喜欢lesscss的这种代码风格,如果它能够少了编译的这层环节,那么我认为不管是它的可维护性和可扩展性,易读性都会是大家选择它的原因。
上面是我的项目目录,之所以选择base作为试点是一来是因为base包含皮肤样式,字体样式,它是个重用性很高的地方,而其他模块则可以采取import的方式来引用base库,二来是因为base库不管是对现在的项目或者是以后的类似的拓展项目都有很高的重用性和扩展性。
首先是libs.less,大致介绍下的代码组成部分
常量
通常常量是定义的网页的基本全局的变量,比如字体颜色、背景颜色、超链接颜色等等,为了保证各个模块的一致性,我们定义常量来统一管理一张网页的基本设定,试想,如果有其他市场需要使用我们的样式,它们希望的只是皮肤的更改,那么我们只需要修改libs里面的常量就能达到牵一发动全身的效果了。
- //constants
- /*font*/
- @red-font:#cc0000;
- @blue-font:#1ac5e1;
- @normal-font:#333;
- @gray-font:#666;
- @light-font:#b0b0b0;
- @white:#fff;
- /*background-color*/
- @blue-back:#1AC5E1;
- @red-back:#E40007;
- @body-back:#fdf4e9;
- /*width*/
- @page-width:990px;
混合
在 LESS 中我们可以定义一些通用的属性集为一个class,然后在另一个class中去调用这些属性,这里我们用yui3的布局方式尝试
- /* YUI3 inline-block*/
- .inline-block(){
- display:inline-block;
- vertical-align:top;
- *display:inline;
- *zoom:1;
- }
- .grid-container(){
- letter-spacing:-0.31em;
- *letter-spacing:normal;
- word-spacing:-0.43em;
- }
- .grid-unit(){
- letter-spacing:noraml;
- word-spacing:noraml;
- .inline-block();
- }
函数
我们定义一些公用的函数,然后在其他需要调用的地方使用这些函数,这里定义的函数比较多,具体说明可以直接看代码
- /*reset css*/
- .reset(){
- margin:0;
- padding:0;
- }
- /*wrap*/
- //文字函数
- .wrap () {
- text-wrap: wrap;
- white-space: pre-wrap;
- white-space: -moz-pre-wrap;
- word-wrap: break-word;
- }
- /*float*/
- //浮动函数
- .left(){
- float:left;
- *display:inline;
- }
- .right(){
- float:right;
- *display:inline;
- }
- .clear(){
- *zoom : 1;
- &:after{
- content: '\0020';
- display: block;
- height: 0;
- clear: both;
- }
- }
- /*img vertical*/
- //图片居中函数,接受图片尺寸
- //@注:本人非常喜欢这种风格的代码,闭包的形式让样式思路非常清晰,作用域的思路让代码更容易维护
- .pic(@size:30px){
- overflow: hidden;
- width:@size;
- height:@size;
- a{
- display: table-cell; /*主流浏览器*/
- vertical-align: middle;
- text-align: center;
- /* IE6,7 hack */
- *display: block;
- *font-family: Arial;
- *line-height: 0;
- width:@size;
- height:@size;
- *font-size:@size*0.873;
- img{
- vertical-align: middle;
- }
- }
- }
- /*border-radius note: default value:3px*/
- //圆角函数,低版本浏览器采用IE-CSS3
- .border-radius (@radius:3px) {
- border-radius: @radius;
- -moz-border-radius: @radius;
- -webkit-border-radius: @radius;
- //IE
- behavior: url(ie-css3.htc);
- zoom:1;
- }
- /*gradient*/
- //阴影函数,接受两个参数,初始颜色和结束颜色
- .gradient(@fromcolor:#000,@tocolor:#fff){
- background: -webkit-gradient(linear, 0 0, 0 100%, from(@fromcolor), to(@tocolor));
- background: -moz-linear-gradient(top, @fromcolor, @tocolor);
- }
接下来是关于libs.less的引用,具体体现在base.less
base.less主要是base库的主要部分,它负责生成一些公用的样式供其他业务模块使用,通过引用libs.less来生成自己希望得到的样式
- @import 'libs.less';
- /*-------------------------------------------------------------------------------
- * Author: suhe <[email protected]>
- * Desc: Less版本的base
- -----------------------------------------------------------------------------*/
- /*-----=Reset: -----------------------------------------------{{{1*/
- html{ overflow-y:scroll;}
- //常量使用
- body{
- background-color: @body-back;
- }
- //libs函数的调用
- pre { .wrap }
- ul,li{
- .reset;
- }
- /*--------------------------------------------------------END-}}}1*/
- /*-----=Common Class: -----------------------------------------{{{1*/
- //作用域和函数的结合使用
- .grid{
- .grid-container();
- .g-u{
- .grid-unit();
- }
- }
- .floatleft { .left() }
- .floatright { .right() }
- .clearfix { .clear() }
- /*-----=图片居中---------------------------------{{{2*/
- //函数多次调用体现less的重用性
- .s30{
- .pic(30px);
- }
- .s60{
- .pic(60px);
- }
- .s80{
- .pic(80px);
- }
- /*-----=图片居中---------------------------------{{{2*/
- /*----------------------------------------------END-}}}2*/
- /*--------------------------------------------------------END-}}}1*/
- //常量的使用
- #content{
- width:@page-width;
- margin:0 auto;
- }
以上介绍两个模块作为lesscss的初步尝试,至于其他的业务模块的尝试也同base差不多,所以不多做介绍。
结束语
我觉得有必要补充一点,就是关于lesscss的服务器环境配置,随着现在node在windows平台的完善,个人觉得lesscss的使用简单了许多,笔者曾经采用的是.NET的编译环境,现在也将环境随之迁移至node。当然,题外话,如果将less编译的工作放在部署机器,而客户端只需要引入less.js来验证效果,部署机器做filter工作过滤lesscss.js然后做替换,这样的方案会比较完美些。
现在IDEA11已经有了less的插件支持,这个非常赞,相信在node环境下做个多模块一键编译的工具不会太难,这样一来,less的很多瓶颈得到了解决,相信less在不久的将来会有越来越大的用户群。