动态的样式语言less语法详解之混合属性

所属分类: 网页制作 / CSS 阅读数: 1990
收藏 0 赞 0 分享

前面介绍了less的变量和extend语法,今天在研究下混合属性(Mixin)。混合可以说是less的另一个特征,你可以将通用属性定义在一块,然后使用时直接调用此混合属性。

混合:
  在 LESS 中我们可以定义一些通用的属性集为一个选择器,然后在另一个选择器中去调用这些属性. 例如:


复制代码
代码如下:

.a, #b {
color: red;
}
.mixin-class {
.a();
}
.mixin-id {
#b();
}

编译后


复制代码
代码如下:

.a, #b {
color: red;
}
.mixin-class {
color: red;
}
.mixin-id {
color: red;
}

注意:在调用混合时,可以加括号也可以不加括号。下面这个也是对的:


复制代码
代码如下:

.a, #b {
color: red;
}
.mixin-class {
.a;
}
.mixin-id {
#b;
}

如果你只想定义一个混合,则可以再选择器后面加上括号,如下:


复制代码
代码如下:

.my-mixin {
color: black;
}
.my-other-mixin() {
background: white;
}
.class {
.my-mixin;
.my-other-mixin;
}

编译后,加括号的.my-other-mixin()不会被编译。


复制代码
代码如下:

.my-mixin {
color: black;
}
.class {
color: black;
background: white;
}

任何 CSS class, id 或者 元素 属性集都可以以同样的方式引入.通用选择器中可以嵌套选择器。

命名空间:
  如果你想混合属性在一个更复杂的选择器,可以叠放多个id或类。如下:


复制代码
代码如下:

#outer {
.inner {
color: red;
}
}

如果想使用这个混合属性,你可以这样,下面四个都是等价的


复制代码
代码如下:

.c{
#outer > .inner;
}</p> <p>.c{
#outer > .inner();
}</p> <p>.c{
#outer.inner;
}</p> <p>.c{
#outer.inner();
}

你可以将混合属性定义在一个id的下面,这样就避免了与其他混合冲突。

关键字!important:
  在使用混合属性后面加上!important关键字,则混合中的所有属性都会加上关键字!important。例如:


复制代码
代码如下:

.foo (@bg: #f5f5f5, @color: #900) {
background: @bg;
color: @color;
}
.unimportant {
.foo(1);
}
.important {
.foo(2) !important;
}

编译后


复制代码
代码如下:

.unimportant {
background: #f5f5f5;
color: #900;
}
.important {
background: #f5f5f5 !important;
color: #900 !important;
}

带参数的混合:
  混合属性也可以通过括号传递参数,如下:


复制代码
代码如下:

.border-radius(@radius) {
-webkit-border-radius: @radius;
-moz-border-radius: @radius;
border-radius: @radius;
}

我们只需要在使用它的时候传递一个参数即可,如下:


复制代码
代码如下:

#header {
.border-radius(4px);
}
.button {
.border-radius(6px);
}

当然我们也可以给参数一个默认值,这样使用的时候可以传值也可以不传值。如下:


复制代码
代码如下:

.border-radius(@radius: 5px) {
-webkit-border-radius: @radius;
-moz-border-radius: @radius;
border-radius: @radius;
}

如果我们没有传值,则会使用默认值5px。

当然我们也可以传递多个参数,如下:


复制代码
代码如下:

