LESS 预处理器

1. LESS 概述

1.1 核心特性

LESS(Leaner Style Sheets)作为CSS预处理语言,提供以下核心能力:

  • 动态变量系统 :使用@符号定义可复用值
  • 嵌套规则:直观反映DOM层级结构
  • 参数化混合:支持带默认值的可配置样式块
  • 运算能力:处理数值、颜色和单位的计算
  • 函数库:提供颜色操作、数学计算等实用功能
  • 模块化组织 :通过@import实现文件拆分

1.2 环境配置

安装方式

bash 复制代码
npm install -g less

编译命令

bash 复制代码
# 基础编译
lessc styles.less styles.css

# 压缩输出
lessc styles.less styles.min.css --clean-css

# 实时监听
less-watch-compiler less css

构建工具集成

webpack配置示例:

javascript 复制代码
module.exports = {
  module: {
    rules: [
      {
        test: /\.less$/,
        use: [
          'style-loader',
          'css-loader',
          'less-loader'
        ]
      }
    ]
  }
}

2. 核心功能详解

2.1 变量系统

基础定义

less 复制代码
// 颜色变量
@primary: #428bca;
@danger: #d9534f;

// 尺寸变量
@base-padding: 15px;
@border-radius: 4px;

// 字体变量
@font-family-base: "Helvetica Neue", Helvetica, Arial, sans-serif;

动态应用

less 复制代码
// 选择器插值
@component: alert;
.@{component} {
  color: @primary;
}

// 属性名插值
@property: color;
.widget {
  @{property}: @primary;
  background-@{property}: #fff;
}

2.2 嵌套规则

标准嵌套

less 复制代码
.navbar {
  background-color: @navbar-bg;
  
  .nav-item {
    padding: @base-padding;
    
    > a {
      color: @navbar-text;
    }
  }
}

父选择器引用

less 复制代码
.btn {
  &-primary {
    background: @primary;
  }
  
  &:hover {
    opacity: 0.9;
  }
  
  .disabled & {
    opacity: 0.5;
  }
}

2.3 混合功能

基础混合

less 复制代码
.border-radius(@radius: 4px) {
  border-radius: @radius;
  -webkit-border-radius: @radius;
}

.box-shadow(@x: 0, @y: 1px, @blur: 3px, @color: rgba(0,0,0,.1)) {
  box-shadow: @arguments;
}

条件混合

less 复制代码
.text-contrast(@color) when (lightness(@color) > 50% {
  color: #000;
}
.text-contrast(@color) when (lightness(@color) <= 50% {
  color: #fff;
}

2.4 运算系统

数值计算

less 复制代码
@base: 16px;
@spacing: @base * 1.5;
@container-width: 100% / 3;

颜色操作

less 复制代码
@primary: #428bca;
@primary-dark: darken(@primary, 10%);
@primary-light: lighten(@primary, 15%);

3. 高级特性

3.1 映射功能

less 复制代码
#colors() {
  primary: #428bca;
  secondary: #5cb85c;
}

.button {
  background: #colors[primary];
}

3.2 循环结构

less 复制代码
.generate-columns(@n, @i: 1) when (@i <= @n) {
  .col-@{i} {
    width: (@i * 100% / @n);
  }
  .generate-columns(@n, (@i + 1));
}
.generate-columns(12);

3.3 导入指令

less 复制代码
// 基础导入
@import "variables";

// 条件导入
@import (optional) "theme";

// 内联CSS
@import (inline) "external.css";

4. 工程化实践

4.1 推荐目录结构

css 复制代码
styles/
├── core/
│   ├── variables.less
│   ├── mixins.less
│   └── reset.less
├── components/
│   ├── buttons.less
│   └── modals.less
├── layouts/
│   ├── header.less
│   └── footer.less
└── main.less

4.2 响应式方案

less 复制代码
// 断点定义
@breakpoints: {
  mobile: 576px;
  tablet: 768px;
  desktop: 992px;
};

// 媒体查询混合
.respond(@device, @content) {
  @media (min-width: @breakpoints[@@device]) {
    @content();
  }
}

// 使用示例
.container {
  .respond(tablet, {
    max-width: 720px;
  });
}

5. 性能优化

  1. 控制嵌套深度:建议不超过4层
  2. 合理使用混合:避免生成冗余代码
  3. 模块化拆分:按需加载样式模块
  4. 生产环境压缩:使用clean-css选项
  5. 避免全局污染:合理使用命名空间

6. 与现代CSS的配合

6.1 CSS变量集成

less 复制代码
:root {
  --primary: @primary;
  --text-color: @text-color;
}

.element {
  color: var(--text-color);
  border: 1px solid var(--primary);
}

6.2 原生CSS嵌套

less 复制代码
/* 输出保留嵌套结构 */
.card {
  &__header {
    font-size: 1.2em;
  }
  
  @media (min-width: 768px) {
    width: 50%;
  }
}

7. 最佳实践示例

7.1 主题系统实现

less 复制代码
// 主题定义
.theme(light) {
  @bg-color: #fff;
  @text-color: #333;
}

.theme(dark) {
  @bg-color: #222;
  @text-color: #eee;
}

// 应用主题
.apply-theme(@theme) {
  .theme(@theme);
  
  body {
    background: @bg-color;
    color: @text-color;
  }
}

7.2 工具类生成

less 复制代码
// 间距工具
.generate-spacing(@prefix, @property) {
  .loop(@i) when (@i <= 5) {
    @value: @i * 0.25rem;
    .@{prefix}-@{i} {
      @{property}: @value;
    }
    .loop(@i + 1);
  }
  .loop(1);
}

.generate-spacing(m, margin);
.generate-spacing(p, padding);

附录:资源参考

  1. 官方文档
  2. LESS编译工具
  3. LESS插件集合
相关推荐
追梦人物41 分钟前
Uniswap 手续费和协议费机制剖析
前端·后端·区块链
拾光拾趣录2 小时前
基础 | 🔥6种声明方式全解⚠️
前端·面试
朱程3 小时前
AI 编程时代手工匠人代码打造 React 项目实战(四):使用路由参数 & mock 接口数据
前端
PineappleCoder3 小时前
深入浅出React状态提升:告别组件间的"鸡同鸭讲"!
前端·react.js
wycode3 小时前
Vue2源码笔记(1)编译时-模板代码如何生效之生成AST树
前端·vue.js
橡皮擦1994 小时前
PanJiaChen /vue-element-admin 多标签页TagsView方案总结
前端
程序员嘉逸4 小时前
SASS/SCSS 预处理器
前端
咕噜分发企业签名APP加固彭于晏4 小时前
腾讯云eo激活码领取
前端·面试
子林super4 小时前
MySQL 复制延迟的排查思路
前端