Less小总结

Less 是一个Css 预编译器,意思指的是它可以扩展Css语言,添加功能如允许变量(variables),混合(mixins),函数(functions) 和许多其他的技术,让你的Css更具维护性,主题性,扩展性。

Less要CSS语法的基础上进行了扩展,主要包含:Variables,Mixins、Nested Rules、Functions & Operations、Client-side usage、Server-side usage等等

1.变量——Variables


    Less中的变量有以下规则:
    以@作为变量的起始标识,变量名由字母、数字、_和-组成
    没有先定义后使用的规定;
    以最后定义的值为最终值;
    可用于rule值、rule属性、rule属性部件、选择器、选择器部件、字符串拼接;
    定义时 "@变量名: 变量值;" 的形式;引用时采用 "@变量名" 或 "@{变量名}" 的形式;
    存在作用域,局部作用域优先级高于全局作用域。
    

                /*======== 定义变量===========*/
				@color: #4d926f;
				/*======== 应用到元素中 ========*/
				#header {
					color: @color;
				}
				h2 {
					color: @color;
				}
   

Less中的变量还具有计算功能


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

我们还可以定义一个变量名为变量,在Less中的变量实际上就是一个“常量”,因为它们只能被定义一次。后的@color可以覆盖前面的@color


            @color: #253636;
			@highlight: "color";
			#header {color: @@highlight;}
    

混入——Mixins

混入其实就是一种嵌套,它充许你将一个类嵌入到另一个类中,而被嵌入的这个类也称为是一个变量。换句话说,你可以用一个类定义CSS,然后把整个为当作一个变量来使用,嵌入到另一个类中当作他的属性;另外混入也像一个带有参数的functions.这样任何CSS的类或ID下的样式都可以当作变量,使用混入模式用来当作另一个元素的属性值。


                .roundedCorners(@radius:5px) {
					-moz-border-radius: @radius;
					-webkit-border-radius: @radius;
					border-radius: @radius;
				}
				/*========== 定义的类应用到另个一个类中 ===========*/
				#header {
					.roundedCorners; //等同于.roundedCorners();
				}
				#footer {
					.roundedCorners(10px);
				}
    

