less

less介绍

​ less是一种动态样式语言,属于css预处理器的范畴,它扩展了CSS语言,
​ 增加了变量、Mixin、函数等特性,使CSS更易维护和扩展
​ LESS既可以在客户端上运行,也可以借助Node.js在服务端运行。

less的中文官网:http://lesscss.cn/
bootstrap中less教程:http://www.bootcss.com/p/lesscss/
颜色对照表:https://www.sioe.cn/yingyong/yanse-rgb-16/

less的安装引入

  1. 直接引用(不推荐)

    • 在引入之前,我们需要创建一个 Less 文件,Less 文件的后缀名为 .less,所以我们可以将文件命名为 index.less

    • 然后我们就可以通过 <link> 标签向 HTML 页面中引入 index.less 文件,和引入 CSS 文件类似,但是需要将 type 属性的值修改为 text/less

      <link rel="stylesheet/less" type="text/less" href="./index.less" />
      
    • 然后下载使用官方提供的 CDN 进行脚本引入

      <script src="//cdnjs.cloudflare.com/ajax/libs/less.js/3.11.1/less.min.js" ></script>
      
  2. 通过NPM安装(不推荐)

  3. vscode安装(推荐)

    • 打开VSCode编辑器,安装Easy LESS插件
    • 在文件夹中新建less文件,然后保存,即可在当前文件夹中编译出相应的css文件。

引入案例

使用less.js的使用方式

  • less

    body {
    	background-color: red;
    }
    
  • html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
        <link rel="stylesheet" href="./index.less" type="text/less">
        <style type="text/less">
            #box{
                width: 100px;
                height: 100px;
                background-color: pink;
                .con{
                    width: 50px;
                    height: 50px;
                    background-color: green;
                }
            }
        </style>
    </head>
    
    <body>
        <div id="box">
            <div class="con"></div>
        </div>
        <script src="https://cdn.bootcdn.net/ajax/libs/less.js/3.13.0/less.js"></script>
    </body>
    </html>
    

不使用less.js的使用的方式

  • less

    body{
        background-color: aquamarine;
    }
    
  • html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Document</title>
        <link rel="stylesheet" href="./Untitled-1.css">
    </head>
    <body>
    </body>
    </html>
    

Less编译工具

​ koala官网:www.koala-app.com

less中的注释

​ 单行注释,不会被编译到css文件中 // <!-- -->
​ 多行注释会被编译到css文件中 /**/

less中的变量

​ 使用@来声明一个变量:@pink:pink;
​ 1.作为普通属性值来使用:直接使用@pink
​ 2.作为选择器和属性名:#@{selector的值}的形式
​ 3.作为URL:@{url}
​ 4.变量的延迟加载

  • (less中的变量加载是有延迟的;它会等css样式加载完之后再执行加载)

less中的嵌套规则

​ 1.基本嵌套规则

嵌套规则允许在一个选择器中嵌套另一个选择器

父选择器&的使用

&作为选择器使用

parent{
	&:first-child{	//parent下的第一个子元素
	}
}		

&作为选择器使用的特殊情况

将&用在一个使用逗号分隔的选择器列表中,可以产生列表中所有选择器的所有可能的排列,这被称作组合爆炸。如:

p,a,ul{
	border-top:2pxdotted#366;
	&+&{
		border-top:0;
	}
}

上述列表中有3个选择器,列表中所有选择器的所有可能的排列,将有9种可能。编译后的CSS代码为:

