【LESS系列】高级特性
前面我已经有一篇文章是写 LESS 的基础语法的。
那么这一次我们来看一下 LESS 的高级特性。
说起高级特性,首先也必须要一提的是模式匹配。
虽然个人觉得模式匹配的实用度其实也是一般般,但在关键时候,有它们在的话,还是能够让我们开发得更得心应手的。
其实传参设置默认值,就是一个最简单的模式匹配。
你调用 Mixins 函数,传入参数,和不传入参数,可能会出现不同的编译结果。
OK了,还是上主菜吧,下面列出了几项 LESS 的高级特性。
按照先前的惯例,LESS CODE 和 CSS CODE 分别是编译前跟编译后的代码。
1.用不同参数个数来匹配不同的 Mixins
- /* LESS CODE */
- .test(@size){
- width: @size;
- }
- .test(@size, @multiple){
- width: @size * @multiple;
- }
- .el-a{
- .test(10px);
- }
- .el-b{
- .test(10px, 2);
- }
- /* CSS CODE */
- .el-a {
- width: 10px;
- }
- .el-b {
- width: 20px;
- }
2.用常量参数来匹配不同的 Mixins
- /* LESS CODE */
- .test(large, @size: 10px){
- width: @size * 2;
- }
- .test(simple, @size: 10px){
- width: @size;
- }
- .test(@_, @size: 10px){
- display: block;
- }
- .el-a{
- .test(large);
- }
- .el-b{
- .test(simple);
- }
- /* CSS CODE */
- .el-a {
- width: 20px;
- display: block;
- }
- .el-b {
- width: 10px;
- display: block;
- }
以下是整个过程如何发生的:
第一个 .test 只有在满足 large 条件才会被匹配;
第二个 .test 只有在满足 simple 条件才会被匹配;
第三个 .test 在任何条件下,甚至是 large 和 simple 以外的条件下都会被匹配,只要满足传参规则就可以了(.test 要求传入1~2个参数);
只要是满足匹配要求的 Mixins,都会被使用。
变量可以匹配任何值,而常量只有在传入的值与之完全相等时才可以匹配成功。
3.用条件表达式来控制模式匹配
- /* LESS CODE */
- .test(@size) when (@size >= 10){
- width: @size;
- color: #f00;
- }
- .test(@size) when (@size < 10){
- width: @size;
- color: #000;
- }
- .el-a{
- .test(20px);
- }
- .el-b{
- .test(5px);
- }
- /* CSS CODE */
- .el-a {
- width: 20px;
- color: #f00;
- }
- .el-b {
- width: 5px;
- color: #000;
- }
有了条件表达式,总算可以跟 SASS 的 @if 比拼一下了,虽然实际用起来感觉还是不如 @if,但总比被完爆要强不少了。
4.条件表达式中使用类型检测函数
- /* LESS CODE */
- .test(@param) when (iscolor(@param)){
- color: @param;
- }
- .test(@param) when (isnumber(@param)){
- width: @param;
- }
- .el-a{
- .test(#f00);
- }
- .el-b{
- .test(5px);
- }
- /* CSS CODE */
- .el-a {
- color: #ff0000;
- }
- .el-b {
- width: 5px;
- }
当然,上面的例子仅仅是列出了两个类型检测函数,LESS 提供了很多类型检测函数,如:iscolor、isnumber、isstring、iskeyword、isurl等等,具体的话,我会在下一篇 LESS 函数说明中提及。
5.条件表达式中使用 and、or、not
- /* LESS CODE */
- .test(@size) when (@size > 10) and (@size < 20){
- width: @size;
- color: #000;
- }
- .test(@size) when (@size < 10), (@size > 20){
- width: @size;
- color: #ff0;
- }
- .test(@size) when not (@size = 20){
- text-align: center;
- }
- .el-a{
- .test(15px);
- }
- .el-b{
- .test(5px);
- }
- .el-c{
- .test(10px);
- }
- /* CSS CODE */
- .el-a {
- width: 15px;
- color: #000;
- text-align: center;
- }
- .el-b {
- width: 5px;
- color: #ff0;
- text-align: center;
- }
- .el-c {
- text-align: center;
- }
细心的同学会发现,LESS 中的逻辑与,是用英文逗号“,”来实现的,而不是直接用 or。
6.条件表达式中参数和参数进行比较
- /* LESS CODE */
- .test(@width, @height) when (@width >= @height){
- width: @width;
- height: @height;
- background-color: #000;
- }
- .test(@width, @height) when (@width < @height){
- width: @width;
- height: @height;
- background-color: #f00;
- }
- .el-a{
- .test(10px, 20px);
- }
- .el-b{
- .test(20px, 10px);
- }
- /* CSS CODE */
- .el-a {
- width: 10px;
- height: 20px;
- background-color: #f00;
- }
- .el-b {
- width: 20px;
- height: 10px;
- background-color: #000;
- }
7.高级参数用法
- /* LESS CODE */
- /* 不接受任何参数 */
- .test(){
- ...
- }
- /* 接受任意多个参数 */
- .test(...){
- ...
- }
- /* 接受1个参数 */
- .test(@size: 1px){
- ...
- }
- /* 接受0~1个参数 */
- .test(@size){
- ...
- }
- /* 同样是接受任意多个参数 */
- .test(@size: 1px, ...){
- ...
- }
- /* 接受1~N个参数 */
- .test(@size, ...){
- ...
- }
主要是说明“...”的用法,另外还有先前(在基本语法一文中)提到的 @arguments 变量,如果已经淡忘,那可以去回顾下了。
8.作用域
- /* LESS CODE */
- .test(@bgColor, @size){
- .set-bg-color(){
- background: @bgColor;
- }
- .set-size(){
- width: @size;
- height: @size;
- }
- .set-bg-color();
- .set-size();
- }
- .el-a{
- .test(#fff, 20px);
- }
- /* CSS CODE */
- .el-a {
- background: #ffffff;
- width: 20px;
- height: 20px;
- }
可以看到,在 .test 中,我还定义了两个 Mixins (就是 .set-bg-color 和 .set-size),但是这两个 Mixins 的作用域仅仅是在 .test 之中,如果在外部调用是会编译报错的。
而 .set-bg-color 和 .set-size 作为 .test 的内部 Mixins,它们本身虽然没参数,却又可以直接使用 .test 的参数。
是不是和 JS 很像?如果你对 JS 的作用域有所了解,那么这些应该不难理解。
9.字符串插值
- /* LESS CODE */
- .test(@domain){
- background-image: url("@{domain}/img/test.png");
- }
- .el-a{
- .test('http://asset.img.com');
- }
- /* CSS CODE */
- .el-a {
- background-image: url("http://asset.img.com/img/test.png");
- }
这一个特性在统一配置静态资源所在域中会有很好的发挥
10.避免编译
- /* LESS CODE */
- .test(){
- filter: ~"ms:alwaysHasItsOwnSyntax.For.Stuff()";
- }
- .el-a{
- .test();
- }
- /* CSS CODE */
- .el-a {
- filter: ms:alwaysHasItsOwnSyntax.For.Stuff();
- }
对于像滤镜这种特别的 CSS (特别之处在于这样的 CSS 本身就是一种函数调用,而 LESS 又没有提供这样的函数),LESS 通过 ~"内容" 这样格式来直接输出内容,避免对内容部分进行编译。
11.在 LESS 中使用 Javascript
- /* LESS CODE */
- .el-a{
- font-size: 12px;
- color: #f00;
- &:before{
- @arr: 'hello', 'world';
- content: `@{arr}.join(' ').toUpperCase()`;
- }
- }
- /* CSS CODE */
- .el-a {
- font-size: 12px;
- color: #f00;
- }
- .el-a:before {
- content: "HELLO WORLD";
- }
上面的例子中,可以捕抓到几个点:
如何用 LESS 变量来定义数组,@arr: 'hello', 'world';
如何在 LESS 中使用 JS(用“``”来包住要执行的JS语句),and 当中的 JS 如何获取 LESS 中定义的变量(用“@{变量名}”的格式),content: `@{arr}.join(' ').toUpperCase()`;
由于一般情况下,我们都是用 LESS 编译出 CSS 后,直接引用 CSS 文件的。所以在 LESS 中一般都不会使用和 DOM 相关的 JS 代码;
虽然说,能在 LESS 中使用 JS 是一件很让人兴奋的事,但实际上...除了极少时候需要做字符串处理外,真的想不到有什么时候需要用到这一特性...
【LESS系列】高级特性的更多相关文章
- Zookeeper系列五:Master选举、ZK高级特性:基本模型
一.Master选举 1. master选举原理: 有多个master,每次只能有一个master负责主要的工作,其他的master作为备份,同时对负责工作的master进行监听,一旦负责工作的mas ...
- Visual Studio 2015 速递(4)——高级特性之移动开发
系列文章 Visual Studio 2015速递(1)——C#6.0新特性怎么用 Visual Studio 2015速递(2)——提升效率和质量(VS2015核心竞争力) Visual Studi ...
- Python的高级特性8:你真的了解类,对象,实例,方法吗
Python的高级特性1-7系列是本人从Python2过渡3时写下的一些个人见解(不敢说一定对),接下来的系列主要会以类级为主. 类,对象,实例,方法是几个面向对象的几个基本概念,其实我觉得很多人并不 ...
- Python进阶:全面解读高级特性之切片!
导读:切片系列文章连续写了三篇,本文是对它们做的汇总.为什么要把序列文章合并呢?在此说明一下,本文绝不是简单地将它们做了合并,主要是修正了一些严重的错误(如自定义序列切片的部分),还对行文结构与章节衔 ...
- Redis基础用法、高级特性与性能调优以及缓存穿透等分析
一.Redis介绍 Redis是一个开源的,基于内存的结构化数据存储媒介,可以作为数据库.缓存服务或消息服务使用.Redis支持多种数据结构,包括字符串.哈希表.链表.集合.有序集合.位图.Hype ...
- Redis基础、高级特性与性能调优
本文将从Redis的基本特性入手,通过讲述Redis的数据结构和主要命令对Redis的基本能力进行直观介绍.之后概览Redis提供的高级能力,并在部署.维护.性能调优等多个方面进行更深入的介绍和指导. ...
- Redis 基础、高级特性与性能调优
本文将从Redis的基本特性入手,通过讲述Redis的数据结构和主要命令对Redis的基本能力进行直观介绍.之后概览Redis提供的高级能力,并在部署.维护.性能调优等多个方面进行更深入的介绍和指导. ...
- Visual Studio 2015速递(4)——高级特性之移动开发
系列文章 Visual Studio 2015速递(1)——C#6.0新特性怎么用 Visual Studio 2015速递(2)——提升效率和质量(VS2015核心竞争力) Visual Studi ...
- 《Java核心技术 卷II 高级特性(原书第9版)》
<Java核心技术 卷II 高级特性(原书第9版)> 基本信息 原书名:Core Java Volume II—Advanced Features(Ninth Edition) 作者: ( ...
随机推荐
- Net特性类Description了解下
NET特性类都有个特点类名+Attribute,继承基类Attribute,我们看下微软自带的特性类:DescriptionAttribute namespace System.ComponentMo ...
- django系列6--Ajax04 请求设置(设置csrf_token)
Ajax请求设置csrf_token 官方文档 csrf_token: https://docs.djangoproject.com/en/1.11/ref/csrf/ CSRF 跨站请求攻击,简单地 ...
- python网络编程--FTP上传文件示例
1.基础版(供学习了解原理使用,low) server服务端 import socket import struct import json server = socket.socket() ip_p ...
- CentOS7安装weblogic集群思路梳理
以前经常用weblogic集群,但是却没有仔细想过要实现它.这不,前两天成功安装了weblogic集群,现在将其思路整理下.防止日后自己忘掉了. 一.安装weblogic10.3.6 1. 在官网下载 ...
- 洛谷P5282 【模板】快速阶乘算法(多项式多点求值+MTT)
题面 传送门 前置芝士 \(MTT\),多项式多点求值 题解 这题法老当初好像讲过--而且他还说这种题目如果模数已经给定可以直接分段打表艹过去 以下是题解 我们设 \[F(x)=\prod_{i=0} ...
- Linux(Ubuntu)配置问题集
Cannot set LC_CTYPE to default locale: No such file or directory 安装Ubuntu Server版本(不带桌面环境)时,如果安装时的语言 ...
- [Linux] 如何在 Linux 中提取随机数
如何在 Linux 中提取随机数 一.设备文件 /dev/random & /dev/urandom 字符特殊文件 /dev/random 和 /dev/urandom (存在于Linux 1 ...
- IDEA 引入外部jar包 pom 配置,防止打包失败
1. <!--添加外部依赖--> <dependency> <groupId>Ice</groupId> ...
- Swift 函数提前返回
简评:函数提前返回主要的好处是:将每个错误处理进行分离,审查代码时不需要考虑多种复杂异常,我们可以吧注意力集中在也业务逻辑中,调试代码时可以直接在异常中打断点. 提前返回 首先来看一下需要改进的代码示 ...
- 【Hadoop & Ecilpse】Exception in thread "main" org.apache.hadoop.security.AccessControlException: Permission denied: user=bruce, access=WRITE, inode="/out2/_temporary/0":atguigu:supergroup:drwxr-xr-x
问题再现: 使用本机 Ecilpse (Windows环境) 去访问远程 hadoop 集群出现以下异常: 问题原因: 因为远程提交的情况下如果没有 hadoop 的系统环境变量,就会读取当前主机的 ...