还有一种方法就是给Mixins不定我任何参数,特别是在你想隐藏输出的CSS规则,但又想在别的规则中包含他的属性,使用这种不带参数的Mixins将非常有用的


                .wrap(){
					text-wrap: wrap;
					white-space: pre-wrap;
					white-space: -moz-pre-wrap;
					word-wrap: break-word;
				}
				pre {
					.wrap; !important; //对pre引用内的都加上 !important
				}
    

                .wrap(){
					text-wrap: wrap;
					white-space: pre-wrap;
					white-space: -moz-pre-wrap;
					word-wrap: break-word;
                   &:hover
                   {
                   color:red;
                   }
				}
				pre {
					.wrap;  //这里 也包含有pre的hover样式
				}
    

        .aa()
        {
            .inn
            {
             color:blue;
            }
        }
        .cc
        {
            .aa > .inn; //可以这样引用,以下都是等价的
            .aa > .inn();
            //.aa.inn();
            //.aa.inn
        }
    

        .mixin(@color) {
          color-1: @color;
        }
        .mixin(@color; @padding:2) {
          color-2: @color;
          padding-2: @padding;
        }
        .mixin(@color; @padding; @margin: 2) {
          color-3: @color;
          padding-3: @padding;
          margin: @margin @margin @margin @margin;
        }
        .some .selector div {
          .mixin(#008000);
        }

        //输出:
        .some .selector div {
        color-1: #008000;
        color-2: #008000;
        padding-2: 2;
        }
        //如果是.mixin(#008000,4);
        //输出:
        .some .selector div {
         color-2: #008000;
         padding-2: 4;
         color-3: #008000;
         padding-3: 4;
         margin: 2 2 2 2;
        } 
    

上面这个不是太好理解,可以使用命名参数


        .mixin(@color: black; @margin: 10px; @padding: 20px) 
        {
          color: @color;
          margin: @margin;
          padding: @padding;
        }
        .class1 {
          .mixin(@margin: 20px; @color: #33acfe);
        }
        .class2 {
          .mixin(#efca44; @padding: 40px);
        }
    

@argument在混合中有特殊的意义,它包含了所有的参数传递。这是有用的,如果你不想处理个别参数


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

对于...的参数形式,表示不定个数的参数


        .mixin(...) {        // matches 0-N arguments
        .mixin() {           // matches exactly 0 arguments
        .mixin(@a: 1) {      // matches 0-1 arguments
        .mixin(@a: 1; ...) { // matches 0-N arguments
        .mixin(@a; ...) {    // matches 1-N arguments
        .mixin(@a; @rest) {  //使用这个变量名后,将这些参数分配给变量。
    

还有一个@switch进行复合利用


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

        @switch:light;
        .class
        {
        .mixin(@switch;#999);
        }
        //得到
        .class {
            color: #a2a2a2;
             display: block;
        }
    

作为函数的混合形式


        .mixin() {
         @width:  100%;  //这个体只是用来定义变量,
         @height: 200px;
        }

        .caller {
         .mixin();
         width:  @width;
         height: @height;
        }
        //得到
        .caller {
         width:  100%;
         height: 200px;
        }
    

         .average(@x, @y) {
          @average: ((@x + @y) / 2);
          }

           div {
           .average(16px, 50px); // "call" the mixin
           padding: @average;    // use its "return" value
         }
        //得到
        div {
        padding: 33px;
        }
    

导入less:标准的css必须提前导入再使用,但less不要求,可以在后面导入


        .foo {
         background: #900;
        }
        @import "dssd/.less";
    

less分支判断
.dd (@a) when (@a){}
.dd (@a) when (@a>=3){...}
.mixin (@a) when (@a > 10), (@a < -10) { ... }
.max (@a; @b) when (@a < @b) { width: @b }
.mixin (@a; @b: 0) when (isnumber(@b)) { ... }
default()函数只是剩余分支的情况
.mixin (@a) when (@a > 0) { ... }
.mixin (@a) when (default()) { ... } // 这里就是 when @a <= 0
when not进行反转
.mixin (@b) when not (@b > 0) { ... }

循环:珊格


        .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%;
        }
    

合并特性:性能够聚合多个属性从而形成一个用逗号分隔的单一属性


        .mixin() {
          box-shadow+: inset 0 0 10px #555;
        }
        .myclass {
          .mixin();
          box-shadow+: 0 0 20px black;
        }

        // 为了避免意外的合并,merge 需要在每个需要合并的属性名后面添加一个 + 以作标示
        // 输出
        .myclass {
            box-shadow: inset 0 0 10px #555, 0 0 20px black;
        }
    

父选择器&


        a 
        {
          color: blue;
          &:hover {
            color: green;
           }
         }
        // 又如
        .button 
        {
            &-ok {
             background-image: url("ok.png");
            }

            &-cancel {
              background-image: url("cancel.png");
            }

            &-custom {
              background-image: url("custom.png");
            }
        }

        //又如
         .link
        {
           & + & {
             color: red;
           }

           & & {
            color: green;
           }

           && {
             color: blue;
           }

           &, &ish {
           color: cyan;
           }
        }
        //等于于
        .link + .link {
             color: red;
            }

            .link .link {
              color: green;
            }

            .link.link {
              color: blue;
            }

            .link, .linkish {
              color: cyan;
            }
    

对于多个&


       .grand 
        {
            .parent 
           {
             & > & {
             color: red;
            }
        }
        //等于于
       .grand .parent > .grand .parent {
             color: red;
            }
    

多项组合


        p,a
        {
        border:1px solid #222;
         &+&
         {
          color:red;
         }
        }
        //等价于
        p,a
        {
        border:1px solid #222;
        }
        p+p
        {
        color:red;
        }
        p+a
        {
        color:red;
        }
        a+p
        {
        color:red;
        }
        a+a
        {
        color:red;
        }
    

继承 &:extend()


        .e:extend(.f) {}
        .e:extend(.g) {}

        //等价于
        .e:extend(.f, .g) {}

        对于
        pre:hover,
          .some-class {
          &:extend(div pre);
        }
        //等价于
        pre:hover:extend(div pre),
        .some-class:extend(div pre) {}

        对于
        .my-inline-block() {
        display: inline-block;
        font-size: 0;
        }
        .thing1 {
         .my-inline-block;
        }
        .thing2 {
        .my-inline-block;
        }

        //输出
        .thing1 {
            display: inline-block;
            font-size: 0;
        }
        .thing2 {
            display: inline-block;
            font-size: 0;
        }
        
        //而这还不是最简的
         .my-inline-block() {
            display: inline-block;
            font-size: 0;
        }
        .thing1 {
           &:extend(.my-inline-block);
        }
        .thing2 {
           &:extend(.my-inline-block);
        }
        //输出
        .my-inline-block,
        .thing1,
        .thing2 {
            display: inline-block;
            font-size: 0;
        }
    

函数

1.杂项函数

1.color:将代表颜色的字符串转换为颜色值.color("#aaa")
2.将数字从一种单位转换到另一种单位

convert(9s, "ms")
convert(14cm, mm)
convert(8, mm)

3.data-uri:将资源内联进样式表

data-uri('../data/image.jpg');
输出: url('data:image/jpeg;base64,bm90IGFjdHVhbGx5IGEganBlZyBmaWxlCg==');
浏览器端输出: url('../data/image.jpg');

4.deafult()

.mixin(1) {x: 11}
.mixin(2) {y: 22}
.mixin(@x) when (default()) {z: @x}

5.unit:删除或更换单位。

unit(5, px) 输出 5px
unit(5em) 输出 5

2.字符串函数

1.escape:对字符串中的特殊字符做 URL-encoding 编码

这些字符不会被编码:,, /, ?, @, &, +, ', ~, ! and $。
被编码的字符是:\<space\>, #, ^, (, ), {, }, |, :, >, <, ;, ], [ and =。

2.%: 格式化占位符
3.replace:用一个字符串替换一段文本。

//字符串 要换的 新的 规则(正则)
replace("Hello, Mars?", "Mars\?", "Earth!");
replace("One + one = 4", "one", "2", "gi");
replace('This is a string.', "(string)\.$", "new $1.");
replace(~"bar-1", '1', '2');

3.列表函数

1.length:返回列表中元素的个数

@list: "banana", "tomato", "potato", "peach";
n: length(@list);

2.extract:返回列表中指定位置的元素。

@list: apple, pear, coconut, orange;
value: extract(@list, 3);

4.数学函数

1.ceil:向上取整。ceil(2.5)=3
2.floor:向下取整。floor(2.5)=2
3.percentage:将浮点数转换为百分比字符串。percentage(0.5)=50%
4.round:四舍五入取整。精度默认为0.round(1.67)=2 round(1.67, 1)=1.7
5.sqrt:计算一个数的平方根,并原样保持单位。sqrt(25cm)=5cm
6.abs:计算数字的绝对值,并原样保持单位。
7.sin:正弦函数。asin/cos/acos/tan/atan
8.pi:返回圆周率 π pi()=3.141592653589793
9.pow:设第一个参数为A,第二个参数为B,返回A的B次方。
10.mod:返回第一个参数对第二参数取余的结果。
11.min:返回一系列值中最小的那个。min(3px, 42px, 1px, 16px)=1px /max

5.类型函数

1.isnumber:如果待验证的值为数字则返回 true ,否则返回 false 。

isnumber(#ff0); // false
isnumber(blue); // false
isnumber("string"); // false
isnumber(1234); // true
isnumber(56px); // true
isnumber(7.8%); // true
isnumber(keyword); // false
isnumber(url(...)); // false

2.isstring:如果待验证的值是字符串则返回 true ,否则返回 false 。

isstring(#ff0); // false
isstring(blue); // false
isstring("string"); // true
isstring(1234); // false
isstring(56px); // false
isstring(7.8%); // false
isstring(keyword); // true
isstring(url(...)); // true

3.iscolor:如果待验证的值为颜色则返回 true ,否则返回 false 。

iscolor(#ff0); // true
iscolor(blue); // true
iscolor("string"); // false
iscolor(1234); // false
iscolor(56px); // false
iscolor(7.8%); // false
iscolor(keyword); // false
iscolor(url(...)); // false

4.iskeyword:如果待验证的值为关键字则返回 true ,否则返回 false 。

iskeyword(#ff0); // false
iskeyword(blue); // false
iskeyword("string"); // false
iskeyword(1234); // false
iskeyword(56px); // false
iskeyword(7.8%); // false
iskeyword(keyword); // true
iskeyword(url(...)); // false

5.isurl:如果待验证的值为 url 则返回 true ,否则返回 false 。

isurl(#ff0); // false
isurl(blue); // false
isurl("string"); // false
isurl(1234); // false
isurl(56px); // false
isurl(7.8%); // false
isurl(keyword); // false
isurl(url(...)); // true

6.ispixel:如果待验证的值为像素数则返回 true ,否则返回 false 。

ispixel(#ff0); // false
ispixel(blue); // false
ispixel("string"); // false
ispixel(1234); // false
ispixel(56px); // true
ispixel(7.8%); // false
ispixel(keyword); // false
ispixel(url(...)); // false

7.isem:如果待验证的值的单位是 em 则返回 true ,否则返回 false 。

isem(#ff0); // false
isem(blue); // false
isem("string"); // false
isem(1234); // false
isem(56px); // false
isem(7.8em); // true
isem(keyword); // false
isem(url(...)); // false

8.ispercentage:如果待验证的值为百分比则返回 true ,否则返回 false 。

ispercentage(#ff0); // false
ispercentage(blue); // false
ispercentage("string"); // false
ispercentage(1234); // false
ispercentage(56px); // false
ispercentage(7.%); // true
ispercentage(keyword); // false
ispercentage(url(...)); // false

9.isunit:如果待验证的值为指定单位的数字则返回 true ,否则返回 false 。

isunit(11px, px); // true isunit(2.2%, px); // false isunit(33px, rem); // false isunit(4rem, rem); // true isunit(56px, "%"); // false isunit(7.8%, '%'); // true isunit(1234, em); // false isunit(#ff0, pt); // false isunit("mm", mm); // false

6.颜色函数

1.rgb/rgba
2.rgnb:创建格式为 #AARRGGBB 的十六进制颜色值 (注意不是 #RRGGBBAA!)

argb(rgba(90, 23, 148, 0.5)),这种格式被用于 IE 、.NET 和 Android 的开发中

3.hsl/hsla:通过色相 (hue),饱和度 (saturation),亮度 (lightness) 三种值 (HSL) 创建不透明的颜色对象

hsl(90, 100%, 50%),hsla(90, 100%, 50%, 0.5)

4.hsv/hsva:通过色相 (hue)、饱和度 (saturation)、色调 (value) 三种值 (HSV) 创建不透明的颜色对象。

hsv(90, 100%, 50%),hsva(90, 100%, 50%, 0.5)

5.red/green/blue:从颜色对象中提取颜色通道值

green(rgb(10, 20, 30))

6.alpha:从颜色对象中提取 alpha 通道值 alpha(rgba(10, 20, 30, 0.5))=0.5
7.saturate/desaturate:增加/减少颜色饱和度 saturate(hsl(90, 80%, 50%), 20%)=#80ff00
8.lighten/darken:增加/减少颜色亮度 lighten(hsl(90, 80%, 50%), 20%)=#b3f075
9.fadeout/fadein:增加/减少透明度fadein(hsla(90, 90%, 50%, 0.5), 10%)=hsla(90, 90%, 50%, 0.6)
10.fade:设置透明度fade(hsl(90, 90%, 50%), 10%)=hsla(90, 90%, 50%, 0.1)
11.spin:在任一方向旋转颜色的色调角 @c: spin(saturate(#aaaaaa, 10%), 10);
12.multiply:正片叠底 multiply(#ff6600, #cccccc);
13.screen:变色/滤色 screen(#ff6600, #666666);
14.overlay:叠加 overlay(#ff6600, #000000);
15.softlight:柔光 softlight(#ff6600, #333333);
16.hardlight:强光 hardlight(#ff6600, #666666);
17.difference:排除 difference(#ff6600, #333333);
18.average:分别对 RGB 的三种颜色值取平均值,然后输出结果。average(#ff6600, #ff0000);

 

posted @ 2017-03-02 14:15  凯帝农垦  阅读(252)  评论(0编辑  收藏  举报