Less 教程

Less 教程

前言

CSS的短板

作为前端学习者的我们都要学些 CSS ,它作为前端开发的三大基石之一,时刻引领着 Web 的发展潮向。 而 CSS 作为一门标记性语言,可能给初学者第一印象就是简单易懂,毫无逻辑,不像编程该有的样子。在语法更新时,每当新属性提出,浏览器的兼容又会马上变成绊脚石,可以说 CSS 短板不容忽视。问题的诞生往往伴随着技术的兴起, 在 Web 发展的这几年, 为了让 CSS 富有逻辑性,短板不那么严重,涌现出了 一些神奇的预处理语言。 它们让 CSS 彻底变成一门 可以使用 变量 、循环 、继承 、自定义方法等多种特性的标记语言,逻辑性得以大大增强。

预处理语言:Sass、Less 、Stylus 。

  1. Sass 诞生于 2007 年,Ruby 编写,其语法功能都十分全面,可以说它完全把 CSS 变成了一门编程语言。另外 在国内外都很受欢迎,并且它的项目团队很是强大 ,是一款十分优秀的预处理语言。
  2. Stylus 诞生于 2010 年,来自Node.js 社区,语法功能也和 Sass 不相伯仲,是一门十分独特的创新型语言。
  3. Less 诞生于 2009 年,受Sass的影响创建的一个开源项目。 它扩充了 CSS 语言,增加了诸如变量、混合(mixin)、函数等功能,让 CSS 更易维护、方便制作主题、扩充。

什么是LESS?

Less是一种动态样式语言;为提高css应用的灵活性和效率,LESS 将 CSS 赋予了动态语言的特性,如 变
量, 继承, 运算, 函数。LESS 既可以在 客户端 上运行 (支持IE 6+, Webkit, Firefox),也可以借助
Node.js在服务端运行

LESS是一个CSS预处理器,可以为网站启用可自定义,可管理和可重用的样式表。 LESS是一种动态样式表语言,扩展了CSS的功能。
CSS预处理器是一种脚本语言,可扩展CSS并将其编译为常规CSS语法,以便可以通过Web浏览器读取。 它提供诸如变量,函数, mixins 和操作等功能,可以构建动态CSS。

为什么要使用LESS?

LESS支持创建更清洁,跨浏览器友好的CSS更快更容易。
LESS是用JavaScript设计的,并且创建在 live 中使用,其编译速度比其他CSS预处理器更快。
LESS保持你的代码以模块化的方式,这是非常重要的,通过使其可读性和容易改变。
可以通过使用LESS 变量来实现更快的维护。

优点

LESS轻松地生成可在浏览器中工作的CSS。
LESS使您能够使用嵌套编写更干净,组织良好的代码。
通过使用变量可以更快地实现维护。
LESS使您能够通过在规则集中引用它们来轻松地重用整个类。
LESS提供使用操作,使得编码更快并节省时间。

缺点

学习如果你是新的CSS预处理需要时间。
由于模块之间的紧密耦合,应当采取更多的努力来重用和/或测试依赖模块。
与旧的预处理器(例如Sass)相比,LESS具有较少的框架,Sass由框架 Compass , Gravity和 Susy 组成。

安装easy less

cfc2893c29154d29a4d238d24636cb05.png
0a844fcba151416db6fd5cc5a394516d.png
0f109d872e404e9bb3e70e173c036061.png
8eaffa2f2b4e4423b485ec0557c56a1a.png
c8ab0cc745da49368124c5ff337cfac3.png

Less 变量

变量作为 Less 的一个强大的功能,它可以让我们像在其它高级语言中一样声明变量,这样我们将重复出现的颜色,尺寸,选择器,字体名称和 URL 等存储起来。
LESS允许使用 @ 符号定义变量。 变量分配使用冒号(:)完成。
LESS中声明变量的格式为“@变量名:变量值”。
下表详细说明了使用LESS 变量。

使用场景及类型

  • 值变量
  • 选择器变量
  • 属性名变量
  • URL 变量
  • 声明变量
  • 变量运算

