CSS 预处理工具 Less 的介绍及使用 步骤

news2024/9/28 9:59:06

文章目录

      • Less是什么
      • Less的使用方法
        • Less 中的注释
        • Less 中的变量
        • Less 中的嵌套
        • Less 中的混合(Mixin)
        • Less 中的运算
        • Less 中的转译
        • Less 中的作用域
        • Less 中的导入
      • Less实用实例
        • 文字超出省略
        • 文字垂直居中
        • 定位上下左右居中

Less是什么

Less 是一门 CSS 预处理语言,它扩展了 CSS 语言,增加了变量、Mixin、函数等特性,使 CSS 更易维护和扩展。 Less 可以运行在 Node 或浏览器端。最基础的例子如下所示:

@base: #fff;
.wh(@width, @height) {
  width: @width;
  height: @height;
}
.box {
  color: @base;
  .wh('30px', '30px');
}

编译输出后的结果:

.box {
  color: #fff;
  width: '30px';
  height: '30px';
}

接下来我们打开前端开发环境,用之前介绍的 Vue CLI 工具初始化一个 Vue 项目进行 Less 的学习。 项目初始化完成后,在项目根目录运行如下命令行安装 lessless-loader

cnpm i less less-loader -D

Less的使用方法

Less 中的注释

我们在写代码的时候,会记录一下这段代码的功能或者使用注意事项等,Less 也不例外,两种注释形式:

  • // 开头的注释,注释单行,且不会被编译到 CSS 文件中。
  • /**/ 包裹的注释,注释多行,同样也不会被编译到 CSS 文件中。

Less 中的变量

Less 中使用 @ 符号申明变量,比如 @color: red。比方说我现在写一个电商项目,我需要设置项目中主色、辅助色等,代码如下所示: App.vue

<template>
  <div id="app">
    <div class="box">
      <p class="one">我是less</p>
      <p class="two">我是less</p>
      <p class="three">我是less</p>
    </div>
  </div>
</template>

<script>
export default {
  name: 'App',
};
</script>

<style lang="less" scoped>
@primary: red;
@deepColor: green;
@lightColor: blue;

.box {
  .one {
    color: @primary;
  }
  .two {
    color: @deepColor;
  }
  .three {
    color: @lightColor;
  }
}
</style>

浏览器展示如下所示:

img

有一点要注意的是,如果在后面声明了同名变量,变量值会被后面的覆盖,比如上述代码:

@primary: red;
@deepColor: green;
@lightColor: blue;
@primary: pink 
.box{
  .one {
    color: @primary;
  }
  .two {
    color: @deepColor;
  }
  .three {
    color: @lightColor;
  }
};

那么最后第一个 p 标签的文字就会变成粉红色。

程序员要培养自己的举一反三能力,颜色可以写成变量,文字的大小同样也可以,并且 less 文件能通过 @import 关键词引入其他的 less 文件,后面我会讲到这块内容。

Less 中的嵌套

市面上所有 CSS 的预编译器的嵌套规则大同小异,基本嵌套如下:

.a {
  color: #fff;
  .b {
    width: 20px;
  }
}

编译后的代码如下所示:

.a {
  color: #fff;
}
.a .b {
  width: 20px;
}

同级场景 & 的使用如下所示:

.a {
  color: blue;
  &:hover {
    color: red;
  }
}

上述代码 & 表示当前节点的 CSS 样式,一般用于处理 CSS 样式的状态 hover、focus、active、link、visited 等。

Less 中的混合(Mixin)

Less 的混合有三种情况:

  • 不带参数;
  • 带参数,没有默认值;
  • 带参数,且有设置默认值;

调用的时候也存在区别:

  • 不带参数:调用时可以不加括号,直接使用;
  • 带参数:调用时要加括号,括号里必须要传值,不然编译会报错;
  • 带参数且有默认值:调用时要加括号,参数可传可不穿;

下面就用上面的项目页面进行实验,首先是第一种情况,不带参数,用 .center 定义文字居中的样式:

<template>
  <div id="app">
    <div class="box">
      <p class="one">我是less</p>
    </div>
  </div>
