{less}

作者: 286f50208306 | 来源:发表于2016-03-25 11:19 被阅读275次

    变量

    注意你的less样式文件一定要在引入less.js前先引入。

    备注:请在服务器环境下使用!本地直接打开可能会报错!

    监视模式

    监视模式是客户端的一个功能,这个功能允许你当你改变样式的时候,客户端将自动刷新。

    要使用它,只要在URL后面加上'#!watch',然后刷新页面就可以了。另外,你也可以通过在终端运行less.watch()来启动监视模式。

    在服务器端使用

    安装

    在服务器端安装 LESS 的最简单方式就是通过npm(node 的包管理器), 像这样:

    $ npm install less

    如果你想下载最新稳定版本的 LESS,可以尝试像下面这样操作:

    $ npm install less@latest

    使用

    只要安装了 LESS,就可以在Node中像这样调用编译器:

    var less = require('less');

    less.render('.class { width: 1 + 1 }', function (e, css) {

    console.log(css);

    });

    上面会输出

    .class{width:2;}

    你也可以手动调用解析器和编译器:

    var parser = new(less.Parser);

    parser.parse('.class { width: 1 + 1 }', function (err, tree) {

    if (err) { return console.error(err) }

    console.log(tree.toCSS());

    });

    配置

    你可以向解析器传递参数:

    var parser = new(less.Parser)({

    paths: ['.', './lib'], // Specify search paths for @import directives

    filename: 'style.less' // Specify a filename, for better error messages

    });

    parser.parse('.class { width: 1 + 1 }', function (e, tree) {

    tree.toCSS({ compress: true }); // Minify CSS output

    });

    在命令行下使用

    你可以在终端调用 LESS 解析器:

    $ lessc styles.less

    上面的命令会将编译后的 CSS 传递给stdout, 你可以将它保存到一个文件中:

    $ lessc styles.less > styles.css

    如何你想将编译后的 CSS 压缩掉,那么加一个-x参数就可以了.

    LESS 语法

    LESS 做为 CSS 的一种形式的扩展,它并没有阉割 CSS 的功能,而是在现有的 CSS 语法上,添加了很多额外的功能,所以学习 LESS 是一件轻而易举的事情,果断学习之!

    变量

    很容易理解:

    @nice-blue:#5B83AD;@light-blue:@nice-blue+#111;#header{color:@light-blue; }

    输出:

    #header{color:#6c94be; }

    甚至可以用变量名定义为变量:

    @fnord:"I am fnord.";@var:'fnord';content:@@var;

    解析后:

    content:"I am fnord.";

    请注意 LESS 中的变量为完全的 ‘常量’ ,所以只能定义一次.

    混合

    在 LESS 中我们可以定义一些通用的属性集为一个class,然后在另一个class中去调用这些属性. 下面有这样一个class:

    .bordered{border-top: dotted1pxblack;border-bottom: solid2pxblack;}

    那如果我们现在需要在其他class中引入那些通用的属性集,那么我们只需要在任何class中像下面这样调用就可以了:

    #menua{color:#111;.bordered;}.posta{color: red;.bordered;}

    .borderedclass里面的属性样式都会在#menu a和.post a中体现出来:

    #menua{color:#111;border-top: dotted1pxblack;border-bottom: solid2pxblack;}.posta{color: red;border-top: dotted1pxblack;border-bottom: solid2pxblack;}

    任何 CSSclass,id或者元素属性集都可以以同样的方式引入.

    带参数混合

    在 LESS 中,你还可以像函数一样定义一个带参数的属性集合:

    .border-radius(@radius) {border-radius:@radius;-moz-border-radius:@radius;-webkit-border-radius:@radius;}

    然后在其他class中像这样调用它:

    #header{.border-radius(4px);}.button{.border-radius(6px);  }

    我们还可以像这样给参数设置默认值:

    .border-radius(@radius:5px) {border-radius:@radius;-moz-border-radius:@radius;-webkit-border-radius:@radius;}

    所以现在如果我们像这样调用它的话:

    #header{.border-radius;  }

    radius的值就会是5px.

    你也可以定义不带参数属性集合,如果你想隐藏这个属性集合,不让它暴露到CSS中去,但是你还想在其他的属性集合中引用,你会发现这个方法非常的好用:

    .wrap() {text-wrap: wrap;white-space: pre-wrap;white-space: -moz-pre-wrap;word-wrap: break-word;}pre{.wrap}

    输出:

    pre{text-wrap: wrap;white-space: pre-wrap;white-space: -moz-pre-wrap;word-wrap: break-word;}

    @arguments变量

    @arguments包含了所有传递进来的参数. 如果你不想单独处理每一个参数的话就可以像这样写:

    .box-shadow(@x:0,@y:0,@blur:1px,@color: #000) {box-shadow:@arguments;-moz-box-shadow:@arguments;-webkit-box-shadow:@arguments;}.box-shadow(2px,5px);

    将会输出:

    box-shadow:2px5px1px#000;-moz-box-shadow:2px5px1px#000;-webkit-box-shadow:2px5px1px#000;

    模式匹配和导引表达式

    有些情况下,我们想根据传入的参数来改变混合的默认呈现,比如下面这个例子:

    .mixin(@s,@color) { ... }.class{.mixin(@switch,#888);}

    如果想让.mixin根据不同的@switch值而表现各异,如下这般设置:

    .mixin(dark,@color) {color: darken(@color,10%);}.mixin(light,@color) {color: lighten(@color,10%);}.mixin(@_,@color) {display: block;}

    现在,如果运行:

    @switch: light;.class{.mixin(@switch,#888);}

    就会得到下列CSS:

    .class{color:#a2a2a2;display: block;}

    如上,.mixin就会得到传入颜色的浅色。如果@switch设为dark,就会得到深色。

    具体实现如下:

    第一个混合定义并未被匹配,因为它只接受dark做为首参

    第二个混合定义被成功匹配,因为它只接受light

    第三个混合定义被成功匹配,因为它接受任意值

    只有被匹配的混合才会被使用。变量可以匹配任意的传入值,而变量以外的固定值就仅仅匹配与其相等的传入值。

    我们也可以匹配多个参数:

    .mixin(@a) {color:@a;}.mixin(@a,@b) {color: fade(@a,@b);}

    Now if we call.mixinwith a single argument, we will get the output of the first definition, but if we call it withtwoarguments, we will get the second definition, namely@afaded to@b.

    引导

    当我们想根据表达式进行匹配,而非根据值和参数匹配时,导引就显得非常有用。如果你对函数式编程非常熟悉,那么你很可能已经使用过导引。

    为了尽可能地保留CSS的可声明性,LESS通过导引混合而非if/else语句来实现条件判断,因为前者已在@media query特性中被定义。

    以此例做为开始:

    .mixin(@a)when(lightness(@a) >=50%) {background-color: black;}.mixin(@a)when(lightness(@a) <50%) {background-color: white;}.mixin(@a) {color:@a;}

    when关键字用以定义一个导引序列(此例只有一个导引)。接下来我们运行下列代码:

    .class1{.mixin(#ddd) }.class2{.mixin(#555) }

    就会得到:

    .class1{background-color: black;color:#ddd;}.class2{background-color: white;color:#555;}

    导引中可用的全部比较运算有:> >= = =< <。此外,关键字true只表示布尔真值,下面两个混合是相同的:

    .truth(@a)when(@a) { ... }.truth(@a)when(@a= true) { ... }

    除去关键字true以外的值都被视示布尔假:

    .class{.truth(40);// Will not match any of the above definitions.}

    导引序列使用逗号‘,’—分割,当且仅当所有条件都符合时,才会被视为匹配成功。

    .mixin(@a)when(@a>10), (@a< -10) { ... }

    导引可以无参数,也可以对参数进行比较运算:

    @media: mobile;.mixin(@a)when(@media= mobile) { ... }.mixin(@a)when(@media= desktop) { ... }.max(@a,@b)when(@a>@b) {width:@a}.max(@a,@b)when(@a<@b) {width:@b}

    最后,如果想基于值的类型进行匹配,我们就可以使用is*函式:

    .mixin(@a,@b:0)when(isnumber(@b)) { ... }.mixin(@a,@b: black)when(iscolor(@b)) { ... }

    下面就是常见的检测函式:

    iscolor

    isnumber

    isstring

    iskeyword

    isurl

    如果你想判断一个值是纯数字,还是某个单位量,可以使用下列函式:

    ispixel

    ispercentage

    isem

    最后再补充一点,在导引序列中可以使用and关键字实现与条件:

    .mixin(@a)when(isnumber(@a)) and (@a>0) { ... }

    使用not关键字实现或条件

    .mixin(@b)whennot (@b>0) { ... }

    嵌套规则

    LESS 可以让我们以嵌套的方式编写层叠样式. 让我们先看下下面这段 CSS:

    #header{color: black; }#header.navigation{font-size:12px;}#header.logo{width:300px; }#header.logo:hover{text-decoration: none;}

    在 LESS 中, 我们就可以这样写:

    #header{color: black;.navigation{font-size:12px;  }.logo{width:300px;    &:hover{text-decoration: none }  }}

    或者这样写:

    #header{color: black;.navigation{font-size:12px}.logo{width:300px;    &:hover{text-decoration: none }  }}

    代码更简洁了,而且感觉跟DOM结构格式有点像.

    注意&符号的使用—如果你想写串联选择器,而不是写后代选择器,就可以用到&了. 这点对伪类尤其有用如:hover和:focus.

    例如:

    .bordered{  &.float{float: left;  }.top{margin:5px;  }}

    会输出

    .bordered.float{float: left;  }.bordered.top{margin:5px;}

    运算

    任何数字、颜色或者变量都可以参与运算. 来看一组例子:

    @base:5%;@filler:@base*2;@other:@base+@filler;color:#888/4;background-color:@base-color+#111;height:100%/2+@filler;

    LESS 的运算已经超出了我们的期望,它能够分辨出颜色和单位。如果像下面这样单位运算的话:

    @var:1px+5;

    LESS 会输出6px.

    括号也同样允许使用:

    width: (@var+5) *2;

    并且可以在复合属性中进行运算:

    border: (@width*2) solid black;

    Color 函数

    LESS 提供了一系列的颜色运算函数. 颜色会先被转化成HSL色彩空间, 然后在通道级别操作:

    lighten(@color,10%);// return a color which is 10% *lighter* than @colordarken(@color,10%);// return a color which is 10% *darker* than @colorsaturate(@color,10%);// return a color 10% *more* saturated than @colordesaturate(@color,10%);// return a color 10% *less* saturated than @colorfadein(@color,10%);// return a color 10% *less* transparent than @colorfadeout(@color,10%);// return a color 10% *more* transparent than @colorfade(@color,50%);// return @color with 50% transparencyspin(@color,10);// return a color with a 10 degree larger in hue than @colorspin(@color, -10);// return a color with a 10 degree smaller hue than @colormix(@color1,@color2);// return a mix of @color1 and @color2

    使用起来相当简单:

    @base:#f04615;.class{color: saturate(@base,5%);background-color: lighten(spin(@base,8),25%);}

    你还可以提取颜色信息:

    hue(@color);// returns the `hue` channel of @colorsaturation(@color);// returns the `saturation` channel of @colorlightness(@color);// returns the 'lightness' channel of @color

    如果你想在一种颜色的通道上创建另一种颜色,这些函数就显得那么的好用,例如:

    @new: hsl(hue(@old),45%,90%);

    @new将会保持@old的色调, 但是具有不同的饱和度和亮度.

    Math 函数

    LESS提供了一组方便的数学函数,你可以使用它们处理一些数字类型的值:

    round(1.67);// returns `2`ceil(2.4);// returns `3`floor(2.6);// returns `2`

    如果你想将一个值转化为百分比,你可以使用percentage函数:

    percentage(0.5);// returns `50%`

    命名空间

    有时候,你可能为了更好组织CSS或者单纯是为了更好的封装,将一些变量或者混合模块打包起来, 你可以像下面这样在#bundle中定义一些属性集之后可以重复使用:

    #bundle{.button() {display: block;border:1pxsolid black;background-color: grey;    &:hover{background-color: white }  }.tab{ ... }.citation{ ... }}

    你只需要在#header a中像这样引入.button:

    #headera{color: orange;#bundle>.button;}

    作用域

    LESS 中的作用域跟其他编程语言非常类似,首先会从本地查找变量或者混合模块,如果没找到的话会去父级作用域中查找,直到找到为止.

    @var: red;#page{@var: white;#header{color:@var;// white}}#footer{color:@var;// red}

    注释

    CSS 形式的注释在 LESS 中是依然保留的:

    /* Hello, I'm a CSS-style comment */.class{color: black }

    LESS 同样也支持双斜线的注释, 但是编译成 CSS 的时候自动过滤掉:

    // Hi, I'm a silent comment, I won't show up in your CSS.class{color: white }

    Importing

    你可以在main文件中通过下面的形势引入.less文件,.less后缀可带可不带:

    @import"lib.less";@import"lib";

    如果你想导入一个CSS文件而且不想LESS对它进行处理,只需要使用.css后缀就可以:

    @import"lib.css";

    这样LESS就会跳过它不去处理它.

    字符串插值

    变量可以用类似ruby和php的方式嵌入到字符串中,像@{name}这样的结构:

    @base-url:"http://assets.fnord.com";background-image: url("@{base-url}/images/bg.png");

    避免编译

    有时候我们需要输出一些不正确的CSS语法或者使用一些 LESS不认识的专有语法.

    要输出这样的值我们可以在字符串前加上一个~, 例如:

    .class{filter: ~"ms:alwaysHasItsOwnSyntax.For.Stuff()";}

    我们可以将要避免编译的值用 “”包含起来,输出结果为:

    .class{filter:ms:alwaysHasItsOwnSyntax.For.Stuff();}

    JavaScript 表达式

    JavaScript 表达式也可以在.less 文件中使用. 可以通过反引号的方式使用:

    @var: `"hello".toUpperCase() +'!'`;

    输出:

    @var:"HELLO!";

    注意你也可以同时使用字符串插值和避免编译:

    @str:"hello";@var: ~`"@{str}".toUpperCase() +'!'`;

    输出:

    @var: HELLO!;

    它也可以访问JavaScript环境:

    @height: `document.body.clientHeight`;

    如果你想将一个JavaScript字符串解析成16进制的颜色值, 你可以使用color函数:

    @color: color(`window.colors.baseColor`);@darkcolor: darken(@color,10%);

    相关文章

      网友评论

        本文标题:{less}

        本文链接:https://www.haomeiwen.com/subject/lmzrlttx.html