课程目标
1、学会正确的使用LESS中的变量、混合、嵌套、运算、函数、作用域、条件表达式。
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{
padding-left: 15px;
height: 24px;
line-height: 24px;
background: url("arr.jpg") no-repeat center left;
}
.conten li a{
color: #535353;
text-decoration: none;
font-family: "microsoft sans serif", "黑体";
}
less写法:
//less中的嵌套语法
.conten {
ul{
list-style: none;
li{
padding-left: 15px;
height: 24px;
line-height: 24px;
background: url("arr.jpg") no-repeat center left;
a{
color: #535353;
text-decoration: none;
font-family: "microsoft sans serif", "黑体";
}
}
}
}
1.4 LESS中的注释
// 以//开始的注释,不会被编译到css文件中。 /**/ 以/**/包裹的注释会被编译在css的文件中。
2. 正确使用LESS
2.1 如何使用LESS
LESS文件只有在被编译后才能够被浏览器识别使用。
2.2 LESS编译工具
1、Less编译工具有三个
-
Koala
国人开发的全平台的LESS编译工具
网址:koala-app.com/ -
WinLess
Windows下的LESS编译软件
网址: www.winless.org/ -
CodeKit
MAC平台下的的LESS编译软件
网址: incident57.com/codekit/ind…
2、Koala的基本使用
1 . 官网下载,安装很简单。
2 . 将项目 拖到 Koala,即可导入项目。
3 . 选中一个 .less文件,点击“执行编译”,就会在同一个目录下,生成对应的 .css 文件。
2.3 客户端调试方式
在浏览器环境中使用 Less :
1、首先引用 .less 文件。
注意引用时使用link引入,然后将rel属性设置为rel="stylesheet/less"。
2、然后引用 less.js 。
注意:引入普通js引入方式一致,但是一定要放置在less样式文件之后!
<link rel="stylesheet/less" type="text/css" href="styles.less" />
<script src="//cdnjs.cloudflare.com/ajax/libs/less.js/3.11.1/less.min.js" ></script>`
缺点:无法查看编译后的.css文件。推荐使用Koala。
3. 变量(variables)
LESS中,通过添加前缀@,来定义一个变量。
@变量名 = 值;
3.1 普通的变量
普通变量 保存的是 css属性的取值,如颜色值,关键字等。
1.变量的定义方式
@变量名 : 值;
2.示例
less编写
@bgColor: #5B83AD;
@fontColor: white;
#header{
color: @fontColor;
background-color: @bgColor;
}
编译结果
#header {
color: #ffffff;
background-color: #5b83ad;
}
3.注意由于变量只能定义一次,实际上他们就是"常量"。
3.2 作为选择器和属性名
变量 保存的是 css的选择器名 或 属性名。
1.使用时将变量以 @{变量名} 的方式使用。
2.示例
less编写
@mySelector: active;
@activeProperty: color;
.@{mySelector}{
@{activeProperty}: red;
}
编译结果
.active {
color: red;
}
3.3 作为URL
1.定义时,使用 "" 将变量的值扩起来,使用时同样将变量以 @{变量名} 的方式使用。
2.示例
less编写
@imgUrl: "http://www.abc.com/imgs/pic1.png";
.item{
background: url("@{imgUrl}") no-repeat;
}
编译结果
.item {
background: url("http://www.abc.com/imgs/pic1.png") no-repeat;
}
3.4 延迟加载
什么是延迟加载? 变量是延迟加载的,在使用前不一定要预先声明。
示例:
less编写
.box{
width: @aaa;
}
@aaa: @bbb;
@bbb: 100px;
编译结果
.box {
width: 100px;
}
3.5 定义多个相同名称的变量时
在定义一个变量两次时,只会使用最后定义的变量。
Less会从当前作用域中向上搜索。
这个行为类似于CSS的定义中始终使用最后定义的属性值。
示例:
less编写
@var: 10px;
.aaa{
@var: 20px;
.bbb{
@var: 30px;
height: @var;
@var: 40px;
}
width: @var;
}
编译结果
.aaa {
width: 20px;
}
.aaa .bbb {
height: 40px;
}
4. 混合(mixins)
什么是混合? 混合就是一种将一系列属性从一个规则集引入("混合")到另一个规则集的方式。
语法:在一个规则集中,不仅可以写具体的样式,还可以写其它规则集的名字,形成嵌套关系。编译后,子规则集中的样式就会被复制到当前规则集中。
应用场景:将一些公共的样式放在一个规则集中,通过混入来复用到其它规则集中。
4.1 普通混合
示例:
less编写
.bordered{
border-top: dotted 1px black;
border-bottom: solid 2px pink;
}
.box{
.bordered; //混入 .bordered 规则集
color: white;
}
编译结果
.bordered {
border-top: dotted 1px black;
border-bottom: solid 2px pink;
}
.box {
border-top: dotted 1px black;
border-bottom: solid 2px pink;
color: white;
}
4.2 不输出的混合
什么是不输出的混合? 如果你想要创建一个混合集,但是却不想让它输出到的css文件中。
语法:在类名 后面添加一个 圆括号()。
编译结果:带圆括号后缀的类 不会被 输出到 编译后的css文件中。
示例:
less语句
.my-mixin{
color: pink;
}
.my-other-mixin(){ //不会被输出
font-size: 30px;
}
.box{
.my-mixin;
.my-other-mixin;
}
编译结果
.my-mixin {
color: pink;
}
.box {
color: pink;
font-size: 30px;
}
4.3 带选择器的混合
什么是带选择器的混合?即一个混合的内容中包含子选择器,而不只是一条条具体的样式。
&符号:表示父级选择器。
示例:
less语句
.my-hover-mixin(){ //不输出混合
&:hover{
color: #333;
}
}
.my-other-hover-mixin{ //输出混合
&:hover{
font-size: 30px;
}
}
.active{
.my-hover-mixin;
}
.other-active{
.my-other-hover-mixin;
}
编译结果
.my-other-hover-mixin:hover {
font-size: 30px;
}
.active:hover {
color: #333;
}
.other-active:hover {
font-size: 30px;
}
4.4 带参数的混合
语法:定义时,圆括号中定义形参。 使用时,圆括号中传入实际的值。
类名(形参){
//具体的样式规则
}
示例:
less语句
.border(@border_color){
border: solid 1px @border_color;
}
.box {
.border(#333)
}
编译结果
.box {
border: solid 1px #333333;
}
4.5 带参数并且有默认值
语法:在形参的后面跟上 冒号:默认值 。
示例:
less语句
.border(@border_color: #666){
border: solid 1px @border_color;
}
.box1 {
.border(#333); //传入实参
}
.box2 {
.border(); //不传实参
}
编译结果
.box1 {
border: solid 1px #333333;
}
.box2 {
border: solid 1px #666666;
}
4.6 带多个参数的混合
什么是多参数?
一个集合可以带多个参数,参数之间可以用分号或者逗号分割。但是推荐使用分号分割,因为逗号符号有两个意思。它可以解释为mixins参数分隔符或者css列表分隔符。
多参数时,参数的分割方式 决定 参数的传递方式:
1)如果实参都是以逗号分割的,则会依次传给各个形参。
2)如果实参分割符既有逗号,又有分号,那么,会把分号前面的看作一个整体,传给一个形参。
示例:
less语句
.mixin(@color; @padding:10px; @margin:20px){
color: @color;
padding: @padding;
margin: @margin;
}
.box1{
.mixin(#ccc;)
}
.box2{
.mixin(#666; 30px; 40px)
}
.box3{
.mixin(1,2,3; 4,5,6)
}
.box4{
.mixin(1,2,3)
}
.box5{
.mixin(1,2,3;)
}
编译结果
.box1 {
color: #cccccc;
padding: 10px;
margin: 20px;
}
.box2 {
color: #666666;
padding: 30px;
margin: 40px;
}
.box3 {
color: 1, 2, 3;
padding: 4, 5, 6;
margin: 20px;
}
.box4 {
color: 1;
padding: 2;
margin: 3;
}
.box5 {
color: 1, 2, 3;
padding: 10px;
margin: 20px;
}
定义多个具有相同名称和参数数量的混合(这部分好像有点问题!!!)
定义多个具有相同名称和参数数量的mixins是合法的。Less会使用它可以应用的属性。如果使用mixin的时候只带一个参数,比如.mixin(green),这个属性会导致所有的mixin都会使用强制使用这个明确的参数。
示例
less语句
.mixin(@color){
color-1: @color;
}
.mixin(@color; @padding: 10px){
color-2: @color;
padding-2: @padding;
}
.mixin(@color; @padding; @margin: 20px){
color-3: @color;
padding-3: @padding;
margin-3: @margin @margin @margin @margin;
}
.wrapper .content .title{
.mixin(#666);
}
编译结果
.wrapper .content .title {
color-1: #666666;
color-2: #666666;
padding-2: 10px;
}
4.7 命名参数
什么是命名参数?
引用mixin时,可以通过参数名称而不是参数的位置来为mixin提供参数值。任何参数都已通过它的名称来引用,这样就不必按照任意特定的顺序来使用参数
示例:
less语句
.mixin(@color:black; @margin:10px; @padding: 20px){
color: @color;
margin: @margin;
padding: @padding;
}
.class1{
.mixin(@margin:20px; @color: #672341)
}
.class2{
.mixin(#234231; @padding: 40px)
}
编译结果
.class1 {
color: #672341;
margin: 20px;
padding: 20px;
}
.class2 {
color: #234231;
margin: 10px;
padding: 40px;
}
4.8 arguments变量
什么是@arguments变量? @arguments 代表所有的可变参数。
1)@arguments的参数的先后顺序就是你的()括号内的参数的先后顺序。
2)传递实参时,值得位置和个数也是一一对应的。只有一个值,把值赋值给第一个;两个值,赋值给第一个和第二个;三个值,分别赋值给前三个,以此类推。但是如果想给第一个和第三个赋值,你不能写(值1, ,值3),必须把原来的默认值写上去!
示例1:
less语句
.border(@type:solid; @color:red){
border: 10px @arguments;
}
.box1 {
.border();
}
编译结果
.box1 {
border: 10px solid #ff0000;
}
示例2:
less语句
.border(@width: 10px; @type:solid; @color:red){
border: @arguments;
}
.box1 {
.border(20px);
}
.box2 {
.border(20px, dotted);
}
.box3 {
//如果写成 .border(20px, , green); 则会报错。
.border(20px, solid, green);
}
编译结果
.box1 {
border: 20px solid #ff0000;
}
.box2 {
border: 20px dotted #ff0000;
}
.box3 {
border: 20px solid #008000;
}
4.9 匹配模式
什么是匹配模式? 传值的时候定义一个字符,在使用的时候使用那个字符,就调用那条规则。
简单理解:存在多个同名的规则集时,为了区分它们,需要在形参列表中添加一个名字,来唯一标识当前的规则集。使用时,实参列表第一个必须是规则集名字,才能准确知道使用的是哪一个规则集,其它实参则传给形参。
1)如果定义了多个名字相同的混合,虽然名字相同,但是它们设置了不同的样式。为了在使用时能够区分它们,需要在参数列表的第一位,添加一个字符,来唯一标识当前的混合。这个 标识变量 是不带@符号的,而 形参变量 是带@符号的。
2)使用混合时,第一个传入的是标识变量,它解决使用哪一个混合,其它参数则传入的是实参值。
示例:
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-left-radius: @w;
}
.border(b_r, @w:5px){
border-bottom-right-radius: @w;
}
.box1{
.border(all)
}
.box2{
.border(all, 20px)
}
.box3{
.border(t_l);
.border(b_r);
}
.box4{
.border(t_l, 20px);
.border(t_r, 30px);
.border(b_l, 40px);
.border(b_r, 50px);
}
编译结果
.box1 {
border-radius: 5px;
}
.box2 {
border-radius: 20px;
}
.box3 {
border-top-left-radius: 5px;
border-bottom-right-radius: 5px;
}
.box4 {
border-top-left-radius: 20px;
border-top-right-radius: 30px;
border-bottom-left-radius: 40px;
border-bottom-right-radius: 50px;
}
默认携带参数 (这部分视频中没有讲!!!)
4.10 带返回值的混合
如果一个规则集的花括号{}中,定义了变量,则这个变量称为当前规则集的返回值。
混入时,子规则集中定义的变量 可以在父规则集 花括号{}中使用。
示例:
less语句
.average(@x, @y){
@average:((@x + @y)/2);
}
.box {
.average(16px, 50px);
padding: @average;
}
编译结果
.box {
padding: 33px;
}
实例分析
1.首先将16px和50px赋值给混合.average进行计算;
2.将计算的结果赋值给变量@average;
3.然后再div中调用average的值;
4.编译后就得到了average的值33px;
5. 嵌套规则(nested-rules)
1、什么是嵌套规则?嵌套规则它模仿了HTML的结构,让我们的css代码更加简洁明了清晰。
示例:
传统css写法
#header{
color: black;
}
#header .navigation{
font-size: 12px;
}
#header .logo{
width: 300px;
}
less嵌套写法
#header{
color: black;
.navigation{
font-size: 12px;
}
.logo{
width: 300px;
}
}
2、父元素选择器 &
& 表示当前选择器的所有父选择器。
示例:
传统写法
.bgcolor{
background: #666666;
}
.bgcolor a{
color: #333333;
}
.bgcolor a:hover{
color: #eeeeee;
}
less写法
.bgcolor{
background: #666666;
a{
color: #333333;
&:hover{
color: #eeeeee;
}
}
}
3、改变选择器的顺序:将&放到当前选择器之后,就会将当前选择器插入到所有的父选择器之前。
示例
less语句
ul{
font-size: 10px;
li{
.item &{
color: #333333;
}
}
}
编译结果
ul {
font-size: 10px;
}
.item ul li {
color: #333333;
}
4、组合使用生成所有可能的选择器列表
语法:使用两个连续的&。
示例:
less语句
ul, li, p, a{
color: #666666;
& & {
font-size: 20px;
}
}
编译结果
ul,
li,
p,
a {
color: #666666;
}
ul ul,
ul li,
ul p,
ul a,
li ul,
li li,
li p,
li a,
p ul,
p li,
p p,
p a,
a ul,
a li,
a p,
a a {
font-size: 20px;
}
6. 运算(operations)
任何数值,颜色和变量都可以进行运算。
6.1 数值型运算
less会为你自动推断数值的单位,所以你不必每一个值都加上单位,但至少要有一个值带单位。
注意:运算符与值之间必须以空格分开,涉及优先级时以()进行优先级运算。
示例:
less语句
.class1{
width: 20px + 10;
}
编译结果
.class1 {
width: 30px;
}
6.2 颜色值运算
less在运算时,先将颜色值转换为rgb模式进行运算,最后再转换为16进制的颜色值并且返回。
注意:
1、既然是转换为rgb模式,我们知道rgb的取指范围是0~255,所以我们计算的时候不能超过这个区间,超过后默认使用最大值255计算!同理,如果为负数,则按最小值0计算。
2、不能使用颜色名,如red等。
示例:
less语句
.bg{
background: #000000 + 21;
}
编译结果
.bg {
background: #151515;
}
分析:
#000000 --> rgb(0, 0, 0)
#151515 --> rgb(21,21,21)
rgb(0, 0, 0) + 21 === rgb(21,21,21)
7. 函数(functions)
Less提供了许多用于转换颜色,处理字符串和进行算术运算的函数,这些函数使用起来非常简单。
如:颜色转换函数:
rgb()函数:将rgb模式的值转换为16进制的值。
blue()函数:提取蓝色值。
示例:
less语句
.bgColor{
background: rgb(12, 34, 56);
}
.bgColor2{
background: blue(#0c2238);
}
编译结果
.bgColor {
background: #0c2238;
}
.bgColor2 {
background: 56;
}
8. 命名空间
什么是命名空间?将一些需要的混合组合在一起,可以通过嵌套多层id或者class来实现!
示例:
less语句
#bgColor(){
background: #123456;
.a{
color: #333333;
&:hover{
color: #666666;
}
.b{
font-size: 20px;
}
}
}
.box{
background: #654321;
#bgColor>.a;
}
.box2{
#bgColor>.a>.b;
}
编译结果
.box {
background: #654321;
color: #333333;
}
.box:hover {
color: #666666;
}
.box .b {
font-size: 20px;
}
.box2 {
font-size: 20px;
}
省略>写法
可以省略表示嵌套关系的大于号>。如 .a > .b
等同于 .a .b
。
示例:
less语句
#bgColor(){
background: #111111;
.a{
color: #2222222;
&:hover{
color: #333333;
}
.b{
font-size: 20px;
}
}
}
.box{
background: #444444;
#bgColor .a;
}
.box2{
#bgColor .a .b;
}
编译结果
.box {
background: #444444;
color: #2222222;
}
.box:hover {
color: #333333;
}
.box .b {
font-size: 20px;
}
.box2 {
font-size: 20px;
}
9. 作用域
什么是作用域?
Less中的作用域与编程语言中的作用域概念非常相似。首先会在局部查找变量和混合,如果没找到,编译器就会在父作用域中查找,依次类推。
示例:
less语句
@color: #111111;
.class1{
width: 10px;
.class2{
color: @color;
}
@color: #222222;
}
编译结果
.class1 {
width: 10px;
}
.class1 .class2 {
color: #222222;
}
10. 引入(@import)
10.1 基础语法
1、什么是引入? 你可以引入一个或多个.less文件,然后这个文件中的所有变量都可以在当前的less项目中使用!
2、注意:
1 . .less文件可以引用其它.less文件,可以使用它的变量,也可以使用它的类进行混入。
2 . .less文件可以引用.css文件,但是不能使用它的类进行混入。而且.css文件的样式不会被复制到编译后的css文件中,而只是保留它的导入语句。
◎示例1:
common.less
.class1{
color: 333333;
}
@bg: #FBFBFB;
index.less
@import "./common.less";
.box{
background: @bg;
.class1;
}
编译结果 index.css
.class1 {
color: 333333;
}
.box {
background: #fbfbfb;
color: 333333;
}
◎示例2:
global.css
.active{
color: #666666;
}
index.less
@import "global.css"; //引入css文件时,不会复制其样式,只保留其导入语句。
编译结果
index.css
@import "global.css";
◎示例3:
global.css
.active{
color: #666666;
}
index.less
@import "global.css";
.box{
//.active; //不能混入.css文件中的类
}
10.2 引入模式
3、引入模式
导入less文件时,可以添加一个参数,来设置导入模式。语法:
@import (导入模式) "xxx.less";
参数 | 说明 |
---|---|
once | 默认,只包含一次。 |
reference | 使用Less文件但不输出。 |
inline | 在输出中包含源文件但不加工它。 |
less | 将文件作为Less文件对象,无论是什么文件扩展名。 |
css | 将文件作为CSS文件对象,无论是什么文件扩展名。 |
multiple | 允许引入多次相同文件名的文件。 |
◎示例1:refrence参数。
common.less
@bg: #FBFBFB;
.class1{
color: 333333;
}
index.less
@import (reference) "./common.less"; //reference方式
.box{
background: @bg;
.class1;
}
编译结果
index.css
.box {
background: #fbfbfb;
color: 333333;
}
结论:以reference方式引入less文件时,它的样式不会输出到编译后的css文件中。
◎示例2:inline参数。
common.less
@bg: #FBFBFB;
.class1{
color: 333333;
}
index.less
@import (inline) "./common.less"; //inline方式
.box{
padding: 10px;
// background: @bg;
// .class1;
}
编译结果
index.css
@bg: #FBFBFB;
.class1{
color: 333333;
}
.box {
padding: 10px;
}
结论:以inline方式引入less文件时,不能使用它里面的类进行混入,也不能使用它的变量。而且它的类、变量被会原样输出到编译后的css文件中。
◎示例3:less参数。
global.css
.active{
font-size: 10px
}
index.less
@import (less) "./global.css";
.box{
.active;
}
编译结果
index.css
.active {
font-size: 10px;
}
.box {
font-size: 10px;
}
结论:以less方式引入其它样式文件时,不管它后缀名是什么,都当作less来进行处理。
示例4:css参数。
common.less
@bg: #FBFBFB;
.class1{
color: 333333;
}
index.less
@import (css) "./common.less";
.box{
//background: @bg;
//.class1;
}
编译结果
index.css
@import "common.less";
示例5:multiple参数。
common.less
@bg: #FBFBFB;
.class1{
color: 333333;
}
index.less
@import (multiple) "./common.less";
@import (multiple) "./common.less";
@import (multiple) "./common.less";
.box{
background: @bg;
.class1;
}
编译结果
index.css
.class1 {
color: 333333;
}
.class1 {
color: 333333;
}
.class1 {
color: 333333;
}
.box {
background: #fbfbfb;
color: 333333;
}
结论:以multiple方式引入less文件时,可以引入多次名字相同的文件。如果是同一个文件,则编译后,它的样式会重复输出多次。
11. 关键字(!important)
什么是 !important 关键字?在调用的混合集后面追加!important关键字,可以使混合集里面的所有属性都继承!important。
◎示例:
less语句
.foo(@margin: 10px; @padding: 20px){
margin: @margin;
padding: @padding;
}
.class1{
.foo();
}
.class2{
.foo() !important;
}
编译结果
.class1 {
margin: 10px;
padding: 20px;
}
.class2 {
margin: 10px !important;
padding: 20px !important;
}
12. 条件表达式
常用运算符:<、>、>=、=、=<、true
注意: 1、运算符的左右需要空格。
应用场景:
1 . 带条件的混合
when关键字:指定混合的生效条件。
2 . 类型检查函数
可以基于的得类型来匹配函数。
常用的类型检查函数: iscolor、 isnumber、 isstring、 iskeyword、 isurl
3 . 单位检查函数
检查一个值除了数字是否是一个特点的单位。
常用的单位检查函数: ispixel、 ispercentage、 isem、 isunit
◎示例1:带条件的混合。
less语句
.mixin (@a) when (lightness(@a) >= 50%){
background-color: white;
}
.mixin (@a) when (lightness(@a) < 50%){
background-color: black;
}
.mixin (@a){
color: @a;
}
.class1{
.mixin(#ddd)
}
.class2{
.mixin(#555)
}
编译结果
.class1 {
background-color: white;
color: #dddddd;
}
.class2 {
background-color: black;
color: #555555;
}
分析:
lightness()函数:返回颜色的亮度值,0%~100%。
◎示例2:类型检查函数。
less语句
.mixin (@a) when (isnumber(@a)){
background-color: white;
}
.mixin (@a) when (iscolor(@a)){
background-color: black;
}
.mixin (@a){
color: @a;
}
.class1{
.mixin(#333333)
}
.class2{
.mixin(111)
}
编译结果
.class1 {
background-color: black;
color: #333333;
}
.class2 {
background-color: white;
color: 111;
}
◎ 示例3:单位检查函数。
less语句
.mixin (@a) when (ispixel(@a)){
padding-left:10px;
}
.mixin (@a) when (ispercentage(@a)){
padding-right:10px;
}
.mixin (@a){
width: @a;
}
.class1{
.mixin(10px)
}
.class2{
.mixin(10%)
}
编译结果
.class1 {
padding-left: 10px;
width: 10px;
}
.class2 {
padding-right: 10px;
width: 10%;
}
13. 循环(loop)
在Less中,混合可以调用它自身。这样,当一个混合递归调用自己,再结合Guard表达式和模式匹配这两个特性,就可以写出循环结构。
语法:
1、使用when关键字 指定循环条件。
2、必须设置退出循环的条件。
3、递归调用。
◎示例1:
less语句
.loop (@counter) when (@counter>0){
width:(10px * @counter); //每次调用时产生的样式代码
.loop((@counter - 1)); //递归调用自身
}
.box{
.loop(5); //调用循环
}
编译结果
.box {
width: 50px;
width: 40px;
width: 30px;
width: 20px;
width: 10px;
}
◎示例2:
less语句
.loop (@counter) when (@counter>0){
h@{counter} {
font-size: @counter*10px; //每次调用时产生的样式代码
}
.loop((@counter - 1)); //递归调用自身
}
.box{
.loop(6); //调用循环
}
编译结果
.box h6 {
font-size: 60px;
}
.box h5 {
font-size: 50px;
}
.box h4 {
font-size: 40px;
}
.box h3 {
font-size: 30px;
}
.box h2 {
font-size: 20px;
}
.box h1 {
font-size: 10px;
}
14. 合并属性
1、+号:合并属性时,使用逗号分割。
说明:在需要合并的属性的 :
的前面加上 +
就可以完成合并,合并以 ,
分割顺序。
2、+_号:空合并属性时,使用空格分隔。
◎示例1:+号。
less语句
.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;
}
◎示例2:+_号
less语句
.a(){
background+_: #333333;
background+_: url("./xxx.png");
}
.class1{
.a();
}
编译结果
.class1 {
background: #333333 url("xxx.png");
}
15. 函数库(function)
1、其他函数
函数 | 作用 |
---|---|
color()函数 | 解析颜色,将代表颜色的字符串转换为颜色值。 |
convert()函数 | 将数字从一种类型转换到另一种类型。 |
data-uri()函数 | 将一个资源内嵌到样式文件,如果开启了ieCompat选项,而且资源文件的体积过大,或者是在浏览器中使用,则会使用url()进行回退。如果没有指定MIME,则Node.js会使用MIME包来决定正确的MIME。 |
default()函数 | 只能边界条件中使用,没有匹配到其他自定义函数( mixin )的时候返回true,否则返回false。 |
unit()函数 | 移除或者改变属性值的单位。 |
1 . convert()函数
参数1:转换前的单位
参数2:转换后的单位
转换前的单位和转换后的单位 必须是兼容的,即同一种类型的单位才可以相互转换。
单位分类:
1)长度单位:m、cm、mm、in、pt、px、pc
2)时间单位:s、ms
3)角度单位:rad 弧度、deg 度、grad 梯度、turn 圆
2 . data-uri()函数
作用:将引入的资源转换为base64字符串,内嵌到html文件中。
注意:Koala软件 无法处理data-uri()函数,可以使用其它工具,如WindLess。
3 . default()函数
作用:混入时,如果没有找到名字匹配的规则集,则使用default()函数定义的规则集。
4 . unit()函数
- 如果只传入一个参数,而且是带单位的值,则会移除单位,只保留数字。
- 如果传入两个参数,第一个是带单位的值,第二个是另一个单位,则会进行单位的转换。
- 如果传入两个参数,第一个是不带单位的值,第二个是单位,则会将数字和单位合并。
示例1:color()函数。
.class{
background: color("#333333");
}
.class {
background: #333333;
}
示例2:convert()函数。
.box{
width: convert(10cm, px);
}
.box {
width: 377.95275591px;
}
示例3:data-uri()函数。
示例4:default()函数。
//.x一共有三个匹配模式:1、2、default
.x(1){
padding: 10px;
}
.x(2){
padding: 20px;
}
.x(@foo) when (default()){
padding: @foo;
}
.box1{
.x(1)
}
.box2{
.x(30px)
}
--->
.box1 {
padding: 10px;
}
.box2 {
padding: 30px;
}
示例5:default()函数。
.x(@foo) when (ispixel(@foo)){
width: @foo;
}
.x(@foo) when not(default()){
width: (@foo/2);
}
.box1{
.x(100px);
}
.box2{
color: red;
.x(100cm);
}
--->
.box1 {
width: 100px;
width: 50px;
}
.box2 {
color: red;
}
示例6:unit()函数。
.box{
width: unit(10px, cm);
height: unit(20, px);
padding: unit(30px);
}
--->
.box {
width: 10cm;
height: 20px;
padding: 30;
}
2、字符串函数
1 . escape()函数
将输入字符串中的url特殊字符进行编码处理。
不转移的编码:, / ? @ & + - ' ~ ! $
转义的编码:# ^ ( ) { } | : > < ; ] [ =
2 . e()函数
作用:避免编译,即传入e()函数的内容不需要使用less进行编译,原样输出即可。
e()函数 可以使用 波浪号~ 代替。
即:e('不希望被less编译的内容') === ~'不希望被less编译的内容'
3 . %()函数
函数%(string, arguments ...)格式化一个字符串。
参数1:指定格式化规则。不同的占位符表示不同的格式化规则。
其它参数:按照参数1指定的规则进行字符串格式化,其它参数会被格式化、合并到一个字符串中。
4 . replace()函数
用另一个字符串替换文本。
◎示例1:escape()函数。
div{
a: escape('#-^-(-)-{-}-|-:->-<-;-]-[-=')
}
--->
div {
a: %23-%5E-%28-%29-%7B-%7D-%7C-%3A-%3E-%3C-%3B-%5D-%5B-%3D;
}
◎示例2:e()函数。
div{
filter: e("ms:alwaysHasltsOwnSyntax.For.Stuff()");
//下面的语法等同于上面的语法
//filter: ~"ms:alwaysHasltsOwnSyntax.For.Stuff()";
}
--->
div {
filter: ms:alwaysHasltsOwnSyntax.For.Stuff();
}
◎示例3:e()函数。
.box1{
width: calc(100px-10px);
}
.box2{
width: e('calc(100px-10px)');
//等同于
//width: calc(~'100px-10px');
}
--->
.box1 {
width: calc(90px);
}
.box2 {
width: calc(100px-10px);
}
分析:在使用css calc()函数时,less默认会将传给calc()函数的表达式进行编译,然后再将编译后的结果传给css文件中的calc()函数,很明显这是错误的。此时,可以使用e()函数来避免less编译。
◎实例3:%()函数。
.box1{
font-family: %("%a %a", "Microsoft", "YaHei");
}
.box2{
font-family: %("%A %a", "Microsoft", "YaHei");
}
--->
.box1 {
font-family: ""Microsoft" "YaHei"";
}
.box2 {
font-family: "%22Microsoft%22 "YaHei"";
}
◎示例4:replace()函数。
.box{
color: replace("hello, world", "world", "less");
}
--->
.box {
color: "hello, less";
}
3、长度相关函数
1 . length()函数
返回集合中的值的条数。
2 . extract()函数
返回集合中指定索引的值。
◎示例1:length()函数。
length(1px solid #333333)
--->
3
@list: "banana", "tomato", "potato", "peach";
n: length(@list);
--->
n: 4;
◎示例:extract()函数。
Example: `extract(8px dotted red, 2);`
Output: `dotted`
Example:
@list: apple, pear, coconut, orange;
value: extract(@list, 3);
Output:
value: coconut;
4、数学函数
1.ceil()函数
向上取整。不管小数位是多少,都加+1,向上取整。
2.floor()函数
向下取整
3.percentage()函数
将浮点数转换为百分比
4.round)函数
取整和四舍五入
5.sqrt()函数
计算一个数的平方根,原样保持单位。
6.abs()函数数
计算数字的绝对值,原样保持单位。
7.sin()函数
正弦函数
8.asin()函数
反正弦函数
9.cos()函数
余弦函数
10.acos)函数
反余弦函数
11.tan()函数
正切函数
12.atan()函数
反正切函数
13.pi()函数
返回π(pi);
14.pow()函数
乘方运算
15.mod)函数
取余运算
16.min()函数
最小值运算
17.max()函数
最大值运算
5、类型函数
函数 | 作用 |
---|---|
isnumber()函数 | 如果一个值是一个数字,返回‘真(true)",否则返回"假(false)" |
isstring()函数 | 如果一个值是一个字符串,返回真(true)",否则返回′假(false)" |
iscolor()函数 | 如果一个值是一个颜色,返回'真(true)",否则返回′假(false)" |
iskeyword()函数 | 如果一个值是一个关键字,返回"真(true)',否则返回"假(false)". |
isurl()函数 | 如果一个值是一个url地址,返回'真(true)",否则返回'假(false) |
ispixel()函数 | 如果一个值是带像素长度单位的数字,返回"真(true)',否则返回'假(false)". |
isem()函数 | 如果一个值是带em长度单位的数字,返回"真(true)",否则返回'假(false) |
ispercentage()函数 | 如果一个值是带百分比单位的数字,返回'真(true)',否则返回'"假(false)"'. |
isunit()函数 | 如果一个值是带指定单位的数字,返回'真(true)",否则返回'假(false)". |
6、颜色值定义函数
函数 | 作用 |
---|---|
rgb()函数 | 通过十进制红色,绿色,蓝色三种值(RGB)创建不透明的颜色对象。 |
rgba()函数 | 通过十进制红色,绿色,蓝色,以及alpha四种值(RGBA)创建带alpha透明的颜色对象。 |
argb()函数 | 创建格式为#AARRGGBB的十六进制(hex representation)颜色(注意不是#RRGGBBAA ! ). |
hls()函数 | 通过色相(hue),饱和度(saturation),色调(value)三种值(HSV)创建不透明的颜色对象。 |
hsla)函数 | 通过十进制红色,绿色,蓝色,以及alpha四种值(RGBA)创建带alpha透明的颜色对象。 |
hsv()函数 | 通过色相(hue),饱和度(saturation),色调(value)三种值(HSV)创建不透明的颜色对象。 |
hsva()函数 | 通过色相(hue),饱和度(saturation),色调(value),以及alpha 四种值(HSVA)创建透明的颜色对象。 |
7、颜色值通道提取函数
函数 | 作用 |
---|---|
hue()函数 | 从HSL色彩空间中提取颜色对象的色相值。 |
saturation()函数 | 从HSL色彩空间中提取颜色对象的饱和度值。 |
lightness()函数 | 从HSL色彩空间中提取颜色对象的亮度值。 |
hsvhue()函数 | 从HSV色彩空间中提取颜色对象的色相值。 |
hsvsaturation()函数 | 从HSV色彩空间中提取颜色对象的饱和度值。 |
hsvvalue()函数 | 从色彩空间中提取颜色对象的色调值。 |
red()函数 | 提取颜色对象的红色值。 |
green()函数 | 提取颜色对象的绿色值。 |
blue()函数 | 提取颜色对象的蓝色值。 |
alpha()函数 | 提取颜色对象的透明值。 |
luma()函数 | 计算颜色对象luma的值(亮度的百分比表示法)。 |
luminance()函数 | 计算没有伽玛校正的亮度值。 |
8、颜色值运算函数
函数 | 作用 |
---|---|
saturate()函数 | 增加一定数值的颜色饱和度。 |
desaturate()函数 | 降低一定数值的颜色饱和度。 |
lighten()函数 | 增加一定数值的颜色亮度。 |
darken()函数 | 降低一定数值的颜色亮度。 |
fadein()函数 | 降低颜色的透明度(或增加不透明度),令其更不透明。 |
fadeout()函数 | 增加颜色的透明度(或降低不透明度),令其更透明。 |
fade()函数 | 给颜色(包括不透明的颜色)设定一定数值的透明度。 |
spin()函数 | 任意方向旋转颜色的色相角度(hue angle)。 |
mix()函数 | 根据比例混合两种颜色,包括计算不透明度。 |
greyscale()函数 | 完全移除颜色的饱和度,与desaturate(@color, 100%)函数效果相同。 |
contrast()函数 | 选择两种颜色相比较,得出哪种颜色的对比度最大就倾向于对比度最大的颜色。 |
9、颜色混合函数
函数 | 作用 |
---|---|
multiply)函数 | 分别将两种颜色的红绿蓝(RGB)三种值做乘法运算,然后再除以255,输出结果是更深的颜色。(译注:对应Photoshop中的“变暗/正片叠底"。) |
screen()函数 | 与multiply()函数效果相反,输出结果是更亮的颜色。(译注:对应Photoshop中的"变亮/滤色”。) |
overlay()函数 | 结合multiply)与screen()两个函数的效果,令浅的颜色变得更浅,深的颜色变得更深。(译注:对应Photoshop中的“叠加"。)注意:输出结果由第一个颜色参数决定。 |
softlight()函数 | 与overlay()函数效果相似,只是当纯黑色或纯白色作为参数时输出结果不会是纯黑色或纯白色。(译注:对应Photoshop中的“柔光”。) |
hardlight(函数 | 与overlay()函数效果相似,不过由第二个颜色参数决定输出颜色的亮度或黑度,而不是第一个颜色参数决定。(译注:对应Photoshop中的“强光/亮光/线性光/点光"。) |
difference()函数 | 从第一个颜色值中减去第二个(分别计算 RGB三种颜色值),输出结果是更深的颜色。(译注:对应Photoshop中的“差值/排除"。) |
exclusion()函数 | 效果与difference()函数效果相似,只是输出结果差别更小(lower contrast)。(译注:对应Photoshop中的“差值/排除"。) |
average()函数 | 分别对 RGB的三种颜色值取平均值,然后输出结果。 |
negation()函数 | 与difference()函数效果相反,输出结果是更亮的颜色。请注意∶效果相反不代表做加法运算。 |
总结
1 . 本视频教程的优缺点:
a)知识点比较齐全完整,但是有些概念讲得不够清楚。
b)没有实战,不知道知识点应该如何在实战中使用。
c)官网文档写的比较好。
官方链接
LESS官方网站
英文 www.lesscss.org/
中文 less.bootcss.com/
视频教程
LESS教程 ★
黑马面面移动端布局开发-rem+less适配码云部署发布静态网站git上传摹客/蓝湖协作平台使用-pink老师公开课
学习资料
练习代码:H:\学习课程\ediary日记\学习课程\less-2\练习代码\less-demo
H:\学习课程\ediary日记\学习课程\less