带参数的mixin

在Less中,还可以像函数一样定义一个带参数的mixin, 这种形式叫做 Parametric Mixin,即带参数的混入。如:

  1. // 定义一个样式选择器
  2. .borderRadius(@radius){
  3.     border-radius: @radius;
  4. }

然后,在其他选择器中像这样调用它:

  1. // 使用已定义的样式选择器
  2. #header {
  3.     .borderRadius(10px);   // 把 10px 作为参数传递给样式选择器
  4. }
  5. .btn {
  6.     .borderRadius(3px);   // 把 3px 作为参数传递给样式选择器
  7. }

编译后的CSS代码为:

  1. #header {
  2.    border-radius: 10px;
  3. }
  4. .btn {
  5.    border-radius: 3px;
  6.  }

还可以给 Mixin 的参数设置默认值,有了默认值,在调用它的时候,如果没有提供该参数,它就会使用默认值。比如,设置默认值为 5px:

  1. .borderRadius(@radius:5px){
  2.    border-radius: @radius;
  3.  }
  4. .btn {
  5.    .borderRadius;
  6.  }

由于在调用 .borderRadius 时没有传递参数,它就会使用默认值 5px。编译后的CSS代码为:

  1. .btn {
  2.    border-radius: 5px;
  3.  }

Mixin还可以带多个参数,参数之间使用逗号或分号隔开。如:

  1. .border(@width, @style, @color) {
  2.     border: @width @style @color;
  3. }
  4. h2 {
  5.     .border(2px, dashed, green);
  6. }

编译后的CSS代码为:

  1. h2 {
  2.   border: 2px dashed #008000;
  3. }

虽然多个参数可以使用分号或者逗号分隔,推荐使用分号分隔,因为逗号既可以表示混合的参数,也可以表示一个参数中一组值的分隔符。

使用分号作为参数分隔符,就意味着可以将逗号分隔的一组值作为一个变量处理。换句话说,如果编译器在混入的定义或者调用中找到至少一个分号,就会假设参数是使用分号分隔的,则逗号将被看作是一个参数中一组值的分隔符。如:

.name(1, 2, 3; 4, 5) 就包含2个参数,1, 2, 3是一个参数,4, 5是一个参数。每个参数都是通过逗号分隔的一组值。

.name(1, 2, 3) 就包含3个参数,每个参数只含一个数字。也可以使用一个象征性的分号,如 .name(1, 2, 3;),就可以创建一个只含一个参数,但参数包含一组值的混入。

