LESS 笔记

207 阅读2分钟

了解 LessSass 的优缺点 查看

@import

在标准 CSS 中,@import必须在所有其他类型的规则之前,Less 不在乎你把@import语句放在哪里 详情参考 less-import 官方文档

变量

less 定义变量使用@符号

image.png

直接使用

image.png

mixin

定义几个基础样式 image.png html 中 使用: image.png 类似上图 class="inline ml8 font-gray" 相同的样式是否可以合并

image.png

.dl-text 拥有了 .inline .ml8 .font-gray 和自身的 background-color直接使用 dl-text 即可 image.png

在 less 中定义的类 都可以通过 mixin 组合生成新的类

也可以通过

image.png

这种方式定义出来的 mixin 编译后不会生成 font-colorfont-red 的类 只能被其他类引入使用

到这里我们先试一下如何手动编译less 如果全局安装了 less 可以直接执行 lessc 我没有全局安装 所以在项目内执行 npx lessc

已知项目目录如下: image.png

cd 进入 lessTest 目录下执行:

$ npx lessc test1.less test1-res.css

得到 test1-res.css image.png

分别看一下 test1.lesstest1-res.css

image.png

如上图红框所示 如果在项目中大量使用 mixin 编译出来的 css 中会出现大量的重复代码 我们更希望 得到 类似如下结果:

image.png

希望能把相同的代码 合并在一下 然后再单独定义差异的代码 这就需要 extend

extend

extend 的用法: image.png

编译后查看结果

image.png

for

关于 for 我们假设有一种场景 需要通过 flex 来自行匹配 元素的 排布和 占比 我们写了如下代码:

image.png

烦透了 如果场景比较复杂需要更多 那就废废了

怎么解决 ? less 中不支持 for 但是我们可以通过递归解决这个问题

创建递归方法 并调用

image.png

需要注意 .flex@{len} 实现动态字符串拼接

通过 lessc 编译查看结果如下:

image.png

功能实现! flex7 -> flex1 ? 强迫症一下:

image.png

舒坦 !!!!

关于 LESS 全局引入问题

写好基础 less 后在 main.js 中引入

在编写其他 less 文件 或者 在 .vue 文件<style lang=less> 中使用基础 less 中的内容时 提示:

image.png

此时需要使用 style-resources-loader 配置全局 less 变量

先安装对应插件:

$ npm install style-resources-loader vue-cli-plugin-style-resources-loader --save-dev

然后再 vue.config.js中配置:

const { defineConfig } = require('@vue/cli-service');
const path = require('path');

module.exports = defineConfig({
  transpileDependencies: true,
  pluginOptions: {
    'style-resources-loader': {
      preProcessor: 'less',
      patterns: [
        // 注意路径,不能使用配置中的别名路径(例如:alias 配置下的路径别名)
        path.resolve(__dirname, 'src/assets/less/index.less'),
      ],
    },
  },
});

FUNCTIONS

记录几个常用的:

List Functions

-- extract

@CursList: red, blue, green, yellow;

.cusColor{
    color: extract(@CursList, 2)
}

结果:

 .cusColor {
     color: green;
 }

-- each ( for循环遍历 )

@selectors: blue, green, red;
each(@selectors, {
  .sel-@{value} {
    color: extract(@selectors, @index);
  }
});

结果

.sel-blue { color: blue; } 
.sel-green { color: green; } 
.sel-red { color: red; }

color Functions

-- lighten darken

@color-success: #52C51A;
.comColor{
  background-color: @color-success;
}
.lightenColor {
   background-color: lighten(@color-success, 10%);
}
.darkenColor{
  background-color: darken(@color-success, 10%);
}

结果:

image.png

映射(Maps)

组件库按需加载css时 不希望定义很多全局属性 可使用 Maps

#color(){
  success: #52C51A;
  info:#1990FF;
  warning: #FBAD14;
  error: #F5222E;
}

.color-info{
  background-color: #color[info];
}

.color-warning{
  background-color: #color[warning];
}

.color-error{
  background-color: #color[error];
}

结果:

image.png