一种 动态 样式 语言.

LESS 将 CSS 赋予了动态语言的特性,如 变量继承运算函数. LESS 既可以在 客户端 上运行 (支持IE 6+, Webkit, Firefox),也可以借助Node.js或者Rhino在服务端运行。

version 1.3.3

Write some LESS:

@base: #f938ab;

.box-shadow(@style, @c) when (iscolor(@c)) {
  box-shadow:         @style @c;
  -webkit-box-shadow: @style @c;
  -moz-box-shadow:    @style @c;
}
.box-shadow(@style, @alpha: 50%) when (isnumber(@alpha)) {
  .box-shadow(@style, rgba(0, 0, 0, @alpha));
}
.box { 
  color: saturate(@base, 5%);
  border-color: lighten(@base, 30%);
  div { .box-shadow(0 0 5px, 30%) }
}

Compile to CSS:

npm install -g less
lessc styles.less styles.css

变量

变量允许我们单独定义一系列通用的样式,然后在需要的时候去调用。所以在做全局样式调整的时候我们可能只需要修改几行代码就可以了。

  // LESS

@color: #4D926F;

#header {
  color: @color;
}
h2 {
  color: @color;
}
/* 生成的 CSS */

#header {
  color: #4D926F;
}
h2 {
  color: #4D926F;
}

混合

混合可以将一个定义好的class A轻松的引入到另一个class B中,从而简单实现class B继承class A中的所有属性。我们还可以带参数地调用,就像使用函数一样。

// LESS

.rounded-corners (@radius: 5px) {
  border-radius: @radius;
  -webkit-border-radius: @radius;
  -moz-border-radius: @radius;
}

#header {
  .rounded-corners;
}
#footer {
  .rounded-corners(10px);
}
/* 生成的 CSS */

#header {
  border-radius: 5px;
  -webkit-border-radius: 5px;
  -moz-border-radius: 5px;
}
#footer {
  border-radius: 10px;
  -webkit-border-radius: 10px;
  -moz-border-radius: 10px;
}

嵌套规则

我们可以在一个选择器中嵌套另一个选择器来实现继承,这样很大程度减少了代码量,并且代码看起来更加的清晰。

// LESS

#header {
  h1 {
    font-size: 26px;
    font-weight: bold;
  }
  p { font-size: 12px;
    a { text-decoration: none;
      &:hover { border-width: 1px }
    }
  }
}

/* 生成的 CSS */

#header h1 {
  font-size: 26px;
  font-weight: bold;
}
#header p {
  font-size: 12px;
}
#header p a {
  text-decoration: none;
}
#header p a:hover {
  border-width: 1px;
}

函数 & 运算

运算提供了加,减,乘,除操作;我们可以做属性值和颜色的运算,这样就可以实现属性值之间的复杂关系。LESS中的函数一一映射了JavaScript代码,如果你愿意的话可以操作属性值。

// LESS

@the-border: 1px;
@base-color: #111;
@red:        #842210;

#header {
  color: @base-color * 3;
  border-left: @the-border;
  border-right: @the-border * 2;
}
#footer { 
  color: @base-color + #003300;
  border-color: desaturate(@red, 10%);
}

/* 生成的 CSS */

#header {
  color: #333;
  border-left: 1px;
  border-right: 2px;
}
#footer { 
  color: #114411;
  border-color: #7d2717;
}

Client-side usage

客户端在线编译的方式是入门和开发的最好方式。但是如果你是在产品中使用,请使用预编译的方式编译成css后在线使用。

引入 .less 样式文件的时候要设置 rel 属性值为 “stylesheet/less”:

<link rel="stylesheet/less" type="text/css" href="styles.less">

然后点击页面顶部download按钮下载 less.js, 在<head> 中引入:

<script src="less.js" type="text/javascript"></script>

注意你的less样式文件一定要在引入less.js前先引入。

备注:请在服务器环境下使用!本地直接打开可能会报错!

如果有需要你可以通过在less.js前设置一个全局less对象来自定义编译过程。E.g.

<script type="text/javascript">
    less = {
        env: "development", // or "production"
        async: false,       // load imports async
        fileAsync: false,   // load imports async when in a page under 
                            // a file protocol
        poll: 1000,         // when in watch mode, time in ms between polls
        functions: {},      // user functions, keyed by name
        dumpLineNumbers: "comments", // or "mediaQuery" or "all"
        relativeUrls: false,// whether to adjust url's to be relative
                            // if false, url's are already relative to the
                            // entry less file
        rootpath: ":/a.com/"// a path to add on to the start of every url 
                            //resource
    };
</script>
<script src="less.js" type="text/javascript"></script>

监视模式

监视模式是客户端的一个功能,这个功能允许你当你改变样式的时候,客户端将自动刷新。

要使用它,只要在URL后面加上'#!watch',然后刷新页面就可以了。另外,你也可以通过在终端运行less.watch()来启动监视模式。

调试模式

It is possible to output rules in your css which allow tools to locate the source of the rule.

Either specify the option dumpLineNumbers as above or add !dumpLineNumbers:mediaQuery to the url.

You can use the “comments” option with FireLESS and the “mediaQuery” option with FireBug/Chrome dev tools (it is identical to the SCSS media query debugging format).

服务端使用方法

安装

在服务器端安装 LESS 的最简单方式就是通过 npm(node 的包管理器), 像这样:

$ npm install less

终端命令行下使用方法

你可以在终端调用 LESS 解析器:

$ lessc styles.less

上面的命令会将编译后的 CSS 传递给 stdout, 你可以将它保存到一个文件中:

$ lessc styles.less > styles.css

如何你想将编译后的 CSS 压缩掉,那么加一个 -x 参数就可以了.If you would like more involved minification, the YUI CSS Compressor is also available with the --yui-compress option.

可以通过在终端直接run lessc(不带参数)查看完整命令行参数.

编码中的使用方法

只要安装了 LESS,就可以在Node中像这样调用编译器:

var less = require('less');

