SCSS笔记5 - 混合器(混合宏)

混合器@mixin和@include用于规则的复用

两者搭配使用,用于规则的复用。@mixin horizontal-list定义一个混合器,类似定义变量,只不过它对应的不是属性值,而是任意代码段,可以是一个(或多个!)规则,也可以只是一条、几条声明,还可以是声明跟规则的混合体,非常灵活。@include horizontal-list命令就是引用这个代码段,等于把@mixin horizontal-list内的全部代码复制到了这里。

@mixin horizontal-list {
  li {
    float: left;
    margin-right: 10px;
  }
}
#header ul.nav {
  @include horizontal-list;
  float: right;
}
#footer ul.nav {
  @include horizontal-list;
  margin-top: 1em;
}

何时使用混合器?

利用混合器,可以很容易地在样式表的不同地方共享样式。如果你发现自己在不停地重复一段样式,那就应该把这段样式构造成优良的混合器,尤其是这段样式本身就是一个逻辑单元,比如说是一组放在一起有意义的属性。判断一组属性是否应该组合成一个混合器,一条经验法则就是你能否为这个混合器想出一个好的名字。如果你能找到一个很好的短名字来描述这些属性修饰的样式,比如rounded-corners、fancy-font或者no-bullets,那么往往能够构造一个合适的混合器。如果你找不到,这时候构造一个混合器可能并不合适。

混合器在某些方面跟CSS的类(class)很像,都是让你给一大段样式命名,所以在选择使用哪个的时候可能会产生疑惑。最重要的区别就是类名是在HTML文件中应用的,而混合器是在scss中应用的。这就意味着类名具有语义化含义,而不仅仅是一种展示性的描述:类用来描述HTML元素的含义而不是HTML元素的外观。而另一方面,混合器是展示性的描述,用来描述一条CSS规则应用之后会产生怎样的效果。类名可以用诸如danger、warning这种有语义的名称,混合器可以用外观描述性的词,比如rounded-corners是圆角的意思,line-height-1.5表示1.5倍的行高。

进阶:预设了参数的@mixin

@mixin horizontal-list($spacing: 10px, $dangercolor) {
  li {
    float: left;
    margin-right: $spacing;
    color: $dangercolor;
  }
}
#header ul.nav {
  @include horizontal-list(15px, #ff0000);
  float: right;
}
#footer ul.nav {
  @include horizontal-list(20px, $dangercolor: red);
  margin-top: 1em;
}

在代码块的名字horizontal-list的后面加上($spacing: 10px),$spacing是参数变量名,10px是初始值,然后在代码块使用$spacing,这样,当有@include horizontal-list,复制来的margin-right: $spacing就是margin-right: 10px,如果更改了变量的值,比如@include horizontal-list(20px),那么等同于margin-right: 20px

如果你觉得@include horizontal-list(15px, #ff0000);中的15px, #ff0000不够直观,总要去找20px对应的是什么变量,那么你还可以用更直观的方式:@include horizontal-list(20px, $dangercolor: red);

可以给混合器(还有参数)传入变量、列表(即数组)、映射(即对象),混合器(和函数)会自动将这些转换为参数列表。

问题一,@mixin+@include跟变量$有什么区别?

相同点:
都要起个名字,这个名字都是只在scss环境有效,HTML中无效。

不同点:
变量$只指代一个属性值,或者属性值的一部分,比如20px、100%、red、1px solid yellow等。
@mixin指代任意代码段,比变量厉害得多。

问题二,@mixin+@include跟变量@import有什么区别?

相同点:
都是忠实的把代码段贴入命令所在位置。

不同点:
@import只能引入文件,后面只能跟文件名,需要你先有一个文件;
@include只能引入代码段,需要你先用@mixin定义一个代码段。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,509评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,806评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,875评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,441评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,488评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,365评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,190评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,062评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,500评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,706评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,834评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,559评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,167评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,779评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,912评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,958评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,779评论 2 354

推荐阅读更多精彩内容

  • 再谈CSS 预处理器2016-09-09 Justineo JavaScript转自:http://efe.bai...
    抓住时间的尾巴吧阅读 1,571评论 0 2
  • 基础 声明变量 普通变量 默认变量 变量覆盖:只需要在默认变量之前重新声明下变量即可 变量的调用 局部变量和全局变...
    Jill1231阅读 1,282评论 0 1
  • 1、SCSS 是 Sass 的新语法格式,从外形上来判断他和 CSS 长得几乎是一模一样,代码都包裹在一对大括号里...
    夜幕小草阅读 1,711评论 2 10
  • <a name='html'>HTML</a> Doctype作用?标准模式与兼容模式各有什么区别? (1)、<...
    clark124阅读 3,474评论 1 19
  • 今天,我去学架子鼓。在去的时候我一直在想,今天是继续学《逆战》还是
    追梦的小蜜蜂阅读 122评论 0 0