.mixin(@color) {
color-1: @color;
}
.mixin(@color; @padding:2) {
color-2: @color;
padding-2: @padding;
}
.mixin(@color; @padding; @margin: 2) {
color-3: @color;
padding-3: @padding;
margin: @margin @margin @margin @margin;
}
.some .selector div {
.mixin(#008000);
}

编译后


复制代码
代码如下:

.some .selector div {
color-1: #008000;
color-2: #008000;
padding-2: 2;
}

从编译的结果可以看出,less也有函数重载的特性。当我们定义相同混合属性名,参数不同,然后.mixin(#008000);调用,第一和第二混合都能匹配,但是第三个缺少参数@padding的值,所以不会引用第三个混合属性。

我们不仅可以传多个值,还可以指定属性名传值,如下:


复制代码
代码如下:

.mixin(@color: black; @margin: 10px; @padding: 20px) {
color: @color;
margin: @margin;
padding: @padding;
}
.class1 {
.mixin(@margin: 20px; @color: #33acfe);
}
.class2 {
.mixin(#efca44; @padding: 40px);
}

关键字@arguments:
  @arguments有特殊的含义,类似于js的arguments,他包含了传递给混合属性的所有参数,如下:


复制代码
代码如下:

.box-shadow(@x: 0; @y: 0; @blur: 1px; @color: #000) {
-webkit-box-shadow: @arguments;
-moz-box-shadow: @arguments;
box-shadow: @arguments;
}
.big-block {
.box-shadow(2px; 5px);
}

编译后


复制代码
代码如下:

.big-block {
-webkit-box-shadow: 2px 5px 1px #000;
-moz-box-shadow: 2px 5px 1px #000;
box-shadow: 2px 5px 1px #000;
}

关键字@reset:
  与@arguments不同的是@reset包含除指明参数之外的参数,例如:


复制代码
代码如下:

.mixin(@a; @rest...) {
// @rest包含了@a之后的参数
// @arguments包含了所有参数
}

模式匹配:
  有时候你想让混合根据你传入的参数做不同的事情,比如:


复制代码
代码如下:

.mixin(dark; @color) {
color: darken(@color, 10%);
}
.mixin(light; @color) {
color: lighten(@color, 10%);
}
.mixin(@_; @color) {
display: block;
}
.class {
.mixin(@switch; #888);
}

对于.class你赋给变量@switch不同的值,不同的混合属性会被调用,比如

@switch: light;

编译后


复制代码
代码如下:

.class {
color: #a2a2a2;
display: block;
}

作为函数使用Mixin:
  当我们把混合当做函数使用时,在调用函数之后,函数中的变量是可以使用的,除非调用混合属性的元素自己定义了同样的变量。比如:


复制代码
代码如下:

.mixin() {
@width: 100%;
@height: 200px;
}
.caller {
.mixin();
width: @width;
height: @height;
}

编译后


复制代码
代码如下:

.caller {
width: 100%;
height: 200px;
}

使用表达式:


复制代码
代码如下:

.average(@x, @y) {
@average: ((@x + @y) / 2);
}
div {
.average(16px, 50px); // "call" the mixin
padding: @average; // use its "return" value
}

编译后


复制代码
代码如下:

div {
padding: 33px;
}

LESS VS SASS

同类框架还有 SASS : http://sass-lang.com/, 与 LESS 相比,两者都属于 CSS 预处理器,功能上大同小异,都是使用类似程序式语言的方式书写 CSS, 都具有变量、混入、嵌套、继承等特性,最终目的都是方便 CSS 的书写及维护。

更多精彩内容其他人还在看

Opera中国的WEB标准课程

网页制作Webjx文章简介:在这篇文章里,我要向大家介绍我和其他很多人花费数月时间开发的一个课程——Web标准课程,该课程旨在向大家提供Web设计和开发的坚实基础,无论读者是谁,此教程完全免费、可访问,并且不需要预备知识。当然,我主要还
收藏 0 赞 0 分享

CSS样式表渐进增强的基本概念

网页制作Webjx文章简介:如果你挠着头想弄清楚优雅降级和渐进增强的区别,我告诉你,这是视角问题。优雅降级和渐进增强都考虑网站在各种设备的各种浏览器上如何良好运转。两者区别的关键在于它们各自关注的焦点,以及这种关注对工作流程的影响
收藏 0 赞 0 分享

简单介绍Web Developer插件制作网页

网页制作Webjx文章简介:Firefox浏览器是一个良好支持W3C标准的开放源代码的浏览器,拥有Linux/Windows/Mac版本。因为Firefox浏览器良好支持W3C标准,所以使用Firefox来调试网页是非常好的。 Firefox浏览器是
收藏 0 赞 0 分享

CSS布局带来的巨大影响:CSS display属性值

网页制作Webjx文章简介:网页元素应用上那些与表格相关的display属性值后,能够模仿出与表格相同的特性。我将会在该文中给大家演示这种方法给CSS布局带来的巨大影响。 应原书编辑要求,先在文章顶部给出链接:《Everything You
收藏 0 赞 0 分享

用div css模拟表格对角线

这只是探讨一种CSS模拟表格对角线的用法,实际在工作中可能觉得这样做有点小题大作,这不是本主题讨论的重点。如果对此深以为然的朋友,请一笑过之 首先声明: 这只是探讨一种CSS模拟表格对角线的
收藏 0 赞 0 分享

IE Firefox在css中的差别 (部分)

1、单位问题 问题:任何距离的数值ie可以不加单位,ff必须要求写单位(0除外) 解决:写全单位如padding:0px; 2、水平居中 问题:div里的内容,ie默认为center,而ff默认left 解决:mairgin:0px auto; 3、高度问题
收藏 0 赞 0 分享

不用js可以实现信息提示效果

[code] <style> body { font:verdena; font-size:14px; color:#000 } h1{ font:verdena; font-size:22px; color:#000 } h2{ font:verdena;
收藏 0 赞 0 分享

CSS解决未知高度的垂直水平居中自适应问题

今天有人问起,晚上试着写出来,供参考; 以下代码兼容主流浏览器IE6、IE7、Firefox、Opera。 从最简单的开始………… 一、如何让一个DIV水平居中? 这个简单不作过多说明! [code] <st
收藏 0 赞 0 分享

CSS cursor 属性 -- 鼠标指针样式效果

取值: [ [<uri> ,]* [ auto | crosshair | default | pointer | move | e-resize | ne-resize | nw-resize | n-resize | se-resize | sw-resize |
收藏 0 赞 0 分享

css 简单区别ie6,ie7,firefox的写法

同一样式里可以这样 [code] margin:17px; FF +margin:17px; IE6 IE7 _margin:17px; IE6 [/code] 按这个顺序,刚好区分开三个浏览器
收藏 0 赞 0 分享
查看更多