less.render('.class { width: 1 + 1 }', function (e, css) {
    console.log(css);
});

上面会输出

.class {
  width: 2;
}

你也可以手动调用解析器和编译器:

var parser = new(less.Parser);

parser.parse('.class { width: 1 + 1 }', function (err, tree) {
    if (err) { return console.error(err) }
    console.log(tree.toCSS());
});

配置

你可以向解析器传递参数:

var parser = new(less.Parser)({
    paths: ['.', './lib'], // Specify search paths for @import directives
    filename: 'style.less' // Specify a filename, for better error messages
});

parser.parse('.class { width: 1 + 1 }', function (e, tree) {
    tree.toCSS({ compress: true }); // Minify CSS output
});

第三方工具

工具汇总(有工具推荐请加群联系飞长添加)

koala一款桌面编译工具,完美兼容Win,Linux,Mac

语法

LESS 做为 CSS 的一种形式的扩展,它并没有阉割 CSS 的功能,而是在现有的 CSS 语法上,添加了很多额外的功能,所以学习 LESS 是一件轻而易举的事情,果断学习之!

变量

很容易理解:

@nice-blue: #5B83AD;
    @light-blue: @nice-blue + #111;

    #header { color: @light-blue; }

输出:

#header { color: #6c94be; }

甚至可以用变量名定义为变量:

@fnord: "I am fnord.";
    @var: 'fnord';
    content: @@var;

解析后:

content: "I am fnord.";

请注意 LESS 中的变量为完全的 ‘常量’,所以只能定义一次。

混合

在 LESS 中我们可以定义一些通用的属性集为一个 class,然后在另一个 class 中去调用这些属性,下面有这样一个 class:

.bordered {
    border-top: dotted 1px black;
    border-bottom: solid 2px black;
    }

那如果我们现在需要在其他 class 中引入那些通用的属性集,那么我们只需要在任何 class 中像下面这样调用就可以了:

#menu a {
    color: #111;
    .bordered;
    }
    .post a {
    color: red;
    .bordered;
    }

.bordered class 里面的属性样式都会在 #menu a.post a 中体现出来:

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

任何 CSS class, id 或者 元素 属性集都可以以同样的方式引入。

带参数混合

在 LESS 中,你还可以像函数一样定义一个带参数的属性集合:

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

然后在其他 class 中像这样调用它:

#header {
    .border-radius(4px);
    }
    .button {
    .border-radius(6px);
    }

我们还可以像这样给参数设置默认值:

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

所以现在如果我们像这样调用它的话:

#header {
    .border-radius;
    }

radius 的值就会是 5px。

你也可以定义不带参数属性集合,如果你想隐藏这个属性集合,不让它暴露到 CSS 中去,但是你还想在其他的属性集合中引用,你会发现这个方法非常的好用:

.wrap () {
    text-wrap: wrap;
    white-space: pre-wrap;
    white-space: -moz-pre-wrap;
    word-wrap: break-word;
    }

    pre { .wrap }

输出:

pre {
    text-wrap: wrap;
    white-space: pre-wrap;
    white-space: -moz-pre-wrap;
    word-wrap: break-word;
    }

@arguments 变量

@arguments包含了所有传递进来的参数。 如果你不想单独处理每一个参数的话就可以像这样写:

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

将会输出:

  box-shadow: 2px 5px 1px #000;
    -moz-box-shadow: 2px 5px 1px #000;
    -webkit-box-shadow: 2px 5px 1px #000;

高级参数用法与 @rest 变量

如果需要在 mixin 中不限制参数的数量,可以在变量名后添加 ...,表示这里可以使用 N 个参数。