p,
a,
ul{
	border-top:2pxdotted#366;
}
p+p,
p+a,
p+ul,
a+p,
a+a,
a+ul,
ul+p,
ul+a,
ul+ul,{
	border-top:0;

&放选择器后面

还可以将&放在一个选择器的后面,来改变选择器的顺序,将当前选择器排列到最前面。如:

.header{
    .menu{
    	border-radius:5px;
        .no-borderradius&{
            background-image:url('images/button-background.png');
        }
    }
}

选择器.no-borderradius&会使.no-borderradius置于他的父选择器.header.menu的前面,形成.no-borderradius.header.menu的结构。编译后的CSS代码为:

.header .menu{
	border-radius:5px;
}
.no-borderradius .header .menu{
	background-image:url('images/button-background.png');
}

less中的混合

​ 混合就是将一系列属性从一个规则集引入到另一个规则集的方式

1.普通混合

 	.myMixin1 {
      color: green;
    }
    .allMixin {
      .myMixin1;
    }
    //输出
    .myMixin1 {
      color: green;
    }
    .allMixin {
      color: green;
    }

2.不带输出的混合

如果要创建一个mixin,但是又不想要输出mixin的话,我们可以在它的后面加上一个括号。

    .myMixin1 {
      color: green;
    }
    .myMixin2() {
      background: red;
    }
    .allMixin {
      .myMixin1;
      .myMixin2;
    }
    
    // 输出
    .myMixin1 {
      color: green;
    }
    .allMixin {
      color: green;
      background: red;
    }

3.带参数的混合

    .myMixin(@color) {
      background: @color;
    }
    .allMixin {
      .myMixin(red);
    }
    //输出
    .allMixin {
      background: red;
    }

4.带参数并且有默认值的混合

    .myMixin(@color:red) {	//不给color传实参默认为red,传实参覆盖red值
      background: @color;
    }
    .allMixin {
      .myMixin(blue);
    }
    //输出
    .allMixin {
      background: blue;
    }

5.带多个参数的混合

同4,5

6.命名参数

    .myMixin(@w:100px,@h:100px,@c:red) {
      background: @color;
    }
    .allMixin {
      .myMixin(@c:blue);	//指定形参c的值为blue
    }
    //输出
    .allMixin {
      background: blue;
    }

7.匹配模式

// @_ 表示匹配所有,只要调用了triangle,就会调用有 @_ 的样式
// @_ 表示通用的匹配模式
// 什么是通用匹配模式:
// 就是无论哪一个混合被匹配了,都会执行通用匹配模式中的代码
.triangle(@_,@width,@color) {
  width: 0;
  height: 0;
  border-style: solid solid solid solid;
}

.triangle(Down,@width,@color) {
  border-width: @width;
  border-color: @color transparent transparent transparent;
}

.triangle(Top,@width,@color) {
  border-width: @width;
  border-color: transparent transparent @color transparent;
}
div{
	.triangle(Down,80px, blue);
}

//输出
div{
  width: 0;
  height: 0;
  border-style: solid solid solid solid;
  border-width: 80px;
  border-color: blue transparent transparent transparent;
}

8.arguments变量

@arguments 在JavaScript中代表所有的参数,在mixin内部同样有特殊含义,它包含调用mixin时传递的所有参数;如果我们不想处理单个参数,它将会非常适用。

    .box-shadow(@x: 0; @y: 0; @blur: 20px; @color: green) {
       box-shadow: @arguments;
    }
    .argVar {
      .box-shadow(2px; 11px);
    }
    
    // 输出
    .argVar {
       box-shadow: 2px 11px 20px green;
    }

重载

多个同名的混合,拥有不同的功能,可以根据调用的时候传入的实参个数选择匹配哪个混合

.main(@w) {
    width: @w;
}

.main(@w, @h) {
    width: @w;
    height: @h;
}

.outer {
    //重载:根据参数个数不同,来匹配不同的混合
    .main(100px, 100px)
}

// 输出
.outer {
    width: 100px;
    height: 100px;
}

守卫

根据判断条件选择使用哪个混合

类似于JavaScript的if/else,使用when语法

我们可以使用>,>=,<,<=,=,以及关键字true(只匹配关键字true,非true不会匹配),

支持逻辑与and 和或,以及非not ()

.main(@w) when(@w>1000),(@w<200) {
    width:~"@{w}px";
    height: 100px;
}

.main(@w) when(@w<=1000) and (@w>=200) {
    width:~"@{w}px";
    height: 50px;
}

.main(@b) when(not(@b<=30)){
    background: red;
}

.outer {
    .main(3000)
}

//输出
.outer {
    width:3000px;
    height:100px;
}

2.8 字符串插值

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

@h: 30;
@baseUrl: "http://redromance.vip:6666/";
.outer {
    //变量加单位,字符串拼接 再转义
    //@{h}在字符串中书写变量
    //~转义 把字符串转成css可用代码
    height:~"@{h}px";
    //字符串插值
    background: url("@{baseUrl}01.png")
}

.con {
    background: url("@{baseUrl}02.png")
}

less运算

运算类型:任何数值,颜色,变量都可以运算

算除法时,需要将要计算的表达式用()包裹起来

单位 : 在进行任意运算时会发生单位转换,单位以从左向右第一个遇到的单位为准

在进行颜色计算时,会将颜色变成rgb(value,value,value)的形式,再将里面的value分开进行运算,再转成16进制,

如:#fff-20==>rgb(255-20,255-20,255-20)==>#ebebeb

注意:运算符与数值之间要以空格分开,涉及优先级时以()进行优先级计算

less映射

从 Less 3.5 版本开始,你还可以将混合(mixins)和规则集(rulesets)作为一组值的映射(map)使用。

#colors() {
  primary: blue;
  secondary: green;
}

