Less不可小觑

发布时间 2023-12-07 16:18:12作者: 一杯龙井解千愁

 

写在前面

CSS的短板

在语法更新时,每当新属性提出,浏览器的兼容问题就会成为一大烦恼。

Less的诞生

Less属于预编译脚本,一起被熟知的还有与SassStylus

Less 诞生于 2009 年,受Sass的影响创建的一个开源项目。 它扩充了 CSS 语言,增加了诸如变量、混合(mixin)、函数等功能,让 CSS 更易维护、方便制作主题、扩充。

 

 

直接开干

变量

值变量

TypeScript

/* Less */

@color: #000;

#wrap {

  color: @color;

}

 

/* 生成后的 CSS */

#wrap {

  color: #000;

}

说明

开头 定义变量,使用时 直接 键入 @名称。

在平时工作中,我们就可以把 常用的变量 封装到一个文件中,这样利于代码组织维护。

 

 

选择器变量

TypeScript

/* Less */

  @mySelector: #wrap;

  @Wrap: wrap;

  @{mySelector} { // 变量名 必须使用大括号包裹

    color: #999;

    width: 50%;

  }

  #@{Wrap} {

    color:#666;

  }

 

  /* 生成的 CSS */

  #wrap {

    color: #999;

    width: 50%;

  }

  #wrap {

    color:#666;

  }

 

属性变量

TypeScript

/* Less */

  @borderStyle: border-style;

  @Soild: solid;

  #wrap {

    @{borderStyle}: @Soild;

  }

 

  /* 生成的 CSS */

  #wrap {

    border-style: solid;

  }

 

url 变量

TypeScript

 /* Less */

  @images: "xxx/xxx/img"; // 需加引号

  body {

    background: url("@{images}/dog.png");

  }

 

  /* 生成的 CSS */

  body {

    background: url("../img/dog.png");

  }

 

声明变量

TypeScript

  /* Less */

  @background: {background:red;};

  @Rules:{

    width: 200px;

    height: 200px;

    border: solid 1px red;

  };

  #main{

    @Rules();

    @background();

  }

 

  /* 生成的 CSS */

  #main{

    width: 200px;

    height: 200px;

    border: solid 1px red;

    background: red;

  }

说明

将可复用的样式最小单元化、模块化,减少代码量。

 

 

变量运算

TypeScript

/* Less */

  @width: 300px;

  @color: #222;

  #wrap{

    width: @width-20;

    height: @width-20 * 5;

    color: @color * 2;

    

  }

 

  /* 生成的 CSS */

  #wrap{

    width: 280px;

    height: 200px;

    color: #444;

    

  }

说明

  • 加减法时,以第一个变量为基准;
  • 乘除法时,单位要统一。

 

变量作用域

TypeScript

/* Less */

  @var: @a;

  @a: 100%;

  #wrap {

    width: @var;

    @a: 9%;

  }

 

  /* 生成的 CSS */

  #wrap {

    width: 9%;

  }

说明

由于less的就近原则,@a 被新的覆盖了。

 

用变量去定义变量

TypeScript

/* Less */

  @text: "I am fnord.";

  @var: "text";

  #wrap::after{

    content: @@var;

  }

  /* 生成的 CSS */

  #wrap::after{

    content: "I am fnord.";

  }

说明

由于 @var 的变量值与 @text重名,@var 等同于 @text

 

 

嵌套

&

TypeScript

/* Less */

  #header {

    font-weight: bold;

    &_content {

      margin: 20px;

    }

  }

  /* 生成的 CSS */

  #header {

    font-weight: bold;

  }

  #header_content {

    margin: 20px;

  }

 

 

设置默认参数

TypeScript

/* Less */

  .border(@a: 10px, @b: 50px, @c: 30px, @color: #000) {

    border: solid 1px @color;

    box-shadow: @arguments; // 指代的是 全部参数

  }

  #main {

    .border(0px, 5px, 30px, red);

  }

  #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;

  }

说明

Less 可以使用默认参数,如果 没有传参数,那么将使用默认参数。

@arguments 犹如 JS 中的 arguments 指代的是 全部参数。

传的参数中 必须带着单位。

 

方法的匹配模式

TypeScript

/* Less */

  .borderStyle(left, @width: 20px, @color: #000) {

    border-color: transparent transparent transparent @color;

  }

  .borderStyle(@_, @width: 20px, @color: #000) {

    border-style: solid;

    border-width: @width;

  }

  #main {

    .borderStyle(left, 50px, #999)

  }

  /* 生成的 CSS */

  #main {

    border-color: transparent transparent transparent #999;

    border-style: solid;

    border-width: 50px;

  }

说明

面向对象中的多态 很相似。

第一个参数 left 要会找到方法中匹配程度最高的,如果匹配程度相同,将全部选择,并存在着样式覆盖替换。

 

运算符

TypeScript

/* 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;

    }

 

TypeScript

 /* 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;

  }

说明

对于数量不定的参数:

如果希望方法接受数量不定的参数,可以使用... ,犹如 ES6 的扩展运算符。

 

方法使用important

TypeScript

/* Less */

  .border {

    border: solid 1px red;

  }

  #main {

    .border() !important;

  }

  /* 生成后的 CSS */

  #main {

    border: solid 1px red !important;

  }

 

 

循环方法

TypeScript

    /* Less */

  .style-columns(2);

 

  .style-columns(@n, @i: 1) when (@i =< @n) {

    .column-@{i} {

      width: (@i * 100% / @n);

    }

    .style-columns(@n, (@i + 1));

  }

  

  /* 生成后的 CSS */

  .column-1 {

    width: 25%;

  }

  .column-2 {

    width: 50%;

  }

 

TypeScript

@color: {

  activity: #ed7f8b;

  seminars: @theme-color;

  course: #ffa757;

};

/** 遍历变量 @color */

each(@color, {

  .@{key} {

    

    .tag-wrap {

      color: @value;

      

    }

    .content-wrap {

      &:before {

      /** @{key} 需加花括号 */

        background: url('@assets/image/teaching-calendar/card-bg-@{key}@2x.png');

      }

    }

  }

});

说明

对于循环,也可以用 each 去遍历,使用@key@value时,记得有时需要加花括号。

 

写在结尾

less的方法还有很多,属性拼接、继承等等,可以带来很便捷的样式交互开发,时间有限,暂举例这么多,一起探索吧