.mixin (...) {        // 匹配 0-N 个参数
    .mixin () {           // 不匹配任何参数
    .mixin (@a: 1) {      // 匹配 0-1 个参数
    .mixin (@a: 1, ...) { // 匹配 0-N 个参数
    .mixin (@a, ...) {    // 匹配 1-N 个参数

此外:

.mixin (@a, @rest...) {
    // @rest 表示 @a 之后的参数
    // @arguments 表示所有参数
    }

Pattern-matching and Guard expressions

LESS 提供了通过参数值控制 mixin 行为的功能,让我们先从最简单的例子开始:

.mixin (@s, @color) { ... }

    .class {
    .mixin(@switch, #888);
    }

如果要根据 @switch 的值控制 .mixin 行为,只需按照下面的方法定义 .mixin

.mixin (dark, @color) {
    color: darken(@color, 10%);
    }
    .mixin (light, @color) {
    color: lighten(@color, 10%);
    }
    .mixin (@_, @color) {
    display: block;
    }

现在运行:

@switch: light;

    .class {
    .mixin(@switch, #888);
    }

将会得到以下 CSS:

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

导入给 .mixin 的颜色将执行 lighten 函数,如果 @switch 的值是 dark,那么则会执行 darken 函数输出颜色。

以下是整个过程如何发生的:

  • 第一条 mixin 没有匹配,因为不满足 dark 条件;
  • 第二条 mixin 可以被匹配,因为它满足了 light 条件;
  • 第三条 mixin 也可以被匹配,因为它接受任何参数。

只有满足匹配要求的 mixin 才可以被使用。变量可以使用任何值,而变量之外的参数只有它们的值完全相等时才可以匹配成功。

我们也可以根据参数的数量进行匹配,比如:

.mixin (@a) {
    color: @a;
    }
    .mixin (@a, @b) {
    color: fade(@a, @b);
    }

调用 .mixin 时,如果使用了一个参数,输出第一条 .mixin,使用了两个参数,则输出第二条。

Guards

与上面匹配值,或者参数数量的情况不同,Guards 被用来匹配表达式 (expressions)。如果你很熟悉编程函数的用法,相信你已经掌握它的用法了。

为了尽可能地符合 CSS 的语言结构,LESS 选择使用 guarded mixins (类似于 @media 的工作方式)执行条件判断,而不是加入 if/else 声明。

首先通过下面的例子开始介绍:

.mixin (@a) when (lightness(@a) >= 50%) {
    background-color: black;
    }
    .mixin (@a) when (lightness(@a) < 50%) {
    background-color: white;
    }
    .mixin (@a) {
    color: @a;
    }

要点在于关键词 when,它引入了一条 guard 条件 (这里只用到一个 guard)。现在如果运行下面的代码:

.class1 { .mixin(#ddd) }
    .class2 { .mixin(#555) }

将会得到以下输出结果:

.class1 {
    background-color: black;
    color: #ddd;
    }
    .class2 {
    background-color: white;
    color: #555;
    }

Guards 支持的运算符包括:> >= = =< <。说明一下,“true”关键字是唯一被判断为真的值,它使这两个mixin相等:

.truth (@a) when (@a) { ... }
    .truth (@a) when (@a = true) { ... }

其他不等于 true 的值是无效的:

.class {
    .truth(40); // 不会匹配上面的 mixin
    }

Guards 通过 ‘,’ 逗号表示分隔,如果 guards 的结果为 true,匹配成立:

.mixin (@a) when (@a > 10), (@a < -10) { ... }

注意:也可以比较参数,或者不设定参数:

@media: mobile;

    .mixin (@a) when (@media = mobile) { ... }
    .mixin (@a) when (@media = desktop) { ... }

    .max (@a, @b) when (@a > @b) { width: @a }
    .max (@a, @b) when (@a < @b) { width: @b }

如果需要根据值的类型 (value type) 匹配 mixin,可以使用 is* 函数:

.mixin (@a, @b: 0) when (isnumber(@b)) { ... }
    .mixin (@a, @b: black) when (iscolor(@b)) { ... }

几个检查基本类型的函数:

  • iscolor
  • isnumber
  • isstring
  • iskeyword
  • isurl

如果需要检查一个值,准确的说是数字使用了哪个单位,可以使用下面三个函数:

  • ispixel
  • ispercentage
  • isem

最后,你可以使用关键词 and 在 guard 中加入额外的条件:

.mixin (@a) when (isnumber(@a)) and (@a > 0) { ... }

或者,使用关键词 not 否定条件:

.mixin (@b) when not (@b > 0) { ... }

嵌套规则

LESS 可以让我们以 嵌套 的方式编写层叠样式。 让我们先看下下面这段 CSS:

#header { color: black; }
    #header .navigation {
    font-size: 12px;
    }
    #header .logo {
    width: 300px;
    }
    #header .logo:hover {
    text-decoration: none;
    }

在 LESS 中, 我们就可以这样写:

#header {
    color: black;

    .navigation {
    font-size: 12px;
    }
    .logo {
    width: 300px;
    &:hover { text-decoration: none }
    }
    }

或者这样写:

#header        { color: black;
    .navigation  { font-size: 12px }
    .logo        { width: 300px;
    &:hover    { text-decoration: none }
    }
    }

代码更简洁了,而且感觉跟 DOM 结构格式有点像。

注意 & 符号的使用 — 如果你想写串联选择器,而不是写后代选择器,就可以用到 & 了。这点对伪类尤其有用如 :hover:focus

例如:

.bordered {
    &.float {
    float: left;
    }
    .top {
    margin: 5px;
    }
    }

会输出:

.bordered.float {
    float: left;
    }
    .bordered .top {
    margin: 5px;
    }

嵌套 Media Queries

Media queries 允许像选择器那样进行嵌套。

.one {
    @media (width: 400px) {
    font-size: 1.2em;
    @media print and color {
    color: blue;
    }
    }
    }

输出:

@media (width: 400px) {
    .one {
    font-size: 1.2em;
    }
    }
    @media (width: 400px) and print and color {
    .one {
    color: blue;
    }
    }

& 的高级用法

嵌套的外层含有多个选择器的情况下,& 符号可以交替输出他们的顺序。

例如:

.child, .sibling {
    .parent & {
    color: black;
    }
    & + & {
    color: red;
    }
    }

输出:

.parent .child,
    .parent .sibling {
    color: black;
    }
    .child + .child,
    .child + .sibling,
    .sibling + .child,
    .sibling + .sibling {
    color: red;
    }

& 也可以用在 mixin 中表示嵌套这个 mixin 的父选择器。

运算

任何数字、颜色或者变量都可以参与运算,来看一组例子:

@base: 5%;
    @filler: @base * 2;
    @other: @base + @filler;

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

LESS 的运算已经超出了我们的期望,它能够分辨出颜色和单位。如果像下面这样单位运算的话:

@var: (1px + 5);

LESS 会输出 6px

括号也同样允许使用:

width: ((@var + 5) * 2);

并且可以在复合属性中进行运算:

border: (@width * 2) solid black;

函数

LESS 提供了多种函数用于控制颜色变化、处理字符串、算术运算等等。这些函数会在下面的函数列表部分详细介绍。

函数的用法非常简单,下面这个例子将介绍如何将 0.5 转换为 50%;颜色饱和度增加 5%;以及颜色亮度降低 25% 色相值增加 8 等用法:

@base: #f04615;
    @width: 0.5;

    .class {
    width: percentage(0.5); // returns `50%`
    color: saturate(@base, 5%);
    background-color: spin(lighten(@base, 25%), 8);
    }

命名空间

有时候,你可能为了更好组织 CSS 或者单纯是为了更好的封装,将一些变量或者混合模块打包起来,你可以像下面这样在 #bundle 中定义一些属性集之后可以重复使用:

#bundle {
    .button () {
    display: block;
    border: 1px solid black;
    background-color: grey;
    &:hover { background-color: white }
    }
    .tab { ... }
    .citation { ... }
    }

你只需要在 #header a 中像这样引入 .button

#header a {
    color: orange;
    #bundle > .button;
    }

作用域

LESS 中的作用域跟其他编程语言非常类似,首先会从本地查找变量或者混合模块,如果没找到的话会去父级作用域中查找,直到找到为止。

@var: red;

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

    #footer {
    color: @var; // red
    }

注释

CSS 的注释格式在 LESS 中是依然保留的:

/* Hello, I'm a CSS-style comment */
    .class { color: black }

LESS 同样也支持双斜线的注释,但是编译成 CSS 的时候自动过滤掉:

// Hi, I'm a silent comment, I won't show up in your CSS
    .class { color: white }

Importing

你可以在 main 文件中通过下面的格式导入 .less 文件, .less 后缀可带可不带:

@import "lib.less";
    @import "lib";

如果你想导入一个 CSS 文件而且不想 LESS 对它进行处理,只需要使用 .css 后缀就可以:

@import "lib.css";

这样 LESS 就会跳过它不去处理它。

为了避免重复导入文件,使用 @import-once 限制文件只允许被导入一次。

@import-once "lib.less";
    @import-once "lib.less"; // will be ignored

LESS 1.4.0 版将默认执行 @import-once

字符串插值

变量可以用类似 ruby 和 php 的方式嵌入到字符串中,像 @{name} 这样的结构:

@base-url: "http://assets.fnord.com";
    background-image: url("@{base-url}/images/bg.png");

避免编译

有时候我们需要输出一些不正确的 CSS 语法或者使用一些 LESS 不认识的专有语法。

要输出这样的值我们可以在字符串前加上一个 ~,例如:


    .class {
    filter: ~"ms:alwaysHasItsOwnSyntax.For.Stuff()";
    }

我们可以将要避免编译的值用 “ ” 包裹起来,输出结果为:


    .class {
    filter: ms:alwaysHasItsOwnSyntax.For.Stuff();
    }

Selector Interpolation

如果需要在选择器中使用 LESS 变量,只需通过 @{selector} 插值语句导入变量,例如:

@name: blocked;
    .@{name} {
    color: black;
    }

输出:

.blocked {
    color: black;
    }

注意:(~"@{name}") 语句可以在 LESS 1.3.1 等之前版本中使用,但 1.4.0 版将不再支持这种用法。

JavaScript evaluation

JavaScript 表达式也可以在 .less 文件中使用,可以通过反引号的方式使用(但是不建议使用):

@var: `"hello".toUpperCase() + '!'`;

输出:

@var: "HELLO!";

注意你也可以同时使用字符串插值和避免编译:

@str: "hello";
    @var: ~`"@{str}".toUpperCase() + '!'`;

输出:

@var: HELLO!;

它也可以访问 JavaScript 环境:

@height: `document.body.clientHeight`;

如果你想将一个 JavaScript 字符串解析成16进制的颜色值,你可以使用 color 函数:

@color: color(`window.colors.baseColor`);
    @darkcolor: darken(@color, 10%);

Function Reference

Index

escape(@string);                             // 通过 URL-encoding 编码字符串

unit(@dimension, [@unit: ""]);               // 移除或替换属性值的单位
color(@string);                              // 将字符串解析为颜色值

ceil(@number);                               // 向上取整
floor(@number);                              // 向下取整
percentage(@number);                         // 将浮点数转换为百分比,例如 0.5 -> 50%
round(number, [places: 0]);                  // 四舍五入取整

rgb(@r, @g, @b);                             // 转换为颜色值
rgba(@r, @g, @b, @a);                        // 转换为颜色值
argb(@color);                                // 创建 #AARRGGBB 格式的颜色值
hsl(@hue, @saturation, @lightness);          // 创建颜色值
hsla(@hue, @saturation, @lightness, @alpha); // 创建颜色值
hsv(@hue, @saturation, @value);              // 创建颜色值
hsva(@hue, @saturation, @value, @alpha);     // 创建颜色值

hue(@color);                                 // 从颜色值中提取 `hue` 值
saturation(@color);                          // 从颜色值中提取 `saturation` 值
lightness(@color);                           // 从颜色值中提取 'lightness' 值
red(@color);                                 // 从颜色值中提取 'red' 值
green(@color);                               // 从颜色值中提取 'green' 值
blue(@color);                                // 从颜色值中提取 'blue' 值
alpha(@color);                               // 从颜色值中提取 'alpha' 值
luma(@color);                                // 从颜色值中提取 'luma' 值

saturate(@color, 10%);                       // 饱和度增加 10%
desaturate(@color, 10%);                     // 饱和度降低 10%
lighten(@color, 10%);                        // 亮度增加 10%
darken(@color, 10%);                         // 亮度降低 10%
fadein(@color, 10%);                         // 透明度增加 10%
fadeout(@color, 10%);                        // 透明度降低 10%
fade(@color, 50%);                           // 设定透明度为 50%
spin(@color, 10);                            // 色相值增加 10
mix(@color1, @color2, [@weight: 50%]);       // 混合两种颜色
greyscale(@color);                           // 完全移除饱和度,输出灰色
contrast(@color1, [@darkcolor: black], [@lightcolor: white], [@threshold: 43%]); 
                                             // 如果 @color1 的 luma 值 > 43% 输出 @darkcolor
                                             // 否则输出 @lightcolor

multiply(@color1, @color2);
screen(@color1, @color2);
overlay(@color1, @color2);
softlight(@color1, @color2);
hardlight(@color1, @color2);
difference(@color1, @color2);
exclusion(@color1, @color2);
average(@color1, @color2);
negation(@color1, @color2);

字符串函数 (String functions)

escape(@string)

=, :, #, ;, () 等字符通过 URL-encoding 编码输出。

参数:

  • @string: 字符串 (A string to escape.)

返回值:字符串 (string)

例如:

escape('a=1')

输出:

a%3D1

综合类函数 (Misc functions)

color(@string)

解析颜色,将代表颜色的字符串转换为颜色值。

参数:

  • @string: 字符串 (A string of the color.)

例如:

color("#aaa");

输出:

#aaa

unit(@dimension, [@unit: ""])

移除或替换属性值 (dimension) 的单位。(注:A dimension is a number immediately followed by a unit identifier.

参数:

  • @dimension: 数字,带或不带单位 (A number, with or without a dimension.)
  • @unit: 可选:将要替换成的单位,如果省略则移除原单位

例如:

unit(5, px)

输出:

5px

例如:

unit(5em)

输出:

5

算数函数 (Math functions)

ceil(@number)

向上取整。

参数:

  • @number: 浮点数 (A floating point number.)

返回值:整数 (integer)

例如:

ceil(2.4)

输出:

3

floor(@number)

向下取整。

参数:

  • @number: 浮点数 (A floating point number.)

返回值:整数 (integer)

例如:

floor(2.6)

输出:

2

percentage(@number)

将浮点数 (A floating point number) 转换为百分比字符串 (percentage string)。

参数:

  • @number: 浮点数 (A floating point number.)

返回值:字符串 (string)

例如:

percentage(0.5)

输出:

50%

round(number, [places: 0])

四舍五入取整。

参数:

  • @number: 浮点数 (A floating point number.)
  • @decimalPlaces: 可选:四舍五入取整的小数点位置,默认值 0。

返回值:数字 (number)

例如:

round(1.67)

输出:

2

例如:

round(1.67, 1)

输出:

1.7

颜色函数 (Color functions)

颜色解释 (Color definition)

rgb(@r, @g, @b)

通过十进制红色,绿色,蓝色三种值 (RGB) 创建不透明的颜色对象。在 HTML/CSS 中也会用文本颜色值 (literal color values) 定义颜色,例如 red -> #ff0000

参数:

  • @red: 整数 0-255 或百分比 0-100%
  • @green: 整数 0-255 或百分比 0-100%
  • @blue: 整数 0-255 或百分比 0-100%

返回值:颜色 (color)

例如:

rgb(90, 129, 32)

输出:

#5a8120

rgba(@r, @g, @b, @a)

通过十进制红色,绿色,蓝色,以及 alpha 四种值 (RGBA) 创建透明的颜色对象。

参数:

  • @red: 整数 0-255 或百分比 0-100%
  • @green: 整数 0-255 或百分比 0-100%
  • @blue: 整数 0-255 或百分比 0-100%
  • @alpha: 数字 0-1 或百分比 0-100%

返回值:颜色 (color)

例如:

rgba(90, 129, 32, 0.5)

输出:

rgba(90, 129, 32, 0.5)

argb(@color)

创建格式为 #AARRGGBB 的十六进制 (hex representation) 颜色 (注意不是 #RRGGBBAA !)。

参数:

  • @color: 颜色对象 (A color object.)

返回值:字符串 (string)

例如:

argb(rgba(90, 23, 148, 0.5));

输出:

#805a1794

hsl(@hue, @saturation, @lightness)

通过色相 (hue),饱和度 (saturation),亮度 (lightness) 三种值 (HSL) 创建不透明的颜色对象。

参数:

  • @hue: 整数 0-360 表示度数。
  • @saturation: 百分比 0-100% 或数字 0-1
  • @lightness: 百分比 0-100% 或数字 0-1

返回值:颜色 (color)

例如:

hsl(90, 100%, 50%)

输出:

#80ff00

可以用来基于一种颜色创建另一种颜色, 例如:

@new: hsl(hue(@old), 45%, 90%);

@new 将使用 @old色相值,以及它自己的饱和度与亮度。

hsla(@hue, @saturation, @lightness, @alpha)

通过色相 (hue),饱和度 (saturation),亮度 (lightness),以及 alpha 四种值 (HSLA) 创建透明的颜色对象。

参数:

  • @hue: 整数 0-360 表示度数
  • @saturation: 百分比 0-100% 或数字 0-1
  • @lightness: 百分比 0-100% 或数字 0-1
  • @alpha: 百分比 0-100% 或数字 0-1

返回值:颜色 (color)

例如:

hsl(90, 100%, 50%, 0.5)

输出:

rgba(128, 255, 0, 0.5)

hsv(@hue, @saturation, @value)

通过色相 (hue),饱和度 (saturation),明度 (value) 三种值 (HSV) 创建不透明的颜色对象。注意与 HSL 不同

参数:

  • @hue: 整数 0-360 表示度数
  • @saturation: 百分比 0-100% 或数字 0-1
  • @value: 百分比 0-100% 或数字 0-1

返回值:颜色 (color)

例如:

hsv(90, 100%, 50%)

输出:

#408000

hsva(@hue, @saturation, @value, @alpha)

通过色相 (hue),饱和度 (saturation),明度 (value),以及 alpha 四种值 (HSVA) 创建透明的颜色对象。注意与 HSLA 不同。

参数:

  • @hue: 整数 0-360 表示度数
  • @saturation: 百分比 0-100% 或数字 0-1
  • @value: 百分比 0-100% 或数字 0-1
  • @alpha: 百分比 0-100% 或数字 0-1

返回值:颜色 (color)

例如:

hsva(90, 100%, 50%, 0.5)

输出:

rgba(64, 128, 0, 0.5)

颜色通道信息 (Color channel information)

hue(@color)

从颜色对象中提取色相值 (hue channel)。

参数:

  • @color: 颜色对象 (A color object.)

返回值:整数 0-360

例如:

hue(hsl(90, 100%, 50%))

输出:

90

saturation(@color)

从颜色对象中提取饱和度值 (saturation channel)。

参数:

  • @color: 颜色对象 (A color object.)

返回值:百分比值 0-100

例如:

saturation(hsl(90, 100%, 50%))

输出:

100%

lightness(@color)

从颜色对象中提取亮度值 (lightness channel)。

参数:

  • @color: 颜色对象 (A color object.)

返回值:百分比值 0-100

例如:

lightness(hsl(90, 100%, 50%))

输出:

50%

red(@color)

从颜色对象中提取红色值。

参数:

  • @color: 颜色对象 (A color object.)

返回值:整数 0-255

例如:

red(rgb(10, 20, 30))

输出:

10

green(@color)

从颜色对象中提取绿色值。

参数:

  • @color: 颜色对象 (A color object.)

返回值:整数 0-255

例如:

green(rgb(10, 20, 30))

输出:

20

blue(@color)

从颜色对象中提取蓝色值。

参数:

  • @color: 颜色对象 (A color object.)

返回值:整数 0-255

例如:

blue(rgb(10, 20, 30))

输出:

30

alpha(@color)

从颜色对象中提取 alpha 值。

参数:

  • @color: 颜色对象 (A color object.)

返回值:介于 0-1 之间 (float 0-1)

例如:

alpha(rgba(10, 20, 30, 0.5))

输出:

0.5

luma(@color)

计算颜色对象的 luma 值(亮度值:perceptual brightness)。Uses SMPTE C / Rec. 709 coefficients, as recommended in WCAG 2.0. 这个计算公式也用在 contrast() 函数中。

参数:

  • @color: 颜色对象 (A color object.)

返回值:百分比 0-100%

例如:

luma(rgb(100, 200, 30))

输出:

65%

颜色值运算 (Color operations)

颜色值运算有几点注意事项:参数必须单位/格式相同;百分比将作为绝对值处理,比如 10% 增加 10%,结果是 20% 而不是 11%;参数值只能在限定的范围内;they do not wrap around (这一句不清楚意思)。返回值时,除了十六进制的颜色值 (hex versions) 外将对其他格式做简化处理。

saturate(@color, 10%)

增加一定数值的颜色饱和度。

参数:

  • @color: 颜色对象 (A color object.)
  • @amount: 百分比 0-100%

返回值:颜色 (color)

例如:

saturate(hsl(90, 90%, 50%), 10%)

输出:

#80ff00 // hsl(90, 100%, 50%)

desaturate(@color, 10%)

降低一定数值的颜色饱和度。

参数:

  • @color: 颜色对象 (A color object.)
  • @amount: 百分比 0-100%

返回值:颜色 (color)

例如:

desaturate(hsl(90, 90%, 50%), 10%)

输出:

#80e51a // hsl(90, 80%, 50%)

lighten(@color, 10%)

增加一定数值的颜色亮度。

参数:

  • @color: 颜色对象 (A color object.)
  • @amount: 百分比 0-100%

返回值:颜色 (color)

例如:

lighten(hsl(90, 90%, 50%), 10%)

输出:

#99f53d // hsl(90, 90%, 60%)

darken(@color, 10%)

降低一定数值的颜色亮度。

参数:

  • @color: 颜色对象 (A color object.)
  • @amount: 百分比 0-100%

返回值:颜色 (color)

例如:

darken(hsl(90, 90%, 50%), 10%)

输出:

#66c20a // hsl(90, 90%, 40%)

fadein(@color, 10%)

降低颜色的透明度(或增加不透明度),令其更不透明,对不透明的颜色无效。如果要增加颜色的透明度,使用 fadeout() 函数。

参数:

  • @color: 颜色对象 (A color object.)
  • @amount: 百分比 0-100%

返回值:颜色 (color)

例如:

fadein(hsla(90, 90%, 50%, 0.5), 10%)

输出:

rgba(128, 242, 13, 0.6) // hsla(90, 90%, 50%, 0.6)

fadeout(@color, 10%)

增加颜色的透明度(或降低不透明度),令其更透明,对不透明的颜色无效。如果要增加颜色的透明度,使用 fadein() 函数。

参数:

  • @color: 颜色对象 (A color object.)
  • @amount: 百分比 0-100%

返回值:颜色 (color)

例如:

fadeout(hsla(90, 90%, 50%, 0.5), 10%)

输出:

rgba(128, 242, 13, 0.4) // hsla(90, 90%, 50%, 0.6)

fade(@color, 50%)

给颜色(包括不透明的颜色)设定一定数值的透明度。

参数:

  • @color: 颜色对象 (A color object.)
  • @amount: 百分比 0-100%

返回值:颜色 (color)

例如:

fade(hsl(90, 90%, 50%), 10%)

输出:

rgba(128, 242, 13, 0.1) //hsla(90, 90%, 50%, 0.1)

spin(@color, 10)

向任意方向旋转颜色的色相角度 (hue angle),旋转范围 0-360,超过一周后将从起点开始继续旋转(+ - 控制方向),比如旋转 360 度与 720 度是相同的结果。需要注意的是,颜色值会通过 RGB 格式转换,这个过程不能保留灰色的色相值(灰色没有饱和度,色相值也就没有意义了),因此要确定使用函数的方法能够保留颜色的色相值,例如不要这样使用函数:

@c: saturate(spin(#aaaaaa, 10), 10%);

而应该用这种方法代替:

@c: spin(saturate(#aaaaaa, 10%), 10);

因为颜色值永远输出为 RGB 格式,因此 spin() 函数对灰色无效。

参数:

  • @color: 颜色对象 (A color object.)
  • @angle: 任意数字表示角度 (+ 或 – 表示方向)

返回值:颜色 (color)

例如:

spin(hsl(10, 90%, 50%), 20)
spin(hsl(10, 90%, 50%), -20)

输出:

#f27f0d // hsl(30, 90%, 50%)
#f20d33 // hsl(350, 90%, 50%)

mix(@color1, @color2, [@weight: 50%])

根据比例混合两种颜色,包括计算不透明度。

参数:

  • @color1: 颜色对象 (A color object.)
  • @color1: 颜色对象 (A color object.)
  • @weight: 可选项:平衡两种颜色的百分比, 默认 50%。 (Optional, a percentage balance point between the two colors, defaults to 50%.)

返回值:颜色 (color)

例如:

mix(#ff0000, #0000ff, 50%)
mix(rgba(100,0,0,1.0), rgba(0,100,0,0.5), 50%)

输出:

#800080
rgba(75, 25, 0, 0.75)

greyscale(@color)

完全移除颜色的饱和度,与 desaturate(@color, 100%) 函数效果相同。因为颜色的饱和度不受色相值影响,所以输出的颜色会稍显暗淡 (dull or muddy);luma may provide a better result as it extracts perceptual rather than linear brightness, for example greyscale('#0000ff') will return the same value as greyscale('#00ff00'), though they appear quite different in brightness to the human eye.

参数:

  • @color: 颜色对象 (A color object.)

返回值:颜色 (color)

例如:

greyscale(hsl(90, 90%, 50%))

输出:

#808080 // hsl(90, 0%, 50%)

contrast(@background, [@darkcolor: black], [@lightcolor: white], [@threshold: 43%])

这个函数对比 @background 的 luma 值与 @threshold 参数的大小,如果大于输出 @darkcolor, 小于则输出 @lightcolor,便于选择相对于背景更容易阅读的颜色,同时提高了使用颜色的灵活性,与 Compass 的 contrast() 函数 工作方式相同。根据 WCAG 2.0 应该对比颜色的 luma 值,而不是亮度值 (lightness)。

参数:

  • @background: 需要对比的颜色对象 (A color object to compare against.)
  • @darkcolor: 可选项 – 指定的黑色(默认 black)
  • @lightcolor: 可选项 – 指定的白色(默认 white)
  • @threshold: 可选项 – 百分比 0-100% 界定深色过渡到浅色的转变位置(默认 43%),这个数值决定了输出结果偏向于哪一方,比如判断 50% 的灰色背景应该显示白色还是黑色的文字。You would generally set this lower for ‘lighter’ palettes, higher for ‘darker’ ones.

返回值:颜色 (color)

例如:

contrast(#aaaaaa)
contrast(#222222, #101010)
contrast(#222222, #101010, #dddddd)
contrast(hsl(90, 100%, 50%),#000000,#ffffff,40%);
contrast(hsl(90, 100%, 50%),#000000,#ffffff,60%);

输出:

#000000 // black
#ffffff // white
#dddddd
#000000 // black
#ffffff // white

颜色混合 (Color blending)

颜色混合的方式与图像编辑器 Photoshop, Firework 或者 GIMP 的图层混合模式 (layer blending modes) 相似,因此制作 .psd 文件时处理颜色的方法可以同样用在 CSS 中。

multiply(@color1, @color2)

分别将两种颜色的红绿蓝 (RGB) 三种值做乘法运算,然后再除以 255,输出结果是更深的颜色。

参数:

  • @color1: 颜色对象 (A color object to multiply against.)
  • @color2: 颜色对象 (A color object to multiply against.)

返回值:颜色 (color)

例如:

multiply(#ff6600, #000000);

Color 1 Color 2 Color 3

multiply(#ff6600, #333333);

Color 1 Color 2 Color 3

multiply(#ff6600, #666666);

Color 1 Color 2 Color 3

multiply(#ff6600, #999999);

Color 1 Color 2 Color 3

multiply(#ff6600, #cccccc);

Color 1 Color 2 Color 3

multiply(#ff6600, #ffffff);

Color 1 Color 2 Color 3

multiply(#ff6600, #ff0000);

Color 1 Color 2 Color 3

multiply(#ff6600, #00ff00);

Color 1 Color 2 Color 3

multiply(#ff6600, #0000ff);

Color 1 Color 2 Color 3

screen(@color1, @color2)

multiply() 函数效果相反,输出结果是更亮的颜色。

参数:

  • @color1: 颜色对象 (A color object to screen against.)
  • @color2: 颜色对象 (A color object to screen against.)

返回值:颜色 (color)

例如:

screen(#ff6600, #000000);

Color 1 Color 2 Color 3

screen(#ff6600, #333333);

Color 1 Color 2 Color 3

screen(#ff6600, #666666);

Color 1 Color 2 Color 3

screen(#ff6600, #999999);

Color 1 Color 2 Color 3

screen(#ff6600, #cccccc);

Color 1 Color 2 Color 3

screen(#ff6600, #ffffff);

Color 1 Color 2 Color 3

screen(#ff6600, #ff0000);

Color 1 Color 2 Color 3

screen(#ff6600, #00ff00);

Color 1 Color 2 Color 3

screen(#ff6600, #0000ff);

Color 1 Color 2 Color 3

overlay(@color1, @color2)

结合 multiply()screen() 两个函数的效果,令浅的颜色变得更浅,深的颜色变得更深。注意:输出结果由第一个颜色参数决定。

参数:

  • @color1: 颜色对象 (A color object to overlay another. Also it is the determinant color to make the result lighter or darker.)
  • @color2: 颜色对象 (A color object to be overlayed.)

返回值:颜色 (color)

例如:

overlay(#ff6600, #000000);

Color 1 Color 2 Color 3

overlay(#ff6600, #333333);

Color 1 Color 2 Color 3

overlay(#ff6600, #666666);

Color 1 Color 2 Color 3

overlay(#ff6600, #999999);

Color 1 Color 2 Color 3

overlay(#ff6600, #cccccc);

Color 1 Color 2 Color 3

overlay(#ff6600, #ffffff);

Color 1 Color 2 Color 3

overlay(#ff6600, #ff0000);

Color 1 Color 2 Color 3

overlay(#ff6600, #00ff00);

Color 1 Color 2 Color 3

overlay(#ff6600, #0000ff);

Color 1 Color 2 Color 3

softlight(@color1, @color2)

overlay() 函数效果相似,只是当纯黑色或纯白色作为参数时输出结果不会是纯黑色或纯白色。

参数:

  • @color1: 颜色对象 (A color object to soft light another.)
  • @color2: 颜色对象 (A color object to be soft lighten.)

返回值:颜色 (color)

例如:

softlight(#ff6600, #000000);

Color 1 Color 2 Color 3

softlight(#ff6600, #333333);

Color 1 Color 2 Color 3

softlight(#ff6600, #666666);

Color 1 Color 2 Color 3

softlight(#ff6600, #999999);

Color 1 Color 2 Color 3

softlight(#ff6600, #cccccc);

Color 1 Color 2 Color 3

softlight(#ff6600, #ffffff);

Color 1 Color 2 Color 3

softlight(#ff6600, #ff0000);

Color 1 Color 2 Color 3

softlight(#ff6600, #00ff00);

Color 1 Color 2 Color 3

softlight(#ff6600, #0000ff);

Color 1 Color 2 Color 3

hardlight(@color1, @color2)

overlay() 函数效果相似,不过由第二个颜色参数决定输出颜色的亮度或黑度,而不是第一个颜色参数决定。

参数:

  • @color1: 颜色对象 (A color object to overlay another.)
  • @color2: 颜色对象 (A color object to be overlayed. Also it is the determinant color to make the result lighter or darker.)

返回值:颜色 (color)

例如:

hardlight(#ff6600, #000000);

Color 1 Color 2 Color 3

hardlight(#ff6600, #333333);

Color 1 Color 2 Color 3

hardlight(#ff6600, #666666);

Color 1 Color 2 Color 3

hardlight(#ff6600, #999999);

Color 1 Color 2 Color 3

hardlight(#ff6600, #cccccc);

Color 1 Color 2 Color 3

hardlight(#ff6600, #ffffff);

Color 1 Color 2 Color 3

hardlight(#ff6600, #ff0000);

Color 1 Color 2 Color 3

hardlight(#ff6600, #00ff00);

Color 1 Color 2 Color 3

hardlight(#ff6600, #0000ff);

Color 1 Color 2 Color 3

difference(@color1, @color2)

从第一个颜色值中减去第二个(分别计算 RGB 三种颜色值),输出结果是更深的颜色。

参数:

  • @color1: 颜色对象 (A color object to act as the minuend.)
  • @color2: 颜色对象 (A color object to act as the subtrahend.)

返回值:颜色 (color)

例如:

difference(#ff6600, #000000);

Color 1 Color 2 Color 3

difference(#ff6600, #333333);

Color 1 Color 2 Color 3

difference(#ff6600, #666666);

Color 1 Color 2 Color 3

difference(#ff6600, #999999);

Color 1 Color 2 Color 3

difference(#ff6600, #cccccc);

Color 1 Color 2 Color 3

difference(#ff6600, #ffffff);

Color 1 Color 2 Color 3

difference(#ff6600, #ff0000);

Color 1 Color 2 Color 3

difference(#ff6600, #00ff00);

Color 1 Color 2 Color 3

difference(#ff6600, #0000ff);

Color 1 Color 2 Color 3

exclusion(@color1, @color2)

效果与 difference() 函数效果相似,只是输出结果差别更小 (lower contrast)。

参数:

  • @color1: 颜色对象 (A color object to act as the minuend.)
  • @color2: 颜色对象 (A color object to act as the subtrahend.)

返回值:颜色 (color)

例如:

exclusion(#ff6600, #000000);

Color 1 Color 2 Color 3

exclusion(#ff6600, #333333);

Color 1 Color 2 Color 3

exclusion(#ff6600, #666666);

Color 1 Color 2 Color 3

exclusion(#ff6600, #999999);

Color 1 Color 2 Color 3

exclusion(#ff6600, #cccccc);

Color 1 Color 2 Color 3

exclusion(#ff6600, #ffffff);

Color 1 Color 2 Color 3

exclusion(#ff6600, #ff0000);

Color 1 Color 2 Color 3

exclusion(#ff6600, #00ff00);

Color 1 Color 2 Color 3

exclusion(#ff6600, #0000ff);

Color 1 Color 2 Color 3

average(@color1, @color2)

分别对 RGB 的三种颜色值取平均值,然后输出结果。

参数:

  • @color1: 颜色对象 (A color object.)
  • @color2: 颜色对象 (A color object.)

返回值:颜色 (color)

例如:

average(#ff6600, #000000);

Color 1 Color 2 Color 3

average(#ff6600, #333333);

Color 1 Color 2 Color 3

average(#ff6600, #666666);

Color 1 Color 2 Color 3

average(#ff6600, #999999);

Color 1 Color 2 Color 3

average(#ff6600, #cccccc);

Color 1 Color 2 Color 3

average(#ff6600, #ffffff);

Color 1 Color 2 Color 3

average(#ff6600, #ff0000);

Color 1 Color 2 Color 3

average(#ff6600, #00ff00);

Color 1 Color 2 Color 3

average(#ff6600, #0000ff);

Color 1 Color 2 Color 3

negation(@color1, @color2)

difference() 函数效果相反,输出结果是更亮的颜色。请注意:效果相反不代表做加法运算。

参数:

  • @color1: 颜色对象 (A color object to act as the minuend.)
  • @color2: 颜色对象 (A color object to act as the subtrahend.)

返回值:颜色 (color)

例如:

negation(#ff6600, #000000);

Color 1 Color 2 Color 3

negation(#ff6600, #333333);

Color 1 Color 2 Color 3

negation(#ff6600, #666666);

Color 1 Color 2 Color 3

negation(#ff6600, #999999);

Color 1 Color 2 Color 3

negation(#ff6600, #cccccc);

Color 1 Color 2 Color 3

negation(#ff6600, #ffffff);

Color 1 Color 2 Color 3

negation(#ff6600, #ff0000);

Color 1 Color 2 Color 3

negation(#ff6600, #00ff00);

Color 1 Color 2 Color 3

negation(#ff6600, #0000ff);

Color 1 Color 2 Color 3

About

Alexis Sellier -LESS作者

飞长(王玉林) -LESS中国官网发起人 from TaoBao UED

QQ交流群1:211798086(已满)
QQ交流群2:236076846(已满)
QQ交流群3:247095011(已满)
QQ交流群4:248796244

贡献者:飞长、TooBug(郑易超)、郁郁葱葱、Peter、小问

欢迎供稿: https://github.com/feichang/lesscss.net 纠错请加群联系飞长

我们需要大侠的赞助, 点击包养我们 , 如果可以请留下网名和联系方式,方便我们联系到你。

感谢赞助:星星、*海经、*德文

Fork me on GitHub