// 定义属性常规
@color1: red;
.div1 {
  background-color: @color1;
}
.div2 {
  background-color: @color1;
}

// 选择器名插值
@head: h;
.@{head} {
  font-size: 16px;
}

// 属性名插值
@my-property: color;
.myclass {
  background-@{my-property}: #81f7d8;
}

// URL插值
@host: 'http://www.waibo.wang/';
h2 {
  color: @color1;
  background: url('@{host}img/bg.png');
}

// import插值
@host: 'http://www.waibo.wang/';
@import '@{host}/reset.less';

Less 继承

Extend 是 Less 语法中的一个伪类,它可以继承所匹配的全部样式。
Extend 是为了解决样式表中重复的样式,这一点与其它语言中的继承功能相似。
Extend 主要用于复用重复的样式类,可附加在选择器上或放置到样式集中。

使用场景及类型

  • 选择器上使用
  • 单样式类
  • 多个样式类
  • ‘all’ 关键字
  • 声明变量
  • 变量运算

// 1.常规
nav {
  &:extend(.line);
  background: blue;
}

.line {
  color: red;
}

// 2.附加在选择器上使用 <selector>:extend(<extendSelector>) { }
.b {
  color: red;
}

.a:extend(.b) {
  background: blue;
}

// 3.在样式集中使用
// <selector> {
//  &:extend(<extendSelector>);
// }
.c {
  &:extend(.d);
}

.d {
  color: red;
}

// 4.继承多个样式类
.style1 {
  &:extend(.style2,
  .style3);
}

.style2 {
  color: red;
}

.style3 {
  background-color: red;
}

// 5.继承中的 ‘all’ 关键字
.a {
  &:extend(.b all);
}

.b {
  color: red;
  .c {
    background: #8a2be2;
  }
}

总结

  • 利用重复代码
  • 减小CSS代码体积

混合

“mix-in” 的中文翻译为 “混合” 。简而言之,在 Less 中 Mixins 的作用就是,在已有的样式中添加其他已经定义好的属性集合,从而达到属性复用的效果。

使用场景及类型

  • 选择器中的样式
  • 选择器伪类
  • 多!important 关键字的 Mixins
  • 不输出 Mixins 源码
  • Mixins 命名空间
  • 变量运算

// mixin
.a {
  color: red;
}

.mixin {
  .a();
}

// 选择器的 Mixins
.hover-mixin {
  &:hover {
    border: 1px solid red;
  }
}

button {
  .hover-mixin();
}

// 包含 !important 关键字的 Mixins
.color {
  color: red;
  background: blue;
}

.background {
  .color() !important;
}

// 不输出 Mixins 源码 ()区分
.color-mixin() {
  //加上()
  color: red;
}

.bg {
  .color-mixin();
}

// 命名空间

// .namespace > .bg;
// .namespace > .bg();
// .namespace .bg;
// .namespace .bg();
// .namespace.bg;
// .namespace.bg();
.namesapce {
  .bg() {
    color: red;
  }
}

.content {
  .namesapce > .bg(); //调用
}


代码解释:使用 Mixins 前提是需要先定义一个样式类(.a),然后在引用的样式类(.mixin-class)中写入之前定义的样式类名称,并在名称后加上 “()” 来表示一个 Minxins 。我们可以把 Mixins 当作一个样式的集合,同样后面需要加上 “;” ,避免造成语法错误。

总结

定义的 Mixins 名称后面如果不加 “()” ,则会编译到生成的 css 中,反之则不会。
引用的 Mixins 名称后的 “()” 可以省略,但是为了避免代码混淆,建议大家在引用时加上 ‘()’
  .a {
    color: red;
  }

  .b {
    // .a() 或者 .a 都可以
    .a();
  }

  ## 区别

  本章节主要介绍了 Mixins 在样式复用方面的内容,在该功能上与上一个章节讲到的 :extend() 比较类似 ,如果复用的代码不用出现在编译后的代码中,推荐使用 Mixins 进行代码的复用,反之使用 :extend() 比较好。

  混合的本质是拷贝,只是减少了less文件中的冗余代码,并没有减少css文件中的冗余
  继承的本质是并集选择器,减少了css中的代码