</template>

<script>
export default {
  name: 'App',
};
</script>

<style lang="less" scoped>
.center {
  text-align: center;
}
.red {
  color: red;
}
.box {
  .one {
    .center;
    .red;
  }
}
</style>

img

下面是带参数,且没有默认值的情况,.color(@c) 中的 @c 为需要传入的参数,如 .color(green) 传入绿色的颜色值:

<template>
  <div id="app">
    <div class="box">
      <p class="one">我是less</p>
    </div>
  </div>
</template>

<script>
export default {
  name: 'App',
};
</script>

<style lang="less" scoped>
.center {
  text-align: center;
}
.color(@c) {
  color: @c;
}

.box {
  .one {
    .center;
    .color(green);
  }
}
</style>

img

最后是带默认值的情况,.color(@c: red) 中的 red 为默认红色值,在不传参数的情况下,默认为红色,传入参数的则会覆盖 red

<template>
  <div id="app">
    <div class="box">
      <p class="one">我是less</p>
    </div>
  </div>
</template>

<script>
export default {
  name: 'App',
};
</script>

<style lang="less" scoped>
.center {
  text-align: center;
}
.color(@c: red) {
  color: @c;
}

.box {
  .one {
    .center;
    .color;
  }
}
</style>

img

在开发页面时,时常会有需要画三角形的情况,顶角分别对应上下左右四个方位的三角形,若是做重复劳动去绘制同样的三角形,显得不是那么优雅,这时候我们可以用到 Less 的匹配模式。 匹配模式下无论同名的哪一个混合(Mixin)被匹配到,都会先执行通用匹配模式的代码, @_ 表示通用的匹配模式,具体代码如下:

<template>
  <div id="app">
    <div class="box">
      <p></p>
    </div>
  </div>
</template>

<script>
export default {
  name: 'App',
};
</script>

<style lang="less" scoped>
.triangle(@_, @width, @color) {
  width: 0;
  height: 0;
  border-style: solid;
}
// 上面的代码表示,在使用 .triangle 这个混合时,都会触发这三个属性。
.triangle(Bottom, @width, @color) {
  border-width: @width;
  border-color: @color transparent transparent transparent;
}
.triangle(Left, @width, @color) {
  border-width: @width;
  border-color: transparent @color transparent transparent;
}
.triangle(Top, @width, @color) {
  border-width: @width;
  border-color: transparent transparent @color transparent;
}
.triangle(Right, @width, @color) {
  border-width: @width;
  border-color: transparent transparent transparent @color;
}

.box {
  p {
    .triangle(Left, 100px, red);
  }
  // 传入 Left 100px red 这三个值,将会触发 .triangle(Left, @width, @color) 这个混合。
}
</style>

上述 Less 代码设置了基础的 .triangle 样式,再分别设置上下左右四个方位的匹配模式,并且可以通过 @width 参数来控制三角形大小,浏览器的展示如下所示:

img

arguments 变量:@arguments 表示 .border(@width, @mode, @color) 中的三个变量一起被赋值,代码示例如下:

.border(@width, @mode, @color) {
  border: @arguments;
}

.one {
  .border(1px, solid, red);
  
}

Less 中的运算

算数运算符 +、-、*、/ 可以对任何数字、颜色或者变量进行运算,在 Less 中在加减之前会进行单位的换算。计算的结果以最左侧才作数的单位类型为准。如果单位无效或者失去意义,则单位会被忽略。

width: 20px + 20; 
color: #444 * 2;

calc() 特例 calc() 是样式宽高的计算属性,为了与 CSS 保持兼容, calc() 方法并不会对数学表达式进行计算,但是在嵌套函数中会计算变量的数学公式的值。代码如下所示:

@a: 100vh/2 height: calc(50% + (@a - 40px));

Less 中的转译

转译,简单的理解就是我们原先是什么样的,最终输出的还是什么样。关键字是 ~"",示例代码如下:

p {
  color: ~'green'; 
}

在 Less 3.5+ 版本中,许多以前需要“引号转义”的情况就不再需要了。

Less 中的作用域

