Less学习笔记

Less作为 CSS 的一种扩展,不仅完全兼容 CSS 语法,而且连新增的特性也是使用 CSS 语法,你可以在任何时候回退到 CSS的写法。 大家可以通过以下两个地址,快速的学习Less。

变量

只能定义一次,其本质就是“常量”。

  • 变量的定义:

@nice-blue: #5B83AD; @light-blue: @nice-blue + #111; @div-width: 13px;

  • 变量的使用与编译:

#header { color: @light-blue; width: @div-width; }

编译为:

#header { color: #6c94be; width: 13px; }

混合(Mixin)

  • 混合允许将一个属性集合整块替换到另一个属性集合中。如:

.bordered { border-top: dotted 1px black; border-bottom: solid 2px black; }
我们可以将这个css属性集合,mixin到另一个css属性集中,如:
#menu a { color: #111; .bordered;//或者写为.bordered() } .post a { color: red; .bordered;//或者写为.bordered() }

经过编译后:

#menu a { color: #111; border-top: dotted 1px black;//替换后 border-bottom: solid 2px black;//替换后 } .post a { color: red; border-top: dotted 1px black;//替换后 border-bottom: solid 2px black;//替换后 }

  • 使mixin变量不作为css输出
    只需要添加一对圆括号就可以了,这是该mixin将不被输出在编译后的css文件中,如:

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

编译后:

.my-mixin { color: black; } // 这里不编译输出.my-other-mixin .class { color: black; background: white; }

  • 在mixin中使用选择器selector
    除了处理属性外,mixin还可以使用css选择器,如:

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

编译后:

button:hover {// 定义的伪类选择器hover被应用 border: 1px solid red; }

  • 命名空间
    想如果你想混合属性在一个更复杂的选择器,可以叠放多个id或类。如下:

    #outer {
      .inner {
        color: red;
      }
    }
    .c {
      #outer > .inner;
    }
    

那么,#outer和.c就作为一个命名空间了。对于#outer来说,.inner就作为它的一个属性值,访问的时候可以使用#outer.inner来访问,以下这几种写法是等价的:
// all do the same thing
#outer > .inner;
#outer > .inner();
#outer.inner;
#outer.inner();
举例:
#my-library {
.my-mixin() {
color: black;
}
}
// which can be used like this
.class {
#my-library > .my-mixin();
}
编译为:
.class { color: black; }

  • 关键字!important
    在使用混合属性后面加上!important关键字,则混合中的所有属性都会加上关键字!important。例如:

.foo (@bg: #f5f5f5, @color: #900) { background: @bg; color: @color; } .unimportant { .foo(1); } .important { .foo(2) !important; }

编译后:

.unimportant { background: #f5f5f5; color: #900; } .important { background: #f5f5f5 !important; color: #900 !important; }

带参数的Mixin

  • mixin可以通过括号传递参数,也可以带默认参数:

.border-radius(@radius) { -webkit-border-radius: @radius; -moz-border-radius: @radius; border-radius: @radius; }

编译后

带默认参数:

.border-radius(@radius: 5px) { -webkit-border-radius: @radius; -moz-border-radius: @radius; border-radius: @radius; }
`#header {
.border-radius;//与上图的效果差不错,默认为5px

}`

  • mixin多参数:
    mixin允许带多个参数,也有类似于Java中函数重载的特性:

.mixin(@color) { color-1: @color; } .mixin(@color; @padding:2) { color-2: @color; padding-2: @padding; } .mixin(@color; @padding; @margin: 2) { color-3: @color; padding-3: @padding; margin: @margin @margin @margin @margin; } .some .selector div { .mixin(#008000); }

编译后:

.some .selector div { color-1: #008000; color-2: #008000; padding-2: 2; }

当我们定义相同混合属性名,参数不同,然后.mixin(#008000);调用,第一和第二混合都能匹配,但是第三个缺少参数@padding的值,所以不会引用第三个混合属性。

  • 指定参数名传值

`.mixin(@color: black; @margin: 10px; @padding: 20px) {
color: @color;
margin: @margin;
padding: @padding;
}
.class1 {
.mixin(@margin: 20px; @color: #33acfe);

}
.class2 {
.mixin(#efca44; @padding: 40px);
}`

编译后:

.class1 { color: #33acfe; margin: 20px; padding: 20px; } .class2 { color: #efca44; margin: 10px; padding: 40px; }

关键字@arguments

@arguments有特殊的含义,类似于JavaScript中的arguments,他包含了传递给混合属性的所有参数,如下:

.box-shadow(@x: 0; @y: 0; @blur: 1px; @color: #000) { -webkit-box-shadow: @arguments; -moz-box-shadow: @arguments; box-shadow: @arguments; } .big-block { .box-shadow(2px; 5px); }

编译后:

.big-block { -webkit-box-shadow: 2px 5px 1px #000; -moz-box-shadow: 2px 5px 1px #000; box-shadow: 2px 5px 1px #000; }

关键字@reset

类似于ES6中的剩余参数...,如下:

.mixin(...) { // matches 0-N arguments .mixin() { // matches exactly 0 arguments .mixin(@a: 1) { // matches 0-1 arguments .mixin(@a: 1; ...) { // matches 0-N arguments .mixin(@a; ...) { // matches 1-N arguments
.mixin(@a; @rest...) { // @rest is bound to arguments after @a // @arguments is bound to all arguments }

  • 模式匹配
    有时候,你想让你的mixin可以处理不同的情况,有点类似于switch语句,如下:

.mixin(dark; @color) { color: darken(@color, 10%); } .mixin(light; @color) { color: lighten(@color, 10%); } .mixin(@_; @color) {//通配,这样所有的情况都能拥有display:block这个属性设置 display: block; } //使用该模式匹配 @switch: light; .class { .mixin(@switch; #888); }

编译后:

.class { color: #a2a2a2; display: block; }

作为函数使用的Mixin

当我们把混合当做函数使用时,在调用函数之后,函数中的变量是可以使用的,除非调用混合属性的元素自己也定义了同样的变量。比如:

.mixin() { @width: 100%; @height: 200px; } .caller { .mixin(); width: @width; height: @height; }

编译后:

.caller { width: 100%; height: 200px; }

作为表达式使用

.average(@x, @y) { @average: ((@x + @y) / 2); } div { .average(16px, 50px); // "call" the mixin padding: @average; // use its "return" value }

编译后:

`div {

padding: 33px;
}`

import指令

具体可以参看文档:http://less.bootcss.com/features/#import-directives-feature

Mixin Gurads

带条件的mixin,使用关键字when来定义不同的条件。具体可以参看文档:http://less.bootcss.com/features/#mixin-guards-feature

CSS Guards

同理,css也可以使用guards,它标志在选择器之后,也是使用关键字when,如下:

.my-optional-style() when (@my-option = true) { button { color: white; } } .my-optional-style(); //也可以直接在css样式上写guards button when (@my-option = true) { color: white; }

更多可以参看http://less.bootcss.com/features/#css-guards-feature

循环

在 Less 中,mixin 可以被自己调用。当这种递归形式的 mixin 与 Guard ExpressionsPattern Matching 一起联合使用的话,就可以创造出各种迭代/循环结构。如下就是一个用于生成 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%; }

合并

merge 特性能够聚合多个属性从而形成一个用逗号分隔的单一属性。merge 对于像 background 和 transform 这类属性非常有用。为了避免意外的合并,merge 需要在每个需要合并的属性名后面添加一个 + 以作标示。

.mixin() { box-shadow+: inset 0 0 10px #555; } .myclass { .mixin(); box-shadow+: 0 0 20px black; }

合并后:

.myclass { box-shadow: inset 0 0 10px #555, 0 0 20px black; }

父选择符

&用于指代父选择器以及当前规则的别名,如下:

`a {
color: blue;

&:hover {
color: green;
}
}
//规则的别名
.button {
&-ok {
background-image: url("ok.png");
}
&-cancel {
background-image: url("cancel.png");
}
&-custom {
background-image: url("custom.png");
}
}`

编译后:

a { color: blue; } a:hover { color: green; } //规则的别名,这里代表button .button-ok { background-image: url("ok.png"); } .button-cancel { background-image: url("cancel.png"); } .button-custom { background-image: url("custom.png"); }

  • Multiple &
    &可以出现多次,比如:

.link { & + & { color: red; } & & { color: green; } && { color: blue; } &, &ish { color: cyan; } }

编译后:

.link + .link { color: red; } .link .link { color: green; } .link.link { color: blue; } .link, .linkish { color: cyan; }

更多关于&的请参考文档:http://less.bootcss.com/features/#features-overview-feature-nested-rules

内置函数

关于Less的内置函数,可以参看文档http://less.bootcss.com/functions/#functions-overview

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

推荐阅读更多精彩内容

  • 编译器 koala 编译器创建一个 style 文件夹,在其中创建 .less 文件,将文件夹拖入 koala 编...
    _月光临海阅读 301评论 0 0
  • 简介 CSS(层叠样式表)是一门历史悠久的标记性语言,同 HTML 一道,被广泛应用于万维网(World Wide...
    老夫的天阅读 1,925评论 1 29
  • 一 在我家楼的对面里,有一个女孩,一个胆子很小的女孩,女孩子一般都很胆小,这并不奇怪,但是她的胆子就是出乎意料的胆...
    李不通阅读 1,303评论 4 38
  • [这些是个人关于同理心的总结与思考,仅代表个人观点,欢迎讨论] 如果你连你的用户都不了解,还怎么去挖掘他们的需求?...
    阿池范范阅读 1,211评论 0 4
  • 坐在长夜里 就是坐在书房里 一点萤是一本书 一本书是一个梦 坐在书房里 就是坐在长夜里 坐在长夜里 就是坐在太空里...
    喵喵僧阅读 398评论 1 5