Less


Less 是一门 CSS 预处理语言,它扩展了 CSS 语言,增加了变量、Mixin、函数等特性,使 CSS 更易维护和扩展。

Less 可以运行在 Node 或浏览器端。

Less的编译工具:

1、koala编译(下载地址:http://koala-app.com/index-zh.html,推荐)

2、Node.js库

3、浏览器端使用

下面来讲解一下less的语法:

1、less的开头

@charset "utf-8";
2、less的注释:

/**/:会被编译到css中

//:不会被编译到css中

3、变量:

less中变量的格式:@变量名:值;

@test_height:200px;
.test_variable{
    height:@test_height;
}
4、混合(mixin)变量

<div class="test_blend"></div>

.test_blend{
    .border_radius(10px);
}
.border_radius(@radius){
    border-radius: @radius;
    -webkit-border-radius: @radius;
    -moz-border-radius: @radius;
}
/*设置默认值*/
.test_blend{
    .border_radius();
}
.border_radius(@radius:5px){
    border-radius: @radius;
    -webkit-border-radius: @radius;
    -moz-border-radius: @radius;
}

5、匹配模式

类似于js中的if,但不完全是,满足条件后才能匹配。

例如用css画三角形

.test_sanjiaoxiing{
    width: 0;
    height: 0;
    overflow: hidden;
    border-width: 10px;
    border-color: transparent transparent red transparent;
    border-style: solid;
}
其中的 overflow:hidden; 用于处理IE6最小高度的问题;

同时,在IE6中这种写法会出现黑边,解决办法如下:

border-style: dashed dashed solid dashed;

<div class="test_sanjiaoxing"></div>

.test_sanjiaoxing{
    .triangle(bottom);
}
.triangle(bottom,@w:5px,@c:#ccc){
    border-width:@w;
    border-color:@c transparent transparent transparent;
    border-style:solid dashed dashed dashed;
}
.triangle(top,@w:5px,@c:#ccc){
    border-width:@w;
    border-color:transparent transparent @c transparent;
    border-style:dashed dashed solid dashed;
}
.triangle(left,@w:5px,@c:#ccc){
    border-width:@w;
    border-color:transparent @c transparent transparent;
    border-style:dashed solid dashed dashed;
}
.triangle(right,@w:5px,@c:#ccc){
    border-width:@w;
    border-color:transparent transparent transparent @c;
    border-style:dashed dashed dashed solid;
}
.triangle(@_,@w:5px,@c:#ccc){
    width:0;
    height:0;
    overflow:hidden;
}
不管样式匹配的是top、还是bottom、还是left、还是right,都会带上 .triangle(@_,@w:5px,@c:#ccc); 的样式; @_ 是固定的格式。

条件表达式:利用条件表达式更准确、更严格地限制混合的匹配,通过 when 关键字实现。

<div class="test_mixin1">用条件表达式进行匹配测试1</div>
<div class="test_mixin2">用条件表达式进行匹配测试2</div>
/* less */
.test_mixin1{
    .mixin(12);
}
.test_mixin2{
    .mixin(8);
}
.mixin(@a) when(@a>=10){
    color:red;
}
.mixin(@a) when(@a<10){
    color:yellow;
}
/* 编译后的css */
.test_mixin1{
    color:red;
}
.test_mixin2{
    color:yellow;
}
条件表达式中为关键字 true 时只表示布尔真值,如下两个混合是相同的:

.truth(@a) when(@a){ ... }
.truth(@a) when(@a = true){ ... }
除了关键字true以外的值都视为布尔假,例如:

.test_truth{
    .truth(30);/*不匹配上面任何一个混合*/
}
导引序列用逗号(,)分割,当且仅当所有条件都符合时才能匹配成功

.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:是否为URL字符串

判断一个值是纯数字还是某个单位量,可使用下列函数:

ispixel:是否为像素单位;

ispercentage:是否为百分数;

isem:是否为em单位。

LESS条件表达式支持and、or(不是or关键字,这里用(,)来表示or的逻辑关系)和not来组合条件表达式:

.smaller(@a,@b) when(@a>@b){
    color: black;
}
.math(@a) when(@a>10) and (@a<20){
    color: red;
}
.math(@a) when(@a<10) and (@a>20){
    color: blue;
}
.math(@a) when not(@a=10){
    color: yellow;
}
.math(@a) when (@a=10){
    color: green;
}

6、运算(+、-、*、/)

@test_01:300px;

.test_01{
    width:@test_01 + 20;
    color: #ccc-10;
}
在变量@test_01中已经带有"px",所以在运算时,20后面不需要加上"px"。

颜色也可以加减,但几乎不用,一般要用什么颜色直接用,不对其进行加减。

数学函数:

    round(@number):对数值变量@number进行四舍五入;

    ceil(@number):向上舍入;

    floor(@number):向下舍入;

    precentage(@number):百分比转换

7、嵌套

<ul class="list"><li><a><span></span></a></li></ul>

.list{
    ...
    li{ ... }
    a{
        ...
        &:hover{ ... }
    }
    span{ ... }
}
a 标签可以放在 li 标签中,也可以直接放在 .list 中与li标签同级,但是把 a 标签放在 .list 中与放在 li 标签中相比,减少了匹配次数,所有将 a 标签放在 .list 中与 li 同级更好些。span标签同理。

还有上面中的 & ,代表上一层里的选择器。&有两个作用,一个是对伪类的使用(&:hover{ ... }),二是对连接的使用(&-item)。

8、@arguments变量:包含了所有传递进来的参数。(一般较少使用)

<div class="test_arguments"></div>

.test_arguments{
    .border_arg();/*默认值*/
}
.test_arguments{
    .border_arg(40px);/*改变参数*/
}
.border_arg(@w:30px,@c:red,@xx:solid){
    border:@arguments;
}
其中 border:@arguments; 等同于 border:@w @c @xx; 
9、避免编译

当需输出不正确的css语法或者使用一些less不认识的专有语法时,可在字符串输出前加上 ~ ,并将不需编译的内容用""包含起来。例如:

width: calc(300px - 30px);/*本该在浏览器上计算,但是在编译时已经计算出结果,css中的结果为width:calc(270px);*/
width: ~'calc(300px -30px)';/*这样在编译成css时会原封不动,不对其进行编译,css中的结果为 width: calc(300px - 30px);*/
10、!important关键字:使css样式层级优先级最高。

在混合中使用:会为所有混合带来的样式添加上!important

<div class="test_important"></div>
/* less */
.test_important{
    .border_radius() !important;
}
.border_radius(@radius:5px){
    border-radius:@radius;
    -webkit-border-radius:@radius;
    -moz-border-radius:@radius;
}
/* 编译之后的css */
.test_important{
    border-radius:5px !important;
    -webkit-border-radius:5px !important;
    -moz-border-radius:5px !important;
}
10、命名空间

把变量与混合封装起来,避免与其他地方定义冲突。看下面的例子:

/* less */
@var-color: white;
#bundle{
    @var-color: yellow;
    .button{ ... }
    .tab(){ ... }
    .citation(){ ... }
    .oops{ ... }
}
#header{
    ...
    #bundle>.button;
    #bundle>.oops;
}
/* css */
#bundle .oops{
    ...
}
#header{
    ...   
}
在 #bundle 中建立一个命名空间,在里面封装的变量及属性集合不会暴露到外部空间中。

需要注意的是:因为无参的混合不会暴露在最终的css代码中,而普通的属性集则会出现。所以 .oops 被暴露在了最终的css代码中。在定义命名空间和混合时要小心处理,避免带来潜在问题。

11、导入

LESS支持符合标准的导入方法,利用@import 命令可以导入外部LESS文件后CSS文件。

例如:在 main.less 文件中导入 lib.less 文件, .less后缀可带可不带;在 main.less 中导入 lib.css 文件,并不对该css文件进行编译,只需使用 .css 后缀。

@import "lib.less";

@import "lib";

@import "lib.css";
12、字符串插值

变量可以使用类似Ruby和PHP的方式嵌入到字符串中,方法是使用 @{name} 结构,通过 @{name} 来调用变量的值:

@base_url = 'http://coding.smashingmagazine.com';
background-image: url("@{@base_url}/images/background.png");
13、JavaScript表达式

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

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

@var:"HELLO!";
也可以同时使用字符串插值和避免编译:

@str:"hello";
@var:~'"@{str}".toUpperCase()+'!'';
/* 输出 */
@var:HELLO!;
也可访问JavaScript环境:

@height:'document.body.clientHeight';
可以使用颜色函数将一个JavaScript字符串解析成十六进制的颜色值:

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值