学习less(上)

37 阅读5分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 10 天 Less是一种动态样式语言;为提高css应用的灵活性和效率, LESS将cSS赋予了动态语言的特性,如变量,继

承,运算,函数。LESS既可以在客户端上运行(支持IE 6+, Webkit, Firefox),也可以借助Node.js在服务端运行。

Less的安装

在node.js环境中使用less

npm install -g less

在浏览器环境中使用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>

在vscode中使用less需要先安装插件EasyLess

Less的使用

注释

less的注释有两种

//这种注释,在编译后不会出现在CSS文件上
/*这种注释,编译后会出现在CSS文件上*/

less变量

我们常常在 CSS 中 看到同一个值重复多次,这样难易于代码维护。理想状态,应是下面这样:

const bgcolor="skyblue";
$(". post-content"). css("background-color", bgcolor);
$("# wrap"). css("background-color", bgcolor);
$(". arctive"). css("background-color", bgcolor);

只要我们修改bgcolor这一个变量,整个页面的背景颜色都会随之改变。而Less中的变量十分强大,可化

万物,值得一提的是,其变量是常量,所以只能定义一次,不能重复使用。

值变量(样式变量)

@color:#999;
@bgcolor:skyblue;//不要添加引号
@width:50%;
#wrap{
color:@color;
  background:@bgcolor;
  width:@width;
  }

以@开头 定义变量,并且使用时 直接 键入@名称。在平时工作中,我们就可以把 常用的变量 封装到一个文件中,这样利于代码组织维护。

#wrap {
  color: #999;
  background: skyblue; 
  width: 50%;
}
@lightPrimarycolor: #c5cae9;
@textPrimarycolor: #fff;
@accentcolor: rgb(99, 137, 185);
@primaryTextcolor: #646464;
@secondaryTextcolor: #000;
@dividercolor: #b6b6b6;
@borderColor: #dadada;

选择器变量

作用:让选择器变成动态

@myselector:#wrap;
@wrap:wrap;

@{myselector}{ //变量名必须使用大括号包裹
color: #999;
width:50%;
}
.@{wrap}{
color:#ccc;
}
#@{wrap}{//和第一种等效,只是不同写法
color:#666;
}
#wrap {
color: #999;
width:50%;
}
.wrap {
color:#ccc;
}
#wrap {
color:#666;
}

属性变量

/*Less*/
@borderstyle:border-style;
@soild:solid;
#wrap{
@{borderstyle}:@soild;//变量名必须使用大括号包裹
}
#wrap{
border-style:solid;
}

url变量

@images: "../img";//需要加引号
body {
background:url("@{images}/dog.png");//变量名 必须使用大括号包裹
}
body {
background: url("../img/dog. png");
}

声明变量

有点类似于下面的混合方法:

结构:@name:{属性:值;};

使用:@name();

@background: {background:red;};
#main{
  @background();
}

@Rules:{
  width: 200px;
  height: 200px;
  border: solid 1px red;
};
#con{
  @Rules();
}

变量运算

不得不提的是,Less的变量运算十分强大。

加减法时 以第一个数据的单位为基准,并且运算符要加空格

乘除法时 注意单位一定要统一

@width:300px;
@color:#222; 
#wrap{
  width:@width - 20;
  height:@width - 20*5;
  margin: (@width - 20)*5; 
  color:@color*2; 
  background-color:@color + #111;
}
#wrap{
width:280px;
height:200px;
margin:1400px;
color:#444;
background-color:#333;
}

变量的作用域

一句话总结就是就近原则,并且是块级作用域

@var: @a;
@a: 100%;
#wrap {
width: @var;
@a: 9%;
}
#wrap {
width: 9%;
}

less嵌套

&的妙用

&:代表的上一层选择器的名字,此例便是 header。

#header{
&::after{
    content:"Less is more!";
  }
.title{
  font-weight:bold;
  }
&_content{//理解方式:直接把&替换成#header
margin:20px;  م
}
}
#header::after{
  content:"Less is more!";
}
#header .title{ //嵌套了
font-weight:bold;
}

#header_content{//没有嵌套!
margin:20px;
}

&后面加空格再加.类名和不加空格.类名的区别

&后面加空格.后面的类名会作为&的子类渲染;比如:

.parent {
    div {
        & .child {
            color: red;
        }
    }
}

上面的代码会渲染成:

.parent div .child {
    color: red;
}

不加空格是作为属性使用的,比如:

.parent {
    div {
        &.child {
            color: red;
        }
    }
}

上面的代码会渲染成:

.parent div.child {
    color: red;
}

可以看到,& 加空格后,样式的后代选择器更的明确更规矩,更能避免可能出现的复杂样式冲突,所以最好还是 & 加空格来使用比较好,这种情况下,& 可以类比于父类

媒体查询

在以往的工作中,我们使用 媒体查询,都要把一个元素分开写:

#wrap{
width:500px;
}
@media screen and (max-width:768px){
  #wrap{
  width:100p;
  }
}

Less提供了一个十分便捷的方式:

# main{
//something...
@ media scren{
  @ media (max-width:768px){
    width:100px;
   }
}
@ media tv {
  width:2000px;
  }
}
@media screen and (maxwidth:768px){
#main{
width:100px;
  }
}
@media tv{
#main{
width:2000px;
  }
}

唯一的缺点就是每一个元素都会编译出自己@media声明,并不会合并。

在元素中定义自己的私有样式。

#main{
// something..
& .show{
display:block;
  }
}
.show{
  display:none;
}
const main = document. getElementById("main"); 
main. classList. add("show");
#main .show{
  display:block;
}
.show{
  display:none; //会被覆盖。
}

混合方法

无参数方法

方法犹如声明的集合,使用时直接键入名称即可。

.card{//等价于.card()
  background:#f6f6f6;
  -webkit-box-shadow:O 1px 2px rgba(151,151,151,.58);
  box-shadow:0 1px 2px rgba(151,151,151,.58);
  .card;//等价于.card();
}
#wrap{
background#f6f6f6;
-webkit-box-shadow:O 1px 2px rgba(151,151,151,.58);
  box-shadow:0 1px 2px rgba(151,151,151,.58);
}

其中.card 与.card()是等价的。个人建议,为了避免 代码混淆,应写成:

.card(){
//something...
}
#wrap{
.card();
}

要点:

.与#皆可作为方法前缀。

方法后写不写()看个人习惯。

默认参数方法

Less 可以使用默认参数,如果没有传参数,那么将使用默认参数。

@arguments犹如JS中的arguments指代的是全部参数。

传的参数中必须带着单位。

.border(@a:10px,@b:50px,@c:30px, @color:#000) {
border:solid 1px @color;
box-shadow:@arguments;//指代的是全部参数
}
#main{
.border(0px, 5px, 30px,red);//必须带着单位
}
#wrap{
.border(0px);
}م
#content{
.border;//等价于 .border()
}

方法的匹配模式

与面向对象中的多态很相似

声明的时候可以有同个函数不同参数,实际调用的时候看传的参数符合哪个就调用哪个

@_ 的意思是可以用来引用所有传入的参数列表,相当于可变参数的意思。