变量 Less
中的变量十分强大,可化万物,值得一提的是,其变量是常量 ,所以只能定义一次,不能重复使用。
值变量 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 @color : #999 ;@bgColor : skyblue;//不要添加引号@width : 50% ;#wrap { color : @color; background : @bgColor; width : @width; } #wrap { color : #999 ; background : skyblue; width : 50% ; }
以@
定义变量,使用时也通过@
引用
选择器变量 可以让特定的选择器自带样式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 @mySelector : #wrap;@Wrap : wrap;@{mySelector}{ //变量名 必须使用大括号包裹 color : #999 ; width : 50% ; } .@{Wrap}{ color :#ccc ; } #@{Wrap}{ color :#666 ; } #wrap { color : #999 ; width : 50% ; } .wrap { color :#ccc ; } #wrap { color :#666 ; }
属性变量 可以给变量赋予属性名,不过使用的时候需要用大括号包裹
1 2 3 4 5 6 7 8 9 10 11 @borderStyle : border-style;@Soild :solid;#wrap { @{borderStyle}: @Soild;//变量名 必须使用大括号包裹 } #wrap { border-style :solid; }
url变量 1 2 3 4 5 6 7 8 9 10 @images : "../img" ;//需要加引号body { background : url ("@{images}/dog.png" );//变量名 必须使用大括号包裹 } body { background : url ("../img/dog.png" ); }
声明变量 类似下面的混合方法
结构:@name: {key: value}
使用:@name()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 @background : {background :red;};#main { @background (); } @Rules :{ width : 200px ; height : 200px ; border : solid 1px red; }; #con { @Rules (); } #main { background :red; } #con { width : 200px ; height : 200px ; border : solid 1px red; }
变量运算
加减法时 以第一个数据的单位为基准
乘除法时 注意单位一定要统一
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 @width :300px;@color :#222;#wrap { width :@width-20 ; height :@width-20 *5 ; margin :(@width-20 )*5 ; color :@color*2 ; background-color :@color + #111 ; } #wrap { width :280px ; height :200px ; margin :1400px ; color :#444 ; background-color :#333 ; }
变量作用域 采取就近原则
1 2 3 4 5 6 7 8 9 10 11 12 13 @var : @a;@a : 100% ;#wrap { width : @var; @a : 9% ; } #wrap { width : 9% ; }
使用变量定义变量 1 2 3 4 5 6 7 8 9 10 @fnord : "I am fnord." ;@var : "fnord" ;#wrap ::after { content : @@var; //将@var 替换为其值 content :@fnord; } #wrap ::after { content : "I am fnord." ; }
嵌套 &
的妙用&
代表上一层选择器的名字
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 #header { &:after{ content:"Less is more!" ; } .title { font-weight :bold; } &_content{//理解方式:直接把 & 替换成 #header margin :20px ; } } #header ::after { content :"Less is more!" ; } #header .title { //嵌套了 font-weight :bold; } #header_content {//没有嵌套! margin :20px ; }
媒体查询 用传统css写媒体查询
1 2 3 4 5 6 7 8 #wrap { width :500px ; } @media screen and (max-width :768px ){ #wrap { width :100px ; } }
less的写法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 #main { //something... @media screen{ @media (max-width :768px ){ width :100px ; } } @media tv { width :2000px ; } } @media screen and (maxwidth :768px ){ #main { width :100px ; } } @media tv{ #main { width :2000px ; } }
唯一的缺点就是 每一个元素都会编译出自己 @media 声明,并不会合并。
实战技巧 1 2 3 4 5 6 7 8 9 10 #main { // something.. &.show { display :block; } } .show { display :none; }
1 2 const main = document .getElementById("main" );main.classList.add("show" );
结果
1 2 3 4 5 6 #main .show { display :block; } .show { display :none; //会被覆盖。 }
混合方法 无参数方法 就像声明的合集,需要时键入名称即可
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 .card { // 等价于 .card () background : #f6f6f6 ; -webkit-box-shadow : 0 1px 2px rgba (151 , 151 , 151 , .58 ); box-shadow : 0 1px 2px rgba (151 , 151 , 151 , .58 ); } #wrap { .card ;//等价于.card (); } #wrap { background : #f6f6f6 ; -webkit-box-shadow : 0 1px 2px rgba (151 , 151 , 151 , .58 ); box-shadow : 0 1px 2px rgba (151 , 151 , 151 , .58 ); }
.
与#
都可以作为方法前缀()
可以有也可以没有,为了清晰建议写()
默认参数方法
Less
可以使用默认参数,如果没有传参数,那么将使用默认参数。
@arguments
犹如JS中的arguments 指代的是 全部参数。
传的参数中 必须带着单位。
通过@
来声明参数,通过:
来给参数赋予默认值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 .border (@a :10px,@b :50px,@c :30px,@color :#000){ border :solid 1px @color; box-shadow : @arguments;//指代的是 全部参数 } #main { .border (0px ,5px ,30px ,red);//必须带着单位 } #wrap { .border (0px ); } #content { .border ;//等价于 .border () } #main { border :solid 1px red; box-shadow :0px ,5px ,30px ,red; } #wrap { border :solid 1px #000 ; box-shadow : 0px 50px 30px #000 ; } #content { border :solid 1px #000 ; box-shadow : 10px 50px 30px #000 ; }
方法的匹配模式 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 .triangle (top ,@width :20px,@color :#000){ border-color :transparent transparent @color transparent ; } .triangle (right ,@width :20px,@color :#000){ border-color :transparent @color transparent transparent ; } .triangle (bottom ,@width :20px,@color :#000){ border-color :@color transparent transparent transparent ; } .triangle (left ,@width :20px,@color :#000){ border-color :transparent transparent transparent @color; } .triangle (@_ ,@width :20px,@color :#000){ border-style : solid; border-width : @width; } #main { .triangle (left , 50px , #999 ) } #main { border-color :transparent transparent transparent #999 ; border-style : solid; border-width : 50px ; }
第一个参数left
要会找到方法中匹配程度最高的,如果匹配程度相同,将全部选择,并存在着样式覆盖替换。 如果匹配的参数 是变量,则将会匹配,如@_
。
方法的命名空间 让方法更规范
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 #card (){ background : #723232 ; .d (@w :300px){ width : @w; #a (@h :300px){ height : @h;//可以使用上一层传进来的方法 } } } #wrap { #card > .d > #a (100px ); // 父元素不能加 括号 } #main { #card .d (); } #con { //不得单独使用命名空间的方法 //.d () 如果前面没有引入命名空间 #card ,将会报错 #card ; // 等价于 #card (); .d (20px ); //必须先引入 #card } #wrap { height :100px ; } #main { width :300px ; } #con { width :20px ; }
在CSS
中> 选择器,选择的是儿子元素,就是必须与父元素有直接血源的元素。 在引入命令空间时,如使用>
选择器,父元素不能加括号。 不得单独使用命名空间的方法 必须先引入命名空间,才能使用其中方法。 子方法可以使用上一层传进来的方法
方法的条件筛选 less没有if else
,但是有when
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 #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 ); } #main { border :solid #999 200px ; background :#111 ; font-size :40px ; }
数量不定的参数 如果你的方法接受数量不定的参数可以使用...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 .boxShadow (...){ box-shadow : @arguments; } .textShadow (@a ,...){ text-shadow : @arguments; } #main { .boxShadow (1px ,4px ,30px ,red); .textShadow (1px ,4px ,30px ,red); } #main { box-shadow : 1px 4px 30px red; text-shadow : 1px 4px 30px red; }
方法使用!important
与属性使用!important
一样,在后面加上即可
1 2 3 4 5 6 7 8 9 10 11 12 13 .border { border : solid 1px red; margin : 50px ; } #main { .border () !important; } #main { border : solid 1px red !important ; margin : 50px !important ; }
循环方法 可以通过when
和递归来完成循环
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 .generate-columns (4 );.generate-columns (@n , @i : 1 ) when (@i =< @n) { .column- @{i } { width : (@i * 100% / @n); } .generate-columns (@n , (@i + 1 )); } .column-1 { width : 25% ; } .column-2 { width : 50% ; } .column-3 { width : 75% ; } .column-4 { width : 100% ; }
属性拼接方法 +_
代表空格;+
代表逗号
逗号
1 2 3 4 5 6 7 8 9 10 11 12 .boxShadow () { box-shadow +: inset 0 0 10px #555 ; } .main { .boxShadow (); box-shadow +: 0 0 20px black; } .main { box-shadow : inset 0 0 10px #555 , 0 0 20px black; }
空格
1 2 3 4 5 6 7 8 9 10 11 12 13 .Animation () { transform +_: scale (2 ); } .main { .Animation (); transform +_: rotate (15deg ); } .main { transform : scale (2 ) rotate (15deg ); }
实战技巧 1 2 3 4 5 6 7 8 9 10 11 12 13 14 .average (@x , @y) { @average : ((@x + @y) / 2 ); } div { .average (16px , 50px ); // 调用 方法 padding : @average; // 使用返回值 } div { padding : 33px ; }