Less 中的作用域和 CSS 的作用域非常相似,首先 Less 会查询当前作用域内的变量,如果找不到的话会继续向上一级查询,直到找到为止。示例代码如下:

@var: blur;
body {
  @var: red;
  .one {
    color: @var;
  }
}

Less 中的导入

现代前端开发,万物皆是模块。Less 也不例外,一个 Less 文件就可以当作一个模块来处理,一个 Less 文件中可以引入另外一个 Less 文件,并且可以使用里面的变量信息,我们来看实例代码:

<template>
  <div id="app">
    <div class="box">
      <p>我是P</p>
    </div>
  </div>
</template>

<script>
export default {
  name: 'App',
};
</script>

<style lang="less" scoped>
// 引入新建的 style.less 文件。
@import './style.less';

@color1: red;

.box {
  p {
    color: @color2;// @color2 为引入的 style.less 中的变量。
  }
}
</style>
@color2: blue;

img

在此建议,生命变量的时候,颜色主题可以单独创建一个 Less 文件。字体大小,文字粗细,阴影的大小,透明度等等也可以单独抽离一个 Less 文件,通过引入的方式全部引入到 index.less 中,在组件中使用的时候,可以只引入 index.less 文件,便可使用在 index.less 中引入的 Less 文件的变量。

Less实用实例

文字超出省略

这是前端开发中出现频率比较高的情况,我们来提取混合(Mixin),实例代码如下:

