美文网首页
2019-03-26-less与css编译

2019-03-26-less与css编译

作者: 满天繁星_28c5 | 来源:发表于2019-04-25 11:34 被阅读0次

    一、 Css预编译

    参考网址:https://segmentfault.com/a/1190000012360995?utm_source=tag-newest
    常见的css预编译器有三种:less 、 sass 、 stylus。

    Bootstrop使用的是less。

    二、 Less

    Less是一门css预处理语言,他扩展了css语言,增加了变量、Mixin、函数等特性,使css更容易维护和扩展。他不是一个直接使用的语言,而是一个生成css的语言。Less可以运行在Node或浏览器端。

    Css计算:cacl()

    三、 使用方法

    1.Node环境的使用方法

    QQ截图20190326085206.jpg

    2.浏览器环境

    1) 引入less文件,类似于css文件,单类型不一样。

    <Link rel=”stylesheet/less”  type=”text/css”  href=”style.less”/>
    

    2) 引入解析less的less.js

    <script src=”less.js” type =”text/javascript”></script>
    <script src="cdnjs.cloudflare.com/ajax/libs/less.js/3.8.1/less.min.js" ></script>  
    

    下载地址:https://raw.github.com/less/less.js/v2.5.3/dist/less.min.js

    四、 快速起步

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>Document</title>
    <link rel="stylesheet/less" href="1.less">
    <!-- <script src="less.js"></script> -->
    
    <script src="cdnjs.cloudflare.com/ajax/libs/less.js/3.8.1/less.min.js" ></script>
    </head>
    <body>
    <div></div>
    </body>
    </html>
    

    1.变量

    1) 普通变量

    less 以@开头定义变量,并且使用时直接键入@名称。注意:作为属性值的变量不能添加大括号("{}")

    @color:#333;

    Div{

    Background:@color;

    }

    Less其变量只能定义一次,不能重复定义,否则后面的会类似与js的变量提升,覆盖前面的变量。

    使用变量设置css,也方便代码的维护。

    2) 选择器变量

    选择器变量

    让选择器变成一个动态的。

    作为选择器的变量在使用的时候需要添加大括号("{}"),变量的前面可以添加选择操作符。

     /* Less */
          @mySelector: #wrap;
          @Wrap: wrap;
          @{mySelector}{ //变量名 必须使用大括号包裹
            color: #999;
            width: 50%;
          }
          .@{Wrap}{
            color:#ccc;
          }
          #@{Wrap}{
            color:#666;
          }  
          /* 生成的 CSS */
          #wrap{
            color: #999;
            width: 50%;
          }
          .wrap{
            color:#ccc;
          }
          #wrap{
            color:#666;
          }
    

    3) 属性变量

    可以让我在书写的时候少写很多内容,属性变量使用的时候也需要添加大括号("{}")。

     /* Less */
    
          @borderStyle: border-style;
    
          @Soild:solid;
    
          #wrap{
    
    @{borderStyle}: @Soild;//变量名 必须使用大括号包裹
    
          }
    
          /* 生成的 CSS */
    
          #wrap{
    
            border-style:solid;
    
          }
    

    4) Url变量

    项目结构改变时,可以方便我们修改,目的是为了方便项目的维护。

    /* Less */
    
          @images: "../img";//需要加引号
    
          body {
    
            background: url("@{images}/dog.png");//变量名 必须使用大括号包裹
    
          }
    
          /* 生成的 CSS */
    
          body {
    
            background: url("../img/dog.png");
    
          }
    

    5) 申明变量

    格式:

    定义:@name:{
    Key:value;
    Key:value;
    }
    使用:@name();
    

    案例:

    /* Less */
          @background: {background:red;};
          #main{
              @background();
          }
          @Rules:{
              width: 200px;
              height: 200px;
              border: solid 1px red;
          };
          #con{
            @Rules();
          }
        
          /* 生成的 CSS */
          #main{
            background:red;
          }
          #con{
            width: 200px;
            height: 200px;
            border: solid 1px red;
          }
    

    6) 变量运算

    规则:

    加减法时,以第一个数据的单位为基准。

    乘除法时,注意单位一定要统一。

    案例:

     /* Less */
    
          @width:300px;
    
          @color:#222;
    
          #wrap{
    
            width:@width-20;
    
            height:@width-20*5;
    
            margin:(@width-20)*5;
    
            color:@color*2;
    
            background-color:@color + #111;
    
          }
    
          /* 生成的 CSS */
    
          #wrap{
    
            width:280px;
    
            height:200px;
    
            margin:1400px;
    
            color:#444;
    
            background-color:#333;
    
          }
    

    7) 变量的作用域

    就近原则,不是指代码的位置,而是指代码的层级结构。

    如果是同一级后面的生效,类似于提升。

    不同级的变量,距离最近的生效。距离是指定义时的位置。

    8) 用变量的定义变量

    解析的顺序是从后向前主城解析。

      /* Less */
    
          @fnord:  "I am fnord.";
    
          @var:    "fnord";
    
          #wrap::after{
    
            content: @@var; //将@var替换为其值 content:@fnord;
    
          }
    
          /* 生成的 CSS */
    
          #wrap::after{
    
            content: "I am fnord.";
    
          }
    

    2.嵌套

    1) &符号,表示的是上1级选择器的名字。

      /* Less */
    
          #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{ width:200px; height:200px; background:red; .show{ display: none; } } .show{ display: block; //只有在div使用的时候被覆盖 }
    ~~

    3.媒体查询

    之前媒体查询的格式是:先分屏然后在每一个媒体查询中设置样式。

    @media only screen and {max-width:1200px;}{
    
    Div{}
    
    }
    
    @media only screen and  {min-width:992px;}{
    
    Div{}
    
    }
    
    @media only screen and {min-width:768px}{
    
    Div{}
    
    }
    

    less提供给我们更加方便的方式:

    /* Less */
    
          #main{
              //something...
              @media screen{
                  @media (max-width:768px){
                    width:100px;
                  }
              }
              @media tv {
                width:2000px;
              }
          }
          /* 生成的 CSS */
          @media screen and (max-width:768px){
            #main{
                width:100px;
            }
          }
          @media tv{
            #main{
              width:2000px;
            }
          }
    
    • 唯一缺点:每一个元素都会编译出自己@media声明,并不会合并

    4.方法

    1) 无参数方法 方法如声明的集合,使用值直接键入名称即可。

    要点:“.”与“#”都可以作为方法前缀。可以不适用小括号,但是为了避免css格式混淆,建议加上小括号“()”。

    .card(){
    //something....
    }
    #wrap{
    .card();
    }
    

    2) 具体参数方法

    Less可以传递参数

    width:200px;
    height:200px;
    .setSize(@width_size,@height_size){
    width:@width_size;
    height:@height_size;
    }
    形成css:
    div{
    .setSize(200px,300px);
    }
    

    3) 默认参数方法

    Less 可以使用默认参数,如果没有传参数,那么将使用默认参数。
    @arguments 犹如 JS 中的 arguments 指代的是全部参数。 传的参数中 必须带着单位。

    /* Less */
          .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()
          }    
          /* 生成的 CSS */
          #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;
          }
    

    4) 不定参

    不确定参数的个数

    案例:

     /* Less */
          .boxShadow(...){
              box-shadow: @arguments;
          }
          .textShadow(@a,...){
              text-shadow: @arguments;
          }
          #main{
              .boxShadow(1px,4px,30px,red);
              .textShadow(1px,4px,30px,red);
          }
          /* 生成后的 CSS */
          #main{
            box-shadow: 1px 4px 30px red;
            text-shadow: 1px 4px 30px red;
          }
    

    5) 方法的匹配模式

    类似于多态。有点类似于switch case

    同一个方法名的多个方法,由于传入的参数不同而实现不同的功能。

    案例:

      /* Less */
          .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)
          }
          /* 生成的 CSS */
          #main{
            border-color:transparent  transparent  transparent #999;
            border-style: solid;
            border-width: 50px;
          }
    

    6) 方法的命名空间

    有一个嵌套关系

     /* Less */
    
          #card(){
    
              background: #723232;
    
              .d(@w:300px){
    
                  width: @w;
    
                  #a(@h:300px){
    
                      height: @h;//可以使用上一层传进来的方法
    
                      width: @w;
    
                  }
    
              }
    
          }
    
          #wrap{
    
              #card > .d > #a(100px); // 父元素不能加 括号
    
          }
    
          #main{
    
              #card .d();
    
          }
    
          #con{
    
              //不得单独使用命名空间的方法
    
              //.d() 如果前面没有引入命名空间 #card ,将会报错
    
              #card; // 等价于 #card();
    
              .d(20px); //必须先引入 #card
    
          }
    
          /* 生成的 CSS */
    
          #wrap{
    
            height:100px;
    
            width:300px;
    
          }
    
          #main{
    
            width:300px;
    
          }
    
          #con{
    
            width:20px;
    
          }
    

    案例2

    .div{
    background:red;
    .size(@width){
    width:@width;
    height:200px;
    border:1px solid #ccc;
    .a(@height){
    height:@height;
    width:@width;
    }
    }
    }
    
    a{
    display: block;
    .div>.size(200px);
    .a(200px);
    }
    

    在 CSS 中> 选择器,选择的是儿子元素,就是必须与父元素有直接血源的元素。 - 在引入命令空间时,如使用 > 选择器,父元素不能加括号。 - 不得单独使用命名空间的方法必须先引入命名空间,才能使用其中方法。 - 子方法可以使用上一层传进来的方法

    7) 条件语句

    Less没有if / else 但是less具有一个when,and,not与“,”语法。

     /* Less */
    
        #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;
    
        }
    

    8) 条件运算符

    比较运算有:> >= = =< <

    =代表是等于

    除去关键字true以外的值其他都会被默认为fales

    9) 循环语法

    Less并没有提供一个for等循环的方法但是可以使用递归的方法实现。

    案例:

    /* Less */
    
          .generate-columns(4);
    
          .generate-columns(@n, @i: 1) when (@i =< @n) {
    
            .column-@{i} {
    
              width: (@i * 100% / @n);
    
            }
    
            .generate-columns(@n, (@i + 1));
    
          }
    
          /* 生成后的 CSS */
    
          .column-1 {
    
            width: 25%;
    
          }
    
          .column-2 {
    
            width: 50%;
    
          }
    
          .column-3 {
    
            width: 75%;
    
          }
    
          .column-4 {
    
            width: 100%;
    
          }
    

    10) 方法中的important

    方法使用了important,相当于这个方法中的每一个属性都设置了一遍important,不允许覆盖。

     /* Less */
          .border{
              border: solid 1px red;
              margin: 50px;
          }
          #main{
              .border() !important;
          }
          /* 生成后的 CSS */
          #main {
              border: solid 1px red !important;
              margin: 50px !important;
          }
    

    5.Less注释

    Less的注释语法类似于js

    //单行注释

    /* ---*/多行注释

    6.属性的拼接语法

    +代表的是逗号,+_代表的是空格。

    1) 空格

    案例:

     /* Less */
          .Animation() {
            transform+_: scale(2);
          }
          .main {
            .Animation();
            transform+_: rotate(15deg);
          }
        
          /* 生成的 CSS */
          .main {
            transform: scale(2) rotate(15deg);
          }
    

    2) 逗号

    /* Less */
    
          .boxShadow() {
    
              box-shadow+: inset 0 0 10px #555;
    
          }
    
          .main {
    
            .boxShadow();
    
            box-shadow+: 0 0 20px black;
    
          }
    
          /* 生成后的 CSS */
    
          .main {
    
            box-shadow: inset 0 0 10px #555, 0 0 20px black;
    
          }
    

    7.继承

    Exterd是less的一个伪类。它可以继承所匹配声明中的全部样式。

    案例:

      /* Less */
          .animation{
              transition: all .3s ease-out;
              .hide{
                transform:scale(0);
              }
          }
          #main{
              &:extend(.animation);
          }
          #con{
              &:extend(.animation .hide);
          }
        
          /* 生成后的 CSS */
          .animation,#main{
            transition: all .3s ease-out;
          }
          .animation .hide , #con{
              transform:scale(0);
          }
    

    1)All全局搜索替换
    用以匹配方法匹配到的所有的声明。
    案例:

    /* Less */
          #main{
            width: 200px;
          }
          #main {
            &:after {
              content:"Less is good!";
            }
          }
          #wrap:extend(#main all) {}
        
          /* 生成的 CSS */
          #main,#wrap{
            width: 200px;
          }
          #main:after, #wrap:after {
              content: "Less is good!";
          }
    

    2)扩展的注意事项
    选择器和扩展之间 是允许有空格的: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关键字。
    8.导入
    在less文件中可以引入其他的less文件。使用关键字import。
    1)导入less文件可以省略后缀
    Import ”index.less”;
    Import “index”
    2)@import可以放置在任何地方。
    案例:

    mian{

    Font-size:15px;
    }
    @import ”7.less”
    

    3)Reference
    Less中最强的特性
    引入一个less文件但是不会编译它。

    @import(reference)“bootstrap.Less”;
    #wrap:extend(.navbar all){}
    

    使用@import(reference)导入外部文件,只能在less中使用,注意是为了继承和方法,最终编译的时候里面的内容不会产生less
    4)Once
    @import语句的默认行为。这表明相同的文件只会被导入一次,而随后的导入文件在的重要代码都不会解拆。

    @import (once) "foo.less";@import (once) "foo.less"; // this statement will be ignored
    

    5)Multiple
    使用@import (multiple)允许导入多个同名文件。
    案例:

    * Less */
       
    // file: foo.less
    .a {
      color: green;
    }
    // file: main.less
    @import (multiple) "foo.less";
    @import (multiple) "foo.less";
       
    /* 生成后的 CSS */
    .a {
      color: green;
    }
    .a {
      color: green;
    }
    

    9.避免编译
    基本语法:
    ~’值
    案例

       /* Less */
          #main{
            width:~'calc(300px-30px)';
          }
        
          /* 生成后的 CSS */
          #main{
            width:calc(300px-30px);
          }
    

    10.less中可以使用js
    Less本身是使用较少实现的,所以在less中就可以使用js。
    Js的代码写在字符串模板里 ‘ 这里 ’。
    案例:

       /* Less */
          @content:`"aaa".toUpperCase()`;
          #randomColor{
            @randomColor: ~"rgb(`Math.round(Math.random() * 256)`,`Math.round(Math.random() * 256)`,`Math.round(Math.random() * 256)`)";
          }
          #wrap{
            width: ~"`Math.round(Math.random() * 100)`px";
            &:after{
                content:@content;
            }
            height: ~"`window.innerHeight`px";
            alert:~"`alert(1)`";
            #randomColor();
            background-color: @randomColor;
          }
          /* 生成后的 CSS */
        
          // 弹出 1
          #wrap{
            width: 随机值(0~100)px;
            height: 743px;//由电脑而异
            background: 随机颜色;
          }
          #wrap::after{
            content:"AAA";
          }
    

    五、less的函数
    1.判断类型
    Isnumber():判断是否为数字
    Iscolor():判断是否为颜色
    Isurl():判断是否为路径
    2.颜色操作

    Saturate > 增加一定数值的颜色饱和度。

    Lighten > 增加一定数值的颜色亮度。

    Darken > 降低一定数值的颜色亮度。

    Fade > 给颜色设定一定数值的透明度。

    Mix > 根据比例混合两种颜色。

    3.数字函数

    Ceil > 向上取整。

    Floor > 向下取整。

    Percentage > 将浮点数转换为百分比字符串。

    Round > 四舍五入。

    Sqrt > 计算一个数的平方根。

    Abs > 计算数字的绝对值,原样保持单位。

    Pow > 计算一个数的乘方。

    Less函数参考网址参考http://lesscss.cn/functions/
    Less函数参考手册网址:https://www.w3cschool.cn/less/namespaces_accessors.html

    相关文章

      网友评论

          本文标题:2019-03-26-less与css编译

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