当包含多个参数时,Mixins是通过参数的名称,而不是位置来引用参数。也就是说,在使用的时候,如果提供参数名称,则参数的顺序并不重要。命名参数使代码更清晰、更容易阅读。如:

  1. .mixin(@color: black, @fontSize: 10px) {
  2.   color: @color;
  3.   font-size: @fontSize;
  4. }
  5. .class1 {
  6.   .mixin(@fontSize: 20px, @color: #F5A9D0);
  7. }
  8. .class2 {
  9.   .mixin(#F79F81, @fontSize: 20px);
  10. }

编译后的CSS代码为:

  1. .class1 {
  2.   color: #f5a9d0;
  3.   font-size: 20px;
  4. }
  5. .class2 {
  6.   color: #f79f81;
  7.   font-size: 20px;
  8. }

除此之外,像 JavaScript 中 arguments一样,Mixin 也有这样一个变量:@arguments。当 Mixin 引用这个参数时,它表示传递进来的所有参数。

很多情况下,@arguments参数可以省去很多代码。比如,在定义 box-shadow 的属性值时,如果不想单独处理每一个参数的话,就可以像这样写:

  1. .boxShadow(@x:0,@y:0,@blur:1px,@color:#000){
  2.    box-shadow: @arguments;
  3.  }
  4.  #header {
  5.    .boxShadow(2px,2px,3px,#f36);
  6.  }

编译后的CSS代码为:

  1. #header {
  2.    box-shadow: 2px 2px 3px #f36;
  3.  }

如果需要在 mixin 中不限制参数的数量,就可以在变量名后添加“...”,表示这里可以使用可变参数。这一点跟C语言比较类似。请看以下简单实例:

对于某些属性,它的参数个数是不确定的,而具体的参数个数,只有在使用的时候才知道,这种情况就适合使用可变参数。比如,padding 属性可以接受1个、或2个、或3个、或4个参数,就可以使用可变参数。Less代码如下:

  1. .padding(...) {
  2.     padding: @arguments;
  3. }
  4. .class1 { 
  5.     .padding(20px);
  6. .class2 { 
  7.     .padding(20px 30px);
  8. .class3 { 
  9.     .padding(20px 30px 40px); 
  10. .class4 { 
  11.     .padding(20px 30px 40px 50px); 
  12. 编译后的C

SS代码为:

  1. .class1 {
  2.   padding: 20px;
  3. }
  4. .class2 {
  5.   padding: 20px 30px;
  6. }
  7. .class3 {
  8.   padding: 20px 30px 40px;
  9. }
  10. .class4 {
  11.   padding: 20px 30px 40px 50px;
  12. }

可变参数的常见形式如下:

.mixin(...) { }          // it matches arguments from 0-n

.mixin() { }           // it matches exactly 0 arguments

.mixin(@x: 1) { }      // it matches arguments from 0-1

.mixin(@x: 1, ...) { }   // it matches arguments from 0-n

 

带参数的Mixin的更多相关文章

  1. less新手入门(二) Mixin 混合、带参数的Mixin

    四.mixin  混合 "mix - in"属性来自现有的样式!! 你可以在类选择器和id选择器中使用mixin, .a,#b{ color: rebeccapurple; } . ...

  2. C#的泛型的类型参数可以有带参数的构造函数的约束方式吗?

    Review后看到标题让我十分羞愧自己语文功底太差,估计...请见谅......我还特地把这句写回开头了...... 问题 前天遇到的一个问题,所以在MSDN发了个问,刚也丰富了下问题,关于泛型的. ...

  3. c#线程带参数

    c#线程带参数 ThreadStart threadStart = delegate { LoadPicture(ds.Tables[0]); }; Thread thread = new Threa ...

  4. 【笔记】Asp.Net WebApi对js POST带参数跨域请求的支持方案

    先说下需求:在原来的WebApi项目中增加对js跨域的请求支持,请求方式:以POST为主,webapi路由规则根据原项目需求修改如下: public static void Register(Http ...

  5. 用gulp打包带参数资源做法与asp.net/java项目结合的自动构建方案探讨

    先探讨方案,后续再实现. gulp打包前端教程配置:http://www.cnblogs.com/EasonJim/p/6209951.html 可能存在以下场景: 1.整个服务端采用接口的形式暴露给 ...

  6. C#微信公众号接口开发,灵活利用网页授权、带参数二维码、模板消息,提升用户体验之完成用户绑定个人微信及验证码获取

    一.前言 当下微信公众号几乎已经是每个公司必备的,但是大部分微信公众账号用户体验都欠佳,特别是涉及到用户绑定等,需要用户进行复杂的操作才可以和网站绑定,或者很多公司直接不绑定,而是每次都让用户填写账号 ...

  7. Oracle游标--cursor_01-简单不带参数实现功能

    对于游标这个概念,可以理解为类似我们以前学习的jdbc的结果集对象, 我们可以使用游标对结果集从上到下进行遍历,获取每一行内容 首先我们要分析一下游标的分类 带参数的 书写函数的整体架构 定义游标 开 ...

  8. ngResource提交json数据如何带参数

    ngResource提交json数据如何带参数 直接使用ngResource和REST服务接口交互可以让程序显得简洁,前提是配置好跨域和OPTIONS请求的支持,与此同时,如果需要带些额外的参数,有两 ...

  9. ui-router带参数的ui-sref配置

    ui-router带参数的ui-sref配置 路由 .state('app.user_edit', { url:'user/userid/:userid', templateUrl: 'compone ...

随机推荐

  1. UVa816,Ordering Tasks,WA

    #include <iostream> #include <cstdio> #include <string> #include <cstring> # ...

  2. 【深度学习系列】PaddlePaddle之手写数字识别

    上周在搜索关于深度学习分布式运行方式的资料时,无意间搜到了paddlepaddle,发现这个框架的分布式训练方案做的还挺不错的,想跟大家分享一下.不过呢,这块内容太复杂了,所以就简单的介绍一下padd ...

  3. 【转】linux IO子系统和文件系统读写流程

    原文地址:linux IO子系统和文件系统读写流程 我们含有分析的,是基于2.6.32及其后的内核. 我们在linux上总是要保存数据,数据要么保存在文件系统里(如ext3),要么就保存在裸设备里.我 ...

  4. Tomcat 笔记-配置虚拟目录

    ,默认情况下,只有webapps下的目录才能被Tomcat自动管理成一个web站点,把web站点的目录分散到其他磁盘管理就需要配置虚拟目录.把web应用所在目录交给web服务器管理,这个过程称之为虚拟 ...

  5. Zookeeper 笔记-应用场景

    应用场景:数据发布,订阅:分布式应用配置项:分布式计数器:统一命名服务:状态同步服务:集群管理:Master选举:分布式锁:定时任务争夺:分布式队列:分布式协调通知 特点:顺序一致性,原子性,单一视图 ...

  6. [译]ASP.NET Core 2.0 机密配置项

    问题 如何在ASP.NET Core 2.0中保存机密配置项(不用将其暴露给源代码管理器)? 答案 创建一个ASP.NET Core 2.0空项目,在项目节点上点击右键,并点击菜单项 - 管理用户机密 ...

  7. Nginx-OpenResty安装配置

    上两篇中介绍了: Ngnix技术研究系列1-通过应用场景看Nginx的反向代理 Ngnix技术研究系列2-基于Redis实现动态路由 发现,应该加一篇OpenResty的安装部署说明,方便大家按图索骥 ...

  8. LeetCode Questions List (LeetCode 问题列表)- Java Solutions

    因为在开始写这个博客之前,已经刷了100题了,所以现在还是有很多题目没有加进来,为了方便查找哪些没加进来,先列一个表可以比较清楚的查看,也方便给大家查找.如果有哪些题目的链接有错误,请大家留言和谅解, ...

  9. Mybatis报错:Parameter 'list' not found. Available parameters are [groupList, param1]

    GroupDao.java 里面定义的方法: void batchInsertLog(@Param("groupList") List<MktPromotionIntegra ...

  10. 本地文件与服务器文件同步shell脚本。

    #!/bin/sh read -t 30 -p "请输入项目名:" name echo -e "\n" echo "项目名为:$name" ...