.ellipsisSingle {
  -webkit-box-orient: vertical;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

我们来编写代码来验证一下:

<template>
<div id="app">
  <div class="box">
    <div class="text">
      我是less我是less我是less我是less我是less我是less我是less
  </div>
  </div>
  </div>
</template>

<script>
  export default {
    name: 'App',
  };
</script>

<style lang="less" scoped>
  .ellipsisSingle {
    -webkit-box-orient: vertical;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
  }
  .box {
    .text {
      .ellipsisSingle;
      // .ellipsisSingle 为上述定义好的混合(Mixin)。
      background: darkgoldenrod;
      width: 200px;
      height: 20px;
    }
  }
</style>

img

就此收手,觉得还是不过瘾。若是需要多行省略的情况呢?下面就用到了带参数的混合(Mixin):

.ellipsisMultiple(@num: 1) {
  display: -webkit-box;
  -webkit-box-orient: vertical;
  overflow: hidden;
  text-overflow: ellipsis;
  -webkit-line-clamp: @num;
}

styles 内容如下:

.box {
  .text {
    .ellipsisMultiple(2);
    background: darkgoldenrod;
    width: 200px;
  }
}

img

文字垂直居中

很多时候你在写 CSS 样式的时候,会连续写两个连在一起的属性,比如 height: 20px; line-height: 20px,目的是为了让标签内的文字垂直居中,写多了就会觉得代码不是那么干净。又到了 Less 出手的时候了,把它封装起来,代码如下:

<template>
<div id="app">
  <div class="box">
    <div class="text">我是less</div>
  </div>
  </div>
</template>

<script>
  export default {
    name: 'App',
  };
</script>

<style lang="less" scoped>
  .line-text-h (@h: 0) {
    height: @h;
    line-height: @h;
  }
  
  .box {
    .text {
      .line-text-h(100px);
      background: darkgoldenrod;
      width: 200px;
    }
  }
</style>

img

定位上下左右居中

项目开发中有些场景比如设置空页面的图标上下左右居中,这时我们可以封装一个 Less 混合(Mixin):

<template>
<div id="app">
  <div class="box">
    <div class="text">我是less</div>
  </div>
 </div>
</template>

<script>
  export default {
    name: 'App',
  };
</script>

<style lang="less" scoped>
  .center {
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
  }
  
  .box {
    .text {
      .center;
      background: darkgoldenrod;
      width: 200px;
      height: 200px;
    }
  }
</style>

img

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/353709.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

spring的事务控制

1.调用这个方法的对象是否是spring的代理对象&#xff08;$CGLIB结尾的&#xff09; 2.这个方法是否是加了Transactional注释 都符合才可以被事物控制 如果调用方法的对象没有被事物控制&#xff0c;那么被调用的方法即便是加了Transactional也是没用的 事务失效情况&#xf…

基于MATLAB计算MIMO信道容量(附完整代码与分析)

目录 一.介绍 二. 代码 三. 运行结果及分析 3.1 MIMO信道容量&#xff1a;固定发射天线数为4 3.2 MIMO信道容量&#xff1a;固定接收天线数为4 3.3 AWGN信道与瑞利信道容量 四. 总结 一.介绍 本文章将在MATLAB环境中分析MIMO信道容量&#xff0c;AWGN信道容量&#xf…

秒懂SpringBoot之全网最易懂的Spring Security教程

[版权申明] 非商业目的注明出处可自由转载 出自&#xff1a;shusheng007 文章目录概述简介原理默认实现使用Token认证方案JWT认证流程自定义Authentication Provider自定义Provider修改配置认证失败与授权失败处理认证失败处理授权失败处理支持方法级别的授权总结源码概述 现如…

PMP好考吗,有多大的价值?

关于PMP考试题型及考试内容&#xff0c;PMP考试共200道单选题&#xff0c;其中25道题不计分&#xff0c;会被随机抽查&#xff0c;答对106道题以上通过考试&#xff0c;参考比例106/175&#xff0c;60.57%估计答对&#xff08;10625&#xff09;道题及上即可通过&#xff0c;参…

全国进入裁员潮,到底是大厂难混?还是我技不如人?

前言 面对裁员&#xff0c;每个人的心态不同。他们有的完全没有料想到自己会被裁&#xff0c;有的却对裁员之事早有准备。大多数人&#xff0c;我想是焦虑失落的吧。 01 “降本增效”&#xff0c;HR怒提裁员刀 小默 | 32岁 芯片行业 人力资源 1月份&#xff0c;身处芯片行业H…

额度系统设计

一、额度生命周期额度生效/失效&#xff1a;授信的时候风控返回用户额度&#xff0c;当额度有效期到期之后额度失效&#xff1b;额度预扣/占用/释放&#xff1a; 当客户来提款的时候&#xff0c;只要提款金额小于授信额度(可用额度)时&#xff0c;先预扣&#xff0c;处理完系统…

如何让APP在Google Play中成为特色

Google Play覆盖了 190 多个地区&#xff0c;数十亿的用户&#xff0c;所以开发者都会希望APP在应用商店中获得推荐位。 Google Play 上的精选热门应用类型&#xff1a;热门游戏或应用&#xff0c;畅销应用&#xff0c;安装量增长的应用&#xff0c;产生最多收入的应用。 那么…

Pdfium.Net SDK 4.78.2704 完美Crack/Ptach

不限制时&#xff0c;/不限PDF体积、、、、、// version: 4.78.2704 | file size: 52.7 Mb Pdfium .Net SDK C# PDF 库 从头开始或从一堆扫描图像创建 PDF 编辑、合并、拆分和操作 PDF&#xff0c;提取文本和图像 嵌入独立的 Winforms 或 WPF PDF 查看器 支持&#xff1a;.Net…

软件性能测试方案怎么编写?权威的性能测试报告如何申请?

软件性能测试是通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试。性能测试在软件的质量保证中起着重要的作用&#xff0c;它包括的测试内容丰富多样。负载测试和压力测试都属于性能测试&#xff0c;两者可以结合进行。 一、软件性能测…

java中调用配置文件中的数据库路径及账号密码

项目场景&#xff1a; 有的时候因为项目的需求,所以需要隐藏数据库的路径,账号密码 解决方案&#xff1a; 话不多说直接上代码 这个分情况而定的: 在jdbc框架中获取方法: 1.获取数据库 Class.forName("oracle.jdbc.OracleDriver"); 2.获取路径,账号,密码 Properti…

pytorch零基础实现语义分割项目(一)——数据概况及预处理

语义分割之数据加载项目列表前言数据集概况数据组织形式数据集划分数据预处理均值与方差结尾项目列表 语义分割项目&#xff08;一&#xff09;——数据概况及预处理 语义分割项目&#xff08;二&#xff09;——标签转换与数据加载 前言 在本专栏的上一个项目中我们介绍了…

Python 使用pandas处理Excel —— 快递订单处理 数据匹配 邮费计算

问题背景 有表A&#xff0c;其数据如下 关键信息是邮寄地址和单号。 表B&#xff1a; 关键信息是运单号和重量 我们需要做的是&#xff0c;对于表A中的每一条数据&#xff0c;根据其单号&#xff0c;在表B中查找到对应的重量。 在表A中新增一列重量&#xff0c;将刚才查到的…

防水防汗耳机什么品牌好?四款防水效果不错的蓝牙耳机推荐

近年来蓝牙耳机中可谓是火爆全网&#xff0c;非常受到大家追捧&#xff0c;当然&#xff0c;也随着蓝牙耳机的增长&#xff0c;很多人不知道蓝牙耳机该如何选择&#xff0c;其实蓝牙耳机不止要音质表现好&#xff0c;佩戴体验好&#xff0c;还有着防水性能不能差&#xff0c;不…

window字符集与利用向导创建mfc

1.字节对应英语1个字符对应1个字节 多字节中文1个字符对应多个字节 宽字节 Unicode utf-8 3个 GBK2个2.多字节转换 为宽字节TEXT是由自适应编码的转换 TCHER 自适应编码的转换 _T是由自适应编码转换&#xff0c;L("")多字节转宽字节3.统计字符串长度统计字符串长度 c…

Ambari2.7.5集群搭建详细流程

0 说明 本文基于本地虚拟机从零开始搭建ambari集群 1 前置条件 1.1 本地虚拟机环境 节点角色ambari-1ambari-server ambari-agentambari-2ambari-agentambari-3ambari-agent 1.2 安装包 1.3 修改主机名并配置hosts文件 hostnamectl set-hostname ambari-1 hostnamectl se…

2022 年度回顾|The Sandbox 开放元宇宙的发展历程

2023 年又会为大家带来什么呢&#xff1f; 2022 年是很值得庆祝的一年。回顾这一年&#xff0c;The Sandbox 开放游戏元宇宙达成诸多里程碑。我们努力让各方面都更接近我们的愿景&#xff1a;一个开放的、去中心化的元宇宙&#xff0c;通过真正的数位所有权赋予创作者权力。社区…

mysql 通过客户端执行now()函数,时差为8小时

1.场景演示 假设当前北京时间是&#xff1a;2023-02-17 19:31:37。明显执行出来的结果和实际时间晚8小时。 所用Mysql版本为&#xff1a; 解决方式&#xff1a; 需要在my.conf文件中的[mysqld]下添加 default-time-zoneAsia/Shanghai 由于这个mysql8.0是通过 docker 安装的&…

【Python合集】我见过最有趣好玩强大的代码都在这里,涨见识啦~建议收藏起来慢慢学。(墙裂推荐)

前言 大家好&#xff0c;我是栗子同学啦~ 所有文章完整的素材源码都在&#x1f447;&#x1f447; 粉丝白嫖源码福利&#xff0c;请移步至CSDN社区或文末公众hao即可免费。 Python 凭借语法的易学性&#xff0c;代码的简洁性以及类库的丰富性&#xff0c;赢得了众多开发者的喜爱…

Linux延时队列工作原理与实现

当进程要获取某些资源&#xff08;例如从网卡读取数据&#xff09;的时候&#xff0c;但资源并没有准备好&#xff08;例如网卡还没接收到数据&#xff09;&#xff0c;这时候内核必须切换到其他进程运行&#xff0c;直到资源准备好再唤醒进程。 waitqueue (等待队列) 就是内核…

【初探人工智能ChatGPT】2、雏形开始长成

【初探人工智能ChatGPT】2、雏形开始长成【初探人工智能ChatGPT】2、雏形开始长成安装Flask封装Web接口雏形设置接收参数功能验证聊天写代码代码补全生成图片写在后面笔者初次接触人工智能领域&#xff0c;文章中错误的地方还望各位大佬指正&#xff01; 【初探人工智能ChatGPT…