less

作者: 回凉_4161 | 来源:发表于2018-08-20 22:52 被阅读0次
CSS预处理器

CSS预处理器定义了一种新的语言,基本的思想是用一种专门的编程语言,开发者只需要使用这种语言进行编码工作,减少枯燥无味的CSS代码的编写过程的同时,它能让你的CSS具备更加简洁、适应性更强、可读性更加、层级关系更加明显、更易于代码的维护等诸多好处。

常用的有三门CSS预处理器语言:Sass、Less 、Stylus :

  • Sass 诞生于 2007 年,Ruby 编写,其语法功能都十分全面,可以说 它完全把 CSS 变成了一门编程语言。号称世界上最成熟、最稳定、最强大的专业级CSS扩展语言,默认使用 .sass 扩展名。
  • Less 诞生于 2009 年,受Sass的影响创建的一个开源项目。 它扩充了 CSS 语言,增加了诸如变量、混合(mixin)、函数等功能,让 CSS 更易维护、方便制作主题、扩充(引用于官网),默认使用 .less 扩展名。。
  • Stylus 诞生于 2010 年,是一个基于Node.js的CSS的预处理框架,其本质上做的事情与 Sass/LESS 等类似, 可以以近似脚本的方式去写CSS代码,创建健壮的、动态的、富有表现力的CSS,默认使用 .styl 的作为文件扩展名,支持多样性的CSS语法

安装引用

npm install -g less
lessc index.less index.css
或者
<link rel="stylesheet/less" type="text/css" href="index.less" />
<script src="less.js" type="text/javascript"></script>

语法特性

Variables(变量)

你可以把反复使用的css属性值定义成变量,然后通过变量名来引用它们,而无需重复书写这一属性值。以@开头定义变量,并且使用时直接键入@名称。

@themes: "../../src/themes";  //Import statements (导入语句)
@import "@{themes}/index.less"; //使用@import (reference)导入外部文件,但不会把导入的文件编译到最终输出中,只引用。

@primaryColor: #5B83AD;
@selector: #header;  //Selectors (选择器)
@nav: header;
@images: "../img";  //URLs
@property: height;  //Properties (属性)
@fnord:  "I am fnord.";  //Variable Names (变量名)
@var:  "fnord";

@{selector} {//变量名 必须使用大括号包裹
  color: @primaryColor;
}
.@{nav} {
  color: @primaryColor;
  background: url("@{images}/white-sand.png");
}
#@{nav} {
  color: @primaryColor;
  @{property}: 60px;
  &::after{
     content: @@var; //将@var替换为其值 content:@fnord;
   }
}

//编译后
#header {
  color: #5B83AD;
}
.nav{
  color: #5B83AD;
  background: url("../img/white-sand.png");
}
#nav {
  color: #5B83AD;
  height: 60px;
}
#nav::after{
    content: "I am fnord.";
}

变量运算:任何数值,颜色和变量都可以进行运算。

@base: 5%;
@filler: @base * 2;
@other: @base + @filler;
@base-color: #333;

color: #888 / 4;
background-color: @base-color + #111;
height: 100% / 2 + @filler;

变量的延迟加载:变量是延迟加载的,在使用前不一定要预先声明。

.lazy-eval-scope {
  width: @var;
  @a: 9%;
}
@var: @a;
@a: 100%;

// 编译后
.lazy-eval-scope {
  width: 9%;
}
//在定义一个变量两次时,只会使用最后定义的变量,Less会从当前作用域中向上搜索。这个行为类似于CSS的定义中始终使用最后定义的属性值。

变量的作用域:Less 中的作用域与编程语言中的作用域概念非常相似。首先会在局部查找变量和混合,如果没找到,编译器就会在父作用域中查找,依次类推。

@var: red;

#page {
  @var: white;
  #header {
    color: @var; // white
  }
}

Nested rules (嵌套规则)

它模仿了 HTML 的结构,父子节点关系一目了然,省去了大量的parent元素

#header {
  color: black;
  .navigation {
    font-size: 12px;
  }
  .clearfix {
    display: block;
    zoom: 1;
   //(& 表示当前选择器的父选择器)
    &:after {
      content: " ";
      display: block;
      font-size: 0;
      height: 0;
      clear: both;
      visibility: hidden;
    }
  }
}

// 编译后
#header {
  color: #5B83AD;
}
#header .navigation {
  font-size: 12px;
}
#header .clearfix {
  display: block;
  zoom: 1;
}
#header .clearfix:after {
  content: " ";
  display: block;
  font-size: 0;
  height: 0;
  clear: both;
  visibility: hidden;
}

Mixins (混合)

.bordered {
  border-top: dotted 1px black;
  border-bottom: solid 2px black;
}
.marginTop10 {
   margin-top: 10px;
}
#menu a {
  color: #111;
  .bordered; // 等价于.bordered();
  .marginTop10() !important;
}

//在调用的混合集后面追加 !important 关键字,可以使混合集里面的所有属性都继承 !important:

// 编译后
#header {
  color: #5B83AD;
  border-top: dotted 1px black;
  border-bottom: solid 2px black;
  margin-top: 10px !important;
}

