Less不可小觑

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

写在前面

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

Less的诞生
Less属于预编译脚本,一起被熟知的还有与Sass、Stylus。

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

直接开干

变量

  • 值变量
/* Less */
@color: #000;
#wrap {
  color: @color;
}

/* 生成后的 CSS */
#wrap {
  color: #000;
}

说明:
以 @ 开头 定义变量,使用时 直接 键入 @名称。
在平时工作中,我们就可以把 常用的变量 封装到一个文件中,这样利于代码组织维护。

  • 选择器变量
/* Less */
  @mySelector: #wrap;
  @Wrap: wrap;
  @{mySelector} { // 变量名 必须使用大括号包裹
    color: #999;
    width: 50%;
  }
  #@{Wrap} {
    color: #666;
  }


  /* 生成的 CSS */
  #wrap {
    color: #999;
    width: 50%;
  }
  #wrap {
    color: #666;
  }
  • 属性变量
/* Less */
  @borderStyle: border-style;
  @Soild: solid;
  #wrap {
    @{borderStyle}: @Soild;
  }


  /* 生成的 CSS */
  #wrap {
    border-style: solid;
  }
  • url变量
/* Less */
  @images: "xxx/xxx/img"; // 需加引号
  body {
    background: url("@{images}/dog.png");
  }


  /* 生成的 CSS */
  body {
    background: url("../img/dog.png");
  }
  • 声明变量
 /* 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;
  }

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

  • 变量运算
/* Less */
  @width: 300px;
  @color: #222;
  #wrap {
    width: @width-20;
    height: @width-20 * 5;
    color: @color * 2;
  }


  /* 生成的 CSS */
  #wrap {
    width: 280px;
    height: 200px;
    color: #444;
  }

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

  • 变量作用域
/* Less */
  @var: @a;
  @a: 100%;
  #wrap {
    width: @var;
    @a: 9%;
  }


  /* 生成的 CSS */
  #wrap {
    width: 9%;
  }

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

  • 用变量去定义变量
/* Less */
  @text: "I am fnord.";
  @var: "text";
  #wrap {
    &:after {
      content: @@var;
  }


  /* 生成的 CSS */
  #wrap::after {
    content: "I am fnord.";
  }

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

嵌套

  • &符
/* Less */
  #header {
    font-weight: bold;
    &_content {
      margin: 20px;
    }
  }


  /* 生成的 CSS */
  #header {
    font-weight: bold;
  }

  #header_content {
    margin: 20px;
  }
  • 设置默认参数
/* 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;
  }

说明:

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

方法的匹配模式

/* 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 要会找到方法中匹配程度最高的,如果匹配程度相同,将全部选择,并存在着样式覆盖替换。

运算符

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

/* Less */
  .border {
    border: solid 1px red;
  }

  #main {
    .border() !important;
  }


  /* 生成后的 CSS */
  #main {
    border: solid 1px red !important;
  }

循环方法

 /* 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%;
  }
@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的方法还有很多,属性拼接、继承等等,可以带来很便捷的样式交互开发,时间有限,暂举例这么多,一起探索吧。

相关文章
|
安全 物联网
12人,挑战行业头号难题!
大赛作品抢先看!
339 1
12人,挑战行业头号难题!
|
安全 算法 数据建模
关键信息基础设施保护——网络安全不容小觑
沃通国密SSL证书采用了我国自主研发的SM2公钥算法体系,支持SM2、SM3、SM4等国产密码算法及国密SSL安全协议,助力保障关键信息基础设施安全。
946 0
关键信息基础设施保护——网络安全不容小觑
|
机器学习/深度学习 传感器 数据采集
“碳达峰、碳中和”,垃圾焚烧面临危机or转机?
全国人大代表、中国工程院院士彭寿认为,“碳中和”意味着能源结构转型需要技术加持,“如何说把传统的能源进行高质量使用,用一些战略性新兴能源来代替它,这里面是有一种技术的革命,而不是简单的数字相加。”
“碳达峰、碳中和”,垃圾焚烧面临危机or转机?
|
人工智能
关店,绝不是传统零售业的唯一出路
我们正处在科技大爆发的时代,随着技术的快速发展,我们具备了构建物理世界与Cyber世界之间无缝链接的能力,AI算法的快速演进令大量数据沉淀变得意义可读、可预测,又反向促进了可测量数据维度的几何级增长。
3793 0
|
新零售 物联网
移动医疗:商业可持续性低,越做越亏
预约挂号、支付诊疗费、查看检查报告……这些程序都可以不需要排长队、在手机上就可以完成。智慧医疗兴起,移动医疗市场不断吸引着各方投资,很多互联网公司纷纷投资布局,将其视为互联网上的“下一个金矿”。 然而,喧嚣之下,移动医疗真的管用吗?未来移动互联医疗产业的前景如何,是否真的能破解中国的“看病难”问题?
1513 0