1.初见less
1.1 什么是less
less是一个css预编译器,意思指的是它可以扩展css语言,添加功能如允许变量(variables),混合(mixins),函数(functions)和许多其他技术,让css更具维护性,主题性,扩展性。
1.2 less官方网站
1.3 与less的第一次碰面
传统写法
.conten ul{
list-style: none;
}
.conten li{
height: 24px;
line-height:24px
}
less写法
.conten {
ul{
list-style: none;
}
li{
height: 24px;
line-height:24px
}
}
1.4 less中的注释
2种注册方式:
- // 以 // 开始的注释,不会编译到css文件中。
- /**/ 以 /* */包裹的注释会被编译到css文件中。
less文件:
// 只会在less中显示
ul{
li{
color:red;
}
}
/*
在 less 和 css 中都会显示
*/
less文件编译成的css文件:
ul li {
color: red;
}
/*
在 less 和 css 中都会显示
*/
2.正确使用less
2.1 如何使用less
less文件只有被编译后才能够被浏览器识别使用。
2.2 less编译工具
- Koala: 国人开发的全平台的LESS编译工具。http://koala-app.com/index-zh.html
- WinLess: Window下的LESS编译软件。https://www.winless.org/
- Codekit: MAC平台下的LESS编译软件。https://codekitapp.com/
2.3 客户端调试方式
- 首先引用less文件。注意:引用时使用link引入,然后将rel属性设置为 rel="stylesheet/less"
- 然后引入 less.js。 注意:与引入普通js一致,但是一定放在less文件样式文件之后。
下载引入less.js文件:
官网下载
cdn引入less.js:
<script src="//cdnjs.cloudflare.com/ajax/libs/less.js/2.5.3/less.min.js"></script>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<!-- 1.引入 .less文件 -->
<link rel="stylesheet/less" href="./index.less">
<!-- 2.csdn 引入less.js 文件 -->
<!-- <script src="//cdnjs.cloudflare.com/ajax/libs/less.js/2.5.3/less.min.js"></script> -->
<!-- 2.下载引入less.js 文件 -->
<script src="../node_modules/less/dist/less.min.js"></script>
</head>
<body>
<h2>dd</h2>
</body>
</html>
2.4 下载less,使用命令编译文件
- 下载: npm install less --save
- 编译: lessc ./index.less ./index.css ./index.less为要编译的less文件;./index.css 为编译后生成的文件。
3.变量(variables)
3.1 普通的变量
1.变量的定义方式
用 @ 命名变量 。变量和变量值之间分号分开。 如: @green: green; 定义一个变量为绿色。
2.实例
html 代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<link rel="stylesheet" href="./index.css">
</head>
<body>
<header>
<h1> less</h1>
</header>
<footer>
<h1>learn less</h1>
</footer>
</body>
</html>
less文件代码
@green:green;
@white:white;
header, footer{
background-color: @green;
h1{
color: @white;
}
}
编译后的css文件代码
header,
footer {
background-color: green;
}
header h1,
footer h1 {
color: white;
}
3.注意
由于变量只能定义一次,实际上他们就是“常量”
3.2 作为选择器和属性名
1.使用
使用时将变量以 @{变量名} 的方式使用
2.案例
html文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<link rel="stylesheet" href="./index.css">
</head>
<body>
<header>
<h1> less</h1>
</header>
<footer class="width">
<h1>learn less</h1>
</footer>
</body>
</html>
less文件
// 作为选择器和属性名的变量
@width: width;
// 作为选择器
.@{width}{
// 作为属性名
@{width}: 200px;
}
编译后的css文件
.width {
width: 200px;
}
3.3 作为URL
1.使用
使用时,使用 " " 将变量的值扩起来,使用时同样将变量以 @{变量名} 的方式使用
2.案例
html文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<link rel="stylesheet" href="./index.css">
</head>
<body>
<header></header>
</body>
</html>
less文件
// 作为URL变量
@imgUrl:"https://www.baidu.com/img/";
header{
background:url("@{imgUrl}PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png");
width: 500px;
height: 500px;
}
编译后的css文件
header {
background: url("https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png");
width: 500px;
height: 500px;
}
3.4 延迟加载
1.什么是延迟加载?
变量是延迟加载的,在使用前不一定要预先声明。
2.案例
先使用变量,但未先声明变量,依旧可以使用。
less文件
header, footer{
background-color: @green;
h1{
color: @white;
}
}
@green:green;
@white:white;
编译后的css文件
header,
footer {
background-color: green;
}
header h1,
footer h1 {
color: white;
}
3.5 定义多个相同名称的变量时
在定义一个变量两次时,只会使用最后定义的变量,less会从当前作用域中向上搜索,这个行为类似css的定义中始终使用最后定义的属性值。
less文件
// 定义相同名称变量时
@var:0;
.class{
@var:1;
.brass{
@var:2;
three:@var; // 3
@var:3;
}
one:@var; // 1
@var:aaa // 在这再次定义时,上面的one就是aaa
}
编译后的css文件
.class {
one: aaa;
}
.class .brass {
three: 3;
}
4.混合(mixins)
4.1 普通混合 .类名
1.什么是混合
混合就是一种将一系列属性从一个规则集引入(“混合”)到另一规则集的方式。
2.案例
html文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<link rel="stylesheet" href="./index.css">
</head>
<body>
<header>
<h1>less</h1>
</header>
<footer class="width">
<h2>learn less</h2>
</footer>
</body>
</html>
less文件
// 以前遇到这种公共的样式会提取到一个公共的类中,在dom结构上class="类名"
// 在 less 中可以使用混合集
.font_hn{
color:red;
font-family: 'Courier New', Courier, monospace;
}
h1{
font-size: 28px;
.font_hn;
}
h2{
font-size: 24px;
.font_hn;
}
编译后的css文件
.font_hn {
color: red;
font-family: 'Courier New', Courier, monospace;
}
h1 {
font-size: 28px;
color: red;
font-family: 'Courier New', Courier, monospace;
}
h2 {
font-size: 24px;
color: red;
font-family: 'Courier New', Courier, monospace;
}
4.2 不带输出的混合 ()
用法:类名后面使用 () 。
1.什么是不带输出的混合?
如果你想要创建一个混合集,但是却不想让它输出到你的样式中。
2.使用方式
在不想输出的混合集的后面加上(),就可以不再编译的css文件中输出。
less文件
// 以前遇到这种公共的样式会提取到一个公共的类中,在dom结构上class="类名"
// 在 less 中可以使用混合集
// 在不想输出到编译后的css文件中的混合集后面加上括号,便不会输出到css文件中
// 混合集即为之前css样式中书写的公共样式类。
.font_hn(){
color:red;
font-family: 'Courier New', Courier, monospace;
}
h1{
font-size: 28px;
.font_hn;
}
h2{
font-size: 24px;
.font_hn;
}
编译后的css文件 【css文件中没有输出 font_hn 类】
h1 {
font-size: 28px;
color: red;
font-family: 'Courier New', Courier, monospace;
}
h2 {
font-size: 24px;
color: red;
font-family: 'Courier New', Courier, monospace;
}
4.3 带选择器的混合 &
方法:使用& 。类中的& 代表父级类。
less文件
// () 不输出的混合
// 带选择器的混合
.my-hover-mlxin(){
// & 代表 父类
// &:hover 等同于 .my-hover-mlxin:hover
&:hover{
border: 1px solid red;
}
}
button{
// & 父级为button
.my-hover-mlxin;
}
a{
// & 父级为a
.my-hover-mlxin;
}
h1{
// & 父级为h1
.my-hover-mlxin;
}
编译后的css文件
button:hover {
border: 1px solid red;
}
a:hover {
border: 1px solid red;
}
h1:hover {
border: 1px solid red;
}
4.4 带参数的混合 (@参数)
方法:在使用混合时通过传参的方式。(@参数)
注意:定义的参数也必须使用@来定义,和之前的定义变量的方法一致。
less文件
// 带参数的混合
// 这里定义参数也必须使用 @ 来定义,和之前定义参数一样。
.border(@color){
border:1px solid @color;
}
h1{
&:hover{
.border(green);
}
}
h2{
&:hover{
.border(#000);
}
}
编译后的css文件
h1:hover {
border: 1px solid green;
}
h2:hover {
border: 1px solid #000;
}
4.5 带参数并且有默认值 (@参数:默认值)
方法:给带参数的混合添加默认值。 (@参数:默认值)
注意:有默认值的时候使用时可以带括号也可以不带括号。
less文件
// 带参数并且有默认值的混合
// (@color:red) (参数:默认值)
.border(@color:red){
border:1px solid @color;
}
h1{
&:hover{
// 有默认值的情况使用时可以写括号,也可以不写
// .border;
.border();
}
}
h2{
&:hover{
.border(#000);
}
}
编译后的css文件
h1:hover {
border: 1px solid red;
}
h2:hover {
border: 1px solid #000;
}
4.6 带多个参数的混合 ;
1.多个参数
1.1 什么是多参数
- 一个组合可以带多个参数,参数之间可以用分号或者逗号分隔
- 但是推荐使用分号分隔,因为逗号符号有两个意思。它可以解释为mixins参数分隔符或者css列表分隔符
1.2 官方阐述
- 两个参数,并且每个参数都是逗号分隔的列表:.name(1,2,3;something,ele)
- 三个参数,并且每个参数都包含一个数字:.name(1,2,3)
- 使用伪造的分号创建mixin,调用的时候参数包含一个逗号分割的css列表:.name(1,2,3;)
- 逗号分割默认值:.name(@param1:red,blue)
less代码
// 带多个参数的混合
/*带多个参数的混合*/
//
.mixin(@color; @padding:xxx; @margin:2){
color-3: @color;
padding-s: @padding;
margin:@margin @margin @margin @margin;
}
.divmaizi{
// 传入 @color ,其他两个使用默认值
.mixin(red);
}
.div{
// 传入 @color 为 1,2,3; @padding为something,ele; @margin使用默认值 2
.mixin(1,2,3;something,ele);
}
.div1{
// 三个参数用逗号分割;
// @color 为 1; @padding 为 2; @margin 为 3;
.mixin(1,2,3);
}
.div2{
// @color 为 1,2,3 其他的使用默认值
.mixin(1,2,3;);
}
// 如果传参的括号里面全部都是以逗号分隔,那么会依次传给各个参数值。
// 如果传参的括号里面既有逗号又有分号,那么会把分号前面看做一个整体,传给一个参数。
编译后的css文件
/*带多个参数的混合*/
.divmaizi {
color-3: red;
padding-s: xxx;
margin: 2 2 2 2;
}
.div {
color-3: 1, 2, 3;
padding-s: something, ele;
margin: 2 2 2 2;
}
.div1 {
color-3: 1;
padding-s: 2;
margin: 3 3 3 3;
}
.div2 {
color-3: 1, 2, 3;
padding-s: xxx;
margin: 2 2 2 2;
}
总结:
如果传参的括号里面全部都是以逗号分隔,那么会依次传给各个参数值。
如果传参的括号里面既有逗号又有分号,那么会把分号前面看做一个整体,传给一个参数。
2. 定义多个具有相同名称和参数数量的混合
定义多个具有相同名称和参数数量的mixins是合法的,less会使用它可以应用的属性,如果使用mixins的时候只带一个参数,比如 .mixin(green), 这个属性会导致所有的mixin都会强制使用这个明确的参数
less文件
.mixin(@color){
color-1:@color;
}
.mixin(@color;@padding:2){
color-2:@color;
padding-2: @padding;
}
// 如果 @padding 没有默认值,调用的时候就会执行该混合。
// 如果有 默认值就会执行。
.mixin(@color;@padding:2;@margin:2){
/*@padding 如果没有默认值就会导致该混合不编译*/
color-3:@color;
padding-3: @padding;
margin: @margin @margin @margin @margin;
}
.some .selector div{
.mixin(#008000);
}
变异后的css文件
.some .selector div {
color-1: #008000;
color-2: #008000;
padding-2: 2;
/*@padding 如果没有默认值就会导致该混合不编译*/
color-3: #008000;
padding-3: 2;
margin: 2 2 2 2;
}
4.7 命名参数
1.命名参数
引用mixin时可以通过参数名称而不是参数的位置来为mixin提供数值,任何参数都已通过它的名称来引用,这样就不必按照任意特定的顺序来使用参数。
less文件
// 命名参数
.mixin(@color:black;@margin:10px;@padding:20px){
color:@color;
margin: @margin;
padding: @padding;
}
.class{
// 根据变量的名称来赋值。
.mixin(@margin:20px, @color:#33acfe)
}
.class2{
.mixin(#efca44, @padding:40px);
}
.class3{
// 传给了第一个
.mixin(80px);
}
编译后的css文件
.class {
color: #33acfe;
margin: 20px;
padding: 20px;
}
.class2 {
color: #efca44;
margin: 10px;
padding: 40px;
}
.class3 {
color: 80px;
margin: 10px;
padding: 20px;
}
通过变量名称来赋值,不根据赋值的位置来确定。
4.8 @arguments变量
1.什么是 arguments变量
arguments代表所有的可变参数
注意:
- @arguments代表所有可变参数,参数的先后顺序就是你的 () 括号内 的参数的先后顺序。
- 注意在使用的属性,值的位置和个数也是一一对应的,只有一个值,把值赋值给第一个;两个值,赋值给第一个和第二个;三个值,分别赋给三个... 以此类推,但是需要注意的是假如我想给第一个和第三个赋值,你不能写 (值1, , 值3), 必须把原来的默认值写上去。
less文件
// @arguments
.border(@x:solid,@c:red){
// 之前是这样写 border:21px @x @c;
// @arguments 按传入的参数的顺序添加
border:21px @arguments;
}
div{
.border();
}
编译后的css文件
div {
border: 21px solid red;
}
4.9 匹配模式
1.说明
传值的时候定义一个字符,在使用的时候使用那个字符,就调用哪条规则。
less文件
.border(all, @w:5px){
border-radius: @w;
}
.border(t_l, @w:5px){
border-top-left-radius: @w;
}
.border(t_r, @w:5px){
border-top-right-radius: @w;
}
.border(b_l, @w:5px){
border-bottom-right-radius: @w;
}
.border(b_r, @w:5px){
border-bottom-right-radius: @w;
}
footer{
// all 对应 all规则
.border(all,10px);
// t_r 对应t_r规则
.border(t_r,10px);
background-color: #33acfe;
}
编译后的css文件
footer {
border-radius: 10px;
border-top-right-radius: 10px;
background-color: #33acfe;
}
4.10 得到混合中变量的返回值
对传入的参数进行运算,可以通过定义变量的形式把运算结果传出来。
less文件
.average(@x;@y){
// 定义变量
@he:@x + @y;
@average: ((@x+@y)/2);
}
div{
.average(16px, 50px);
// 使用变量
padding: @average;
margin: @he;
}
编译后的css文件
div {
padding: 33px;
margin: 66px;
}
5.嵌套规则(nested-rules)
6.运算(operations)
7.函数(functions)
8.命名空间
9.作用域
10.引入(importing)
11.关键字(important)
12.条件表达式
13.循环(loop)
14.合并属性
15.函数库(function)
持续更新中.......