Namespaces (命名空间):如果你想要将属性混合到比较复杂的选择器中,你可以通过嵌套多层id或者class。

#outer {
  .inner {
    color: red;
  }
}
.c {
  #outer > .inner;
// 下面四种写法效果是一样的
// #outer > .inner;
// #outer > .inner();
// #outer.inner;
// #outer.inner();
}

Not outputting the mixin(不输出混合集):如果你想要创建一个混合集,但是却不想让它输出到你的样式中,你可以在混合集的名字后面加上一个括号。

.my-mixin {
  color: black;
}
.my-other-mixin() {
  background: white;
}
.class {
  .my-mixin;
  .my-other-mixin;
}
// 编译后
.my-mixin {
  color: black;
}
.class {
  color: black;
  background: white;
}

Selectors in mixins (带选择器的混合集):混合集不仅可以包含各种属性,而且可以包括各种选择器。

.my-hover-mixin() {
  &:hover {
    border: 1px solid red;
  }
}
button {
  .my-hover-mixin();
}
// 编译后
button:hover {
  border: 1px solid red;
}

Parametric Mixins (带参数的混合):Less 可以使用默认参数,如果没有传参数,那么将使用默认参数。
@arguments在mixins内部有特殊意义,调用mixin时,它包含所有传入的参数。

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

Mixin Guards:带条件的mixins,Less 没有 if else,可是它有 when

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

Loops (循环)

在Less中,混合可以调用它自身。这样,当一个混合递归调用自己,再结合Guard表达式和模式匹配这两个特性,就可以写出循环结构。

.loop(@counter) when (@counter > 0) {
  .loop((@counter - 1));    // 递归调用自身
  width: (10px * @counter); // 每次调用时产生的样式代码
}

div {
  .loop(5); // 调用循环
}
//编译后
div {
  width: 10px;
  width: 20px;
  width: 30px;
  width: 40px;
  width: 50px;
}

// 使用递归循环最常见的情况就是生成栅格系统的CSS:
.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%;
}

Extend (扩展)

extend是一个Less伪类,它会合并它所在的选择器和它所匹配的引用。

.inline {
  color: red;
  .a {
    width: 20px;
  }
}
nav ul {
  &:extend(.inline);
  &:extend(.inline .a);
}

// 编译后
.inline {
  color: red;
}
.inline  .a {
  width: 20px;
}
nav ul {
  color: red;
  width: 20px;
}

Extend syntax (扩展语法)
使用关键字all选择

.c:extend(.d all) {
  // 扩展".d"的所有实例,比如".x.d"或者".d.x"
}
.a.b.test,
.test.c {
  color: orange;
}
.test {
  &:hover {
    color: green;
  }
}

.replacement:extend(.test all) {}

// 编译后
.a.b.test,
.test.c,
.a.b.replacement,
.replacement.c {
  color: orange;
}
.test:hover,
.replacement:hover {
  color: green;
}

Functions (函数)

Less 提供了许多用于转换颜色,处理字符串和进行算术运算的函数。

@base: #f04615;
@width: 0.5;

.class {
  width: percentage(@width); //50%
  color: saturate(@base, 5%); //饱和度增加了 5%
  background-color: spin(lighten(@base, 25%), 8); //亮度增加了 25%,色相值增加 8
}
注释
/* 这种注释会被编译 */
@var: red;

// 这种注释不会被编译
@var: white;

创建一个demo

由于浏览器端使用时是使用ajax来拉取.less文件,因此直接在本机文件系统打开(即地址是file://开头)或者是有跨域的情况下会拉取不到.less文件,导致样式无法生效。所以启动一个本地服务器来进行:

npm i -D gulp gulp-connect
touch gulpfile.js

vim gulpfile.js

var gulp = require('gulp');
var connect = require('gulp-connect');

gulp.task('webserver', function () {
    connect.server({
        livereload: true,
        port: 2000
    });
});

gulp.task('default', ['webserver']);

相关文章

  • web前端学习线路图2

    十二、LESS教程 Less教程Less 安装Less 嵌套规则Less 操作Less 转义Less 函数 Les...

  • Vue项目使用less

    1 先下载less less-loader: npm i less less-loader -S 2 将less配...

  • vue使用less

    npm安装 less less-loader npm install --save less less-loade...

  • Less的使用

    Less使用 1.什么是less 2.less有什么用 3.怎么使用less 4.less批量生成代码 less简...

  • Sql-labs-page3

    less-38 (堆叠注入) 堆叠注入讲解 less-39 解题链接 less-40 less-41 less-...

  • 第十三周第一天笔记之less

    less知识 简书链接less使用总结:less基础知识less使用总结2:less使用总结 单位px,em,re...

  • less的介绍

    less是什么? less是css云处理器 全局安装less包 查看less是否安装成功 less完全兼容css ...

  • LESS/SASS学习记录

    LESS 参考资料:LESS官网w3cplus less入门教程 less的编译 less特性及语法 变量——V...

  • React脚手架如何支持less 2018-06-13

    1. 安装less、less-loader依赖包 a. yarn安装 yarn add less less-loa...

  • vue-cli 常见问题

    安装 less 和 less-loader ,在项目目录下运行如下命令 npm install less less...

网友评论

      本文标题:less

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