参数混合(Parametric Mixins)

含有传入参数的 Mixins 。

// 设置默认参数
.circle(@radius: 5px) {
  border-radius: @radius;
}

button {
  .circle();
}

// 多参数
.primary(@color; @padding; @margin: 2px) {
  color: @color;
  padding: @padding;
  margin-top: @margin;
}

button {
  .primary(#ffffff; 5px);
}

// 参数顺序
.mixin(@color: black; @margin: 10px; @padding: 20px) {
  color: @color;
  margin: @margin;
  padding: @padding;
}

.primary {
  .mixin(@margin: 20px; @color: #33acfe);
}

.success {
  // 第一个参数未填写参数名称,所以代表的是 @color
  // 第二个参数名称为 @padding ,所以说 @margin 参数未传入会取默认值
  .mixin(#efca44; @padding: 40px);
}

// @argument 变量
.box-shadow(@x: 0; @y: 0; @z: 1px; @color: #000) {
  box-shadow: @arguments;
}

button {
  .box-shadow(2px; 5px);
}

// 匹配
.img(@color) {
  bgckground: @color;
}

.img(@color; @padding: 2px) {
  color: @color;
  padding: @padding;
}

div {
  .img(#000);
}


总结

本章节主要学习了 Mixins 参数使用的几种方式,这几种方式与 ES6 中函数的参数思想较为类似,有默认参数、@argument、剩余参数等,熟练应用可以使你的 Mixins 灵活性更强,但是一定要注意两个同名 Mixins 之间的覆盖问题,为 Mixins 加上命名空间可以防止类似的问题发生。

Less 混合函数 Mixins as Functions

Mixins 可以作为一个函数使用返回参数或者一个新的 Mixins

Mixins 不仅可以对样式表进行复用,它也可以看作是一个函数。

类似于 JS 等编程语言中函数,它也具有函数的诸多特征,比如传入参数、返回参数等。

比如我们需要声明一个函数返回 @width、@height 两个变量,我们可以这样定义一个 Mixins 。


// 无参
.return() {
  @width: 80%;
  @height: 20px;
}
.callback {
  .return();
  width: @width;
  height: @height;
}

// 返回参数
.img(@line, @row) {
  @width: ((@row+ @line) / 2);
}

img {
  .img(20px, 50px); // 引入 mixin
  width: @width; // 使用返回值(@width)
}

// 返回 Mixins
.return-mixins(@color; @size) {
  .mixins() {
    //返回 mixins
    background: @color;
    font-size: @size;
  }
}

.id {
  .return-mixins(red; 28px);
  .mixins(); //引用返回的 mixins
}


总结

混合函数返回值时可以处理传入的参数,对参数进行一系列复杂的参数处理。

混合函数返回 Mixins 时注意需要先调用混合函数,才能调用返回的 Mixins

样式导入

通过导入指令引入其他样式表的内容

导出并不需要特殊的语法,但是导入需要我们使用 @import 语法并加上文件名称。此外导入机制仅编译我们用到的代码,并不会编译多余的代码。

类似于原生 CSS 语法的导入指令,在 Less 中我们也是通过 @import 指令引入其他样式表。

比如引入normal.less文件:


@import './normal.less';

.apple {
  background: yellow;
}

.apple {
  background: palegreen !important;
}
@import './normal.less';

@import './normal';
@import './normal.less';


https://mobile.ant.design/zh/components/button/

小结

  • 文件导入顺序

  • 优先级设置

  • 重名函数

  • 组件库样式重写

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,716评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,558评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,431评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,127评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,511评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,692评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,915评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,664评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,412评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,616评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,105评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,424评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,098评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,096评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,869评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,748评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,641评论 2 271

推荐阅读更多精彩内容