.button {
  color: #colors[primary];
  border: 1px solid #colors[secondary];
}

输出符合预期:

.button {
  color: blue;
  border: 1px solid green;
}

less导入

“导入”的工作方式和你预期的一样。你可以导入一个 .less 文件,此文件中的所有变量就可以全部使用了。如果导入的文件是 .less 扩展名,则可以将扩展名省略掉:

@import "library"; // library.less
@import "typo.css";

less避免编译

有时候我们需要输出一些不正确的css语法或者使用less不认识的专有语法。要输出这样的值我们可以在字符串前加上一个~

.test_03{
  width: 300px;
  height: ~'calc(300px - 30px)';
}

输出

//输出
.test_03 {
  width: 300px;
  height: calc(300px - 30px);
}

less继承

性能比混合高
​ 灵活度比混合低
​ 假设有一个 .inline 的类:

.inline {
  color: red;
}

现在希望 nav ul 选择器能够让继承 .inline类的 color 属性,就可以使用以下两种方式的任意一种来实现:

nav ul:extend(.inline) {
}

或者

nav ul {
  &:extend(.inline);
}

这两种方式得到的结果完全相同,编译后的CSS代码为:

.inline,
nav ul {
 color: red;
}

less函数

参考文献:https://www.cnblogs.com/zfc2201/p/3493335.html

  • 逻辑函数

    • if

      @c: boo;
      div {
          margin: if((2 > 1), 1, 0);
          color:  if((iscolor(@c)), @c, black);
      }
      
    • boolean

      @c: boolean(2<1);
      
      div {
          margin: if(@c, 1, 0);
      }
      
  • 字符串函数

    • escape

      • 对字符串中的特殊字符做 URL-encoding 编码。
      • 这些字符不会被编码:,, /, ?, @, &, +, ', ~, ! and $
      • 被编码的字符是:**, #, ^, (, ), {, }, |, :, >, <, ;, ], [ and =
      escape('a=1') // return a%3D1
      
    • e

      用于对CSS的转义,与~"value"类似。它接受一个字符串作为参数,并原样返回内容(不含引号)。

      它可用于输出一些不合法的CSS语法,或者是使用LESS不能识别的属性。

      @mscode: "hello guigu";
      .div{
          width: e(@mscode);
      }
      
    • format

      div{
          format-a-d:%('repetitions: %a file: %d', 1 + 2, "directory/file.less");
      }
      
    • replace

      div{
          content:replace("One + one = 4", "one", "2", "gi");
      }
      
  • 列表函数

    • length

      p{
      	@list: "banana", "tomato", "potato", "peach";
      	n: length(@list);
      }
      
    • extract

      div{
          @list: apple, pear, coconut, orange;
          value: extract(@list, 3); //3表示提取@list中的第几个值
      }
      
    • range

      div{
          value: range(4);  //从1到4的遍历范围值,只能接受整数
      }
      
  • 数学函数

    • ceil

      ceil(2.4)
      
    • floor

      floor(2.6)
      
    • percentage

      percentage(0.5)
      
    • round

      round(1.67)
      
    • sqrt

      sqrt(121)
      
    • abs

      abs(-18)
      
    • pow

      pow(5, 2);
      
    • mod

      mod(10,5)
      
    • min

      min(1,2,3,4,5)
      
    • max

      max(1,2,3,4,5)
      
  • 类型函数

    • isnumber

      isnumber(1);
      
    • isstring

      isstring('1');
      
    • iscolor

      iscolor(#fff);
      
  • 混调函数/杂项函数

    • color

      color(red)
      
    • image-size

      image-size("file.png")  地址为本地地址
      
    • image-width

      image-width("file.png");
      
    • image-height

      image-height("file.png");
      
  • 颜色调试【变浅或加深】

    div{
        v:hsl(90, 80%, 50%);
        //value: desaturate(hsl(90, 80%, 50%), 20%);
        value: desaturate(green, 20%);
    }
    
posted @   听风小弟  阅读(152)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示