1.变量
1.属性值作为变量
@color:#333; div{ background:@color; }
2.选择器作为变量
@mySelector: #wrap; @Wrap: wrap; @{mySelector}{ //变量名 必须使用大括号包裹 color: #999; 50%; } .@{Wrap}{ color:#ccc; } #@{Wrap}{ color:#666; } /* 生成的 CSS */ #wrap{ color: #999; 50%; } .wrap{ color:#ccc; } #wrap{ color:#666; }
3.属性值作为变量
@borderStyle: border-style; @Soild:solid; #wrap{ @{borderStyle}: @Soild;//变量名 必须使用大括号包裹 } /* 生成的 CSS */ #wrap{ border-style:solid; }
4.url路径作为变量
@images: "../img";//需要加引号 body { background: url("@{images}/dog.png");//变量名 必须使用大括号包裹 } /* 生成的 CSS */ body { background: url("../img/dog.png"); }
5.申明变量作为方法 eg:@name{};
@background: {background:red;}; #main{ @background(); } @Rules:{ 200px; height: 200px; border: solid 1px red; }; #con{ @Rules(); } /* 生成的 CSS */ #main{ background:red; } #con{ 200px; height: 200px; border: solid 1px red; }
6.变量运算
规则:
加减法时,以第一个数据的单位为基准。
乘除法时,注意单位一定要统一。
@300px; @color:#222; #wrap{ @width-20; height:@width-20*5; margin:(@width-20)*5; color:@color*2; background-color:@color + #111; } /* 生成的 CSS */ #wrap{ 280px; height:200px; margin:1400px; color:#444; background-color:#333; }
7.变量的作用域
就近原则,不是指代码的位置,而是指代码的层级结构。
@color:red; div{ @color:blue; background: @color; }
8.用变量定义变量
解析的顺序是从后向前逐层解析。
@fnord: "I am fnord."; @var: "fnord"; #wrap::after{ content: @@var; //将@var替换为其值 content:@fnord; } /* 生成的 CSS */ #wrap::after{ content: "I am fnord."; }
2.嵌套
1.&符号,表示的是上1级选择器的名字。
#header{ &:after{ //注意:不能省略&,如果省略会给每一个子元素添加一个after。 content:"Less is more!"; } .title{ font-weight:bold; } &_content{//理解方式:直接把 & 替换成 #header margin:20px; } } /* 生成的 CSS */ #header::after{ content:"Less is more!"; } #header .title{ //嵌套了 font-weight:bold; } #header_content{//没有嵌套! margin:20px; }
2.嵌套覆盖原有样式
div{ 200px; height:200px; background:red; .show{ display: none; } } .show{ display: block; //被覆盖,只有在div使用show时才覆盖 }
3.媒体查询
css写法:
@media only screen and {max-width:1200px;}{ div{} } @media only screen and {min-992px;}{ div{} } @media only screen and {min-768px}{ div{} }
less写法:
#main{ @media screen{ @media (max-768px){ 100px; } } @media tv { 2000px; } } /* 生成的 CSS */ @media screen and (max-768px){ #main{ 100px; } } @media tv{ #main{ 2000px; } }
4.混合方法
1.基本方法
要点:“.”与“#”都可以作为方法前缀。可以不适用小括号,但是为了避免css格式混淆,建议加上小括号“()”。
.card(){ background: red; } #post(){ color: #fff; } // 或者 .card{ background: red; } #post{ color: #fff; } #wrap{ .card(); #post(); } //生成的css .card { background: red; } #post { color: #fff; } #wrap { background: red; color: #fff; }
2.传参的方法,第一传入默认参数,第二可以传入不定参数,类似函数
.setSize(@width_size,@height_size){ @width_size; height:@height_size; } .card(){ background: red; } .setFont(@color:#fff,@fontSize:20px){ color: @color; font-size: @fontSize; } .boxShadow(...){ box-shadow: @arguments; } .textShadow(@a,...){ text-shadow: @arguments; } #wrap{ .setSize(100px,200px); .card(); .setFont(); .boxShadow(1px,4px,30px,blue); .textShadow(1px,4px,30px,green); } //生成的css #wrap { 100px; height: 200px; background: red; color: #fff; font-size: 20px; box-shadow: 1px 4px 30px blue; text-shadow: 1px 4px 30px green; }
3.多个方法的情况下的匹配
类似于多态。有点类似于switch case
同一个方法名的多个方法,由于传入的参数不同而实现不同的功能。
.triangle(top,@20px,@color:#000){ border-color:transparent transparent @color transparent ; } .triangle(right,@20px,@color:#000){ border-color:transparent @color transparent transparent ; } .triangle(bottom,@20px,@color:#000){ border-color:@color transparent transparent transparent ; } .triangle(left,@20px,@color:#000){ border-color:transparent transparent transparent @color; } .triangle(@_,@20px,@color:#000){ border-style: solid; border- @width; } #main{ .triangle(left, 50px, #999) } /* 生成的 CSS */ #main{ border-color:transparent transparent transparent #999; border-style: solid; border- 50px; }
4.方法的嵌套用法,类似js的对象
>
选择器,选择的是儿子元素,就是必须与父元素有直接血源的元素。 - 在引入命令空间时,如使用 >
选择器,父元素不能加括号。 - 不得单独使用命名空间的方法必须先引入命名空间,才能使用其中方法。 - 子方法可以使用上一层传进来的方法#card(){ background: #723232; .d(@w:300px){ @w; #a(@h:300px){ height: @h;//可以使用上一层传进来的方法 @w; } } } #wrap{ #card > .d > #a(100px); // 父元素不能加 括号 } #main{ #card .d(); } #con{ //不得单独使用命名空间的方法 //.d() 如果前面没有引入命名空间 #card ,将会报错 #card; // 等价于 #card(); .d(20px); //必须先引入 #card } /* 生成的 CSS */ #wrap{ height:100px; 300px; } #main{ 300px; } #con{ 20px; }
5.条件的使用:less具有一个when,and,not与“,”语法
比较运算有:> >= = =< <
=代表是等于
除去关键字true以外的值其他都会被默认为fales
#card{ // and 运算符 ,相当于 与运算 &&,必须条件全部符合才会执行 .border(@width,@color,@style) when (@width>100px) and(@color=#999){ border:@style @color @width; } // not 运算符,相当于 非运算 !,条件为 不符合才会执行 .background(@color) when not (@color>=#222){ background:@color; } // , 逗号分隔符:相当于 或运算 ||,只要有一个符合条件就会执行 .font(@size:20px) when (@size>50px) , (@size<100px){ font-size: @size; } } #main{ #card>.border(200px,#999,solid); #card .background(#111); #card > .font(40px); } /* 生成后的 CSS */ #main{ border:solid #999 200px; background:#111; font-size:40px; }
6.循环语法
.generate-columns(@n, @i: 1) when (@i =< @n) { .column-@{i} { (@i * 100% / @n); } .generate-columns(@n, (@i + 1)); } .generate-columns(4); /* 生成后的 CSS */ .column-1 { 25%; } .column-2 { 50%; } .column-3 { 75%; } .column-4 { 100%; }
7.使用important: 相当于这个方法中的每一个属性都设置了一遍important,不允许覆盖
.border{ border: solid 1px red; margin: 50px; } #main{ .border() !important; //border里面的每个属性都会被important } /* 生成后的 CSS */ #main { border: solid 1px red !important; margin: 50px !important; }
8.继承属性:extend是less的一个伪类。它可以继承所匹配声明中的全部样式。
加上all 可以继承所有属性
选择器和扩展之间 是允许有空格的:pre:hover :extend(div pre).
可以有多个扩展: pre:hover:extend(div pre):extend(.bucket tr) - 注意这 与 pre:hover:extend(div pre, .bucket tr)一样。
扩展必须在最后 : pre:hover:extend(div pre).nth-child(odd)。 如果一个规则集包含多个选择器,所有选择器都可以使用extend关键字。
.mainBg{ background: red; .fontSize{ color: #fff; } } #main{ background: green; 100px; height: 100px; &:extend(.mainBg); } #con{ background:blue; 100px; height: 100px; &:extend(.mainBg .fontSize); } #wrap:extend(.mainBg all) { 100px; height: 100px; font-size: 30px; } //生成的css .mainBg, #main, #wrap { background: red; } .mainBg .fontSize, #con, #wrap .fontSize { color: #fff; } #main { background: green; 100px; height: 100px; } #con { background: blue; 100px; height: 100px; } #wrap { 100px; height: 100px; font-size: 30px; }
9.导入
在less文件中可以引入其他的less文件。使用关键字import。
导入less文件,可以省略后缀。
import “index.less”; import “index”;
@import可以放在任何地方
@import 'index.less'
加reference属性,不会编译该引入文件,但是可以使用该文件的变量
@import (reference) “bootstrap.less”;
加once属性,表明相同的文件只会被导入一次,而随后的导入文件的重复代码都不会解析。
@import (once) "foo.less"; @import (once) "foo.less"; // this statement will be ignored
加multiple属性,允许导入多个同名文件
@import (multiple) "foo.less"; @import (multiple) "foo.less";
10.避免编译
#main{ ~'calc(300px - 30px)'; } /* 生成后的 CSS */ #main{ calc(300px - 30px); }
11.在less中使用js