初学Less
- 目录
{:toc}
Less在CSS语法的基础上进行了扩展,主要包含:
- Variables(变量)
- Mixins(混合书写)
- Nested Rules(嵌套规则)
- Functions & Operations(功能和操作)
- Client-side usage(客户端使用)
- Server-side usage(服务端使用)
使用Less
Server-side usage
npm安装
1 | npm install -g less |
命令行使用
输出到stdout
,直接在控制台显示
1 | lessc styles.less |
保存为文件
1 | lessc styles.less styles.css |
如果需要压缩,要先安装clean-css插件,然后执行命令
1 | lessc --clean-css styles.less styles.min.css |
在代码中使用
1 | var less = require('less'); |
Client-side usage
link中的rel设置成stylesheet/less
先引入less文件,再引入less.js脚本
1 | <link rel="stylesheet/less" type="text/css" href="styles.less" /> |
下载less.js
需要注意的是,在浏览器中使用Less虽然入门简单、开发便捷,但在实际项目中因为要考虑性能问题,一般推荐在服务端用node.js或其他第三方工具使用
语言特性
Variables
定义变量
1 | @nice-blue: #5B83AD; |
输出
1 | #header { |
注意,Less中变量相当于“常量”,因为它们只能被定义一次
变量也可以用在选择器、属性名和字符串拼接中,用@{变量名}形式
1 | /*注意:如果定义成@dialog: .dialog-class;这种有连字符 - 的变量值 |
结果
1 | .dialogClass { |
Mixins
一个规则集合应用到另一个规则集合中,例如
1 | .bordered { |
我们想要将这些属性应用到别的规则集合中,直接用类名(也可以是id)代替这些属性就行了
1 | #menu a { |
可以定义不带参数或带参数的Mixin,供调用,不输出css
1 | //不带参数 |
输出:
1 | #doge { |
Mixin中内置了两个特殊的对象,@arguments
和@rest
@arguments与JavaScript中函数的arguments对象类似,表示传入的所有参数
@rest则表示…参数
1 | .dog(@h;@rest...){ |
输出:
1 | #doge { |
Nested Rules
1 | #header { |
在Less中可以写成
1 | #header { |
我们也可以在混合书写模式中使用伪选择器,用&
表示当前选择器的父选择器
1 | .clearfix { |
Operations
加减乘除算术运算可以在任何数字、颜色和变量上操作,如果可能,数学操作将会考虑单位,在操作前会进行换算,运算结果以最左边有定义的单位为准
如果单位无法换算或无意义,则会忽略单位
1 | // numbers are converted into the same units |
注意,乘法与除法在运算时不进行单位换算,因为在大多数情况下这两种操作是无意义的
比如:一个长度乘以另一个长度等于一个面,而css中不支持对这样的面操作,因此只会对数字进行运算,然后分配最左边有定义的单位
(好像很有道理,比如2cm * 3mm,如果进行单位换算,最终结果将是0.6cm2,而这个单位在css中暂时并没有卵用)
1 | @base: 2cm * 3mm; // result is 6cm |
颜色的运算会分为rgba来运算,并且总会输出一个合法的颜色值,如果颜色值大于ff或小于00,都会被四舍五入成ff或00,对于alpha也是一样,总在1.0-0.0之间
注意:alpha值的运算未定义,因为在对颜色的数学操作的意义上没有达成一致,所以如果对alpha进行运算,可能达不到想要的结果,后期也可能会改变
1 | @color: #224488 / 2; //results in #112244 |
Escaping
可以用任意字符串作为属性或变量的值,~"任意字符串"
或~'任意字符串'
将不会改变,主要用在css hack中
1 | .weird-element { |
结果:
1 | .weird-element { |
Functions
Less提供了许多对颜色、字符串和数学操作的功能,使用方式十分直白(前提是你英语好)
具体可以在Function Reference中查询
1 | @base: #f04615; |
Namespaces and Accessors
可以在命名空间中定义一些属性供以后使用或分发
1 | #bundle { |
使用:
1 | #header a { |
注:在namespace中定义的变量不能通过#namespace > @var访问到
Scope
Less中的作用域与其他编程语言类似,现在本地作用域中寻找变量或Mixin,若没找到,再到上一级作用域中寻找
Comments
两种注释方法
- //行内
- /*
块级
*/
Importing
import 可以导入其他文件,如果是.less文件,可以不写后缀
1 | @import "library"; // library.less |