前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Sass->什么时候使用Mixins 和 Placeholders

Sass->什么时候使用Mixins 和 Placeholders

作者头像
前端知否
发布于 2020-03-23 09:44:10
发布于 2020-03-23 09:44:10
82600
代码可运行
举报
文章被收录于专栏:前端知否前端知否
运行总次数:0
代码可运行

原文:https://www.sitepoint.com/sass-mixin-placeholder/

一年半之前,我开始使用Sass的时候,对于 include a mixinextending a placeholder的区别,我花费了一些时间去理解它们。 在那个时候,单单placeholder的概念,就已经相当于一种黑魔法巫术一样让我不知其解。

如果你有同样的疑问,不要担心,我接下来会说解释指明它们之间的区别。今天我们会学到minxin是什么东西,和什么时候去使用Sass的placeholder。你会明白他们有不同的用处,不能混淆使用。

提醒:我接下来要谈论的关于Sass的观点,同样适用于其他CSS预处理器,不管是Stylus,Less,还是其他的。技术大多做的是同样的事情,所以完全不用担心这篇文章的内容,是否适合你已经选择使用的其他CSS预编译工具。

首先我们先去熟悉和认识 Sass placeholders and mixins

Mixin it up, 混合体,封装体

一个mixin指令可以让你去定义很多CSS规则。把它看做是一个function函数,方法,这个function可以有自己的参数。它会输出这些css规则内容,而不是返回一个值。下边是来自Sass官方参考里定义:

Mixins 允许自己定义样式,这些样式可以在全局样式表里重用,而不用去借助一些无语义的类,比如 .float-left。Mixins可以包含完整的CSS样式规则和其他Sass中的特性规则等。mixin还可以接收参数,不同的参数值将产生不同的样式规则。

在样式表中,你会见到一些CSS规则声明被重复出现了好多次。你明白这样的代码不好,而且还知道DRY(Don't Repeat yourself)这个概念原则。现在使用mixin去改善这样的代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@mixin center() {
  display: block;
  margin-left: auto;
  margin-right: auto;
}

.container {
  @include center();
  /* Other styles here... */
}

/* Other styles... */

.image-cover {
  @include center;
}

提醒:include使用的时候,如果你不传递参数给mixin,那么可以去掉mixin名字后边的括号。比如 @includecenter; 其实你也可以在mixin定义的时候就把括号去掉。比如 @mixincenter{}

定义了这个mixin之后,你就不用每次去重复那三行元素居中的规则。使用的时候,就去包含这个mixin。

在某些情况下,可以使用一个mixin去创建一些属性组合的“缩写”。例如 widthheight。你应该已经厌倦了重复书写这两行属性。特别是当这两个属性值一样的时候。现在我们就使用一个mixin来解决这些问题!

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@mixin size($width, $height: $width) {
  width: $width;
  height: $height;
}

很简单吧。这里我们设置hight属性的 默认值和width参数的值一样。当你想定义一个元素的面积大小时,你可以这样做:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.icon {
  @include size(32px);
}

.cover {
  @include size(100%, 10em);
}

提醒:当我想去设置一个元素的position属性时,为了避免逐个书写top, right, bottom, left这些属性。也可以去使用mixin这种很好的语法糖。

认识 Placeholder(占位符)

Placeholders 是一种奇怪的东西。它们是class,但是在Sass编译过后,并不会被输出,出现在样式表文件里。然后你会问它有什么意义。事实上,如果不是为了 @extend这个指令,它都没什么意义。你可以这样去写一个placeholder:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
%center {
  display: block;
  margin-left: auto;
  margin-right: auto;
}

提醒:Like a placholder, a mixin is likewise useless unless its referenced, so this section is not necessarily saying they are different in that respect, but this is only clarifying that even though it looks similar to a CSS declaration block, it won’t get compiled on its own.

placeholder的写法使用%,而不是.(点),但是遵守class的命名规则。

如果编译Sass文件,placeholder的代码不会出现在生成的css的文件里。正如我说过的,placeholder的代码不会被编译出现在css源文件里。

placeholder 要通过 @extend 去使用。 @extend指令的作用是 继承一个 CSS选择器的属性或者一个 Sass的placeholder代码。例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.container {
  @extend %center;
}

这样之后,Sass会获得 %center这个placeholder的内容给 .container 这个类。

另外,你还可以extend一个CSS class,就像这样:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.table-zebra {
  @extend .table;

  tr:nth-of-type(even) {
    background: rgba(0,0,0,.5);
  }
}

这是 @extend的常用法。当你使用模块组件化开发一个网站或者应用,继承选择器是便利的。

使用哪一个

我们应该使用哪一个,mixin还是placeholder。要看具体使用场景。 最好的建议是:如果你需要参数变量,使用mixin。否则,继承一个placehodler。这样做两个原因:

第一,在placeholder里面,不能像mixin那样传递使用参数变量。但是可以使用全局变量。

第二,当你使用mixin时,Sass会重复输出这个mixin的属性规则内容,不会让CSS选择器公用这个mixin。这样的话,样式表将会变得很大。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@mixin center {
  display: block;
  margin-left: auto;
  margin-right: auto;
}

.container {
  @include center;
}

.image-cover {
  @include center;
}

输出如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.container {
  display: block;
  margin-left: auto;
  margin-right: auto;
}

.image-cover {
  display: block;
  margin-left: auto;
  margin-right: auto;
}

看到重复的CSS了吧。如果只有三行代码重复的话,感觉好像问题还不是很糟糕。但是如果这个mixin有300行呢。重复的代码就太多了。那让我们使用placeholder改造一下这个示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
%center {
  display: block;
  margin-left: auto;
  margin-right: auto;
}

.container {
  @extend %center;
}

.image-cover {
  @extend %center;
}

下边是生成的CSS:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.container, 
.image-cover {
  display: block;
  margin-left: auto;
  margin-right: auto;
}

看起来好多了吧。这样就避免了总是重复相同的属性规则,使用placeholder,会让整个样式表文件很瘦。

另外,如果你在不同的地方都要使用一些属性,但是这些属性的值是变量决定的,那么mixin是一个好的选择。如果你的CSS属性同时有固定的和变动的值,那么你可以组合使用mixin和placeholder。例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
%center {
  margin-left: auto;
  margin-right: auto;
  display: block;
}

@mixin skin($color, $size) {
  @extend %center;
  background: $color;
  height: $size;
}

a { @include skin(pink, 10em) }
b { @include skin(blue, 90px) }

在这个示例里边,mixin继承了placeholder, 生成了干净不重复的CSS:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
a, b {
  margin-left: auto;
  margin-right: auto;
  display: block;
}

a {
  background: pink;
  height: 10em;
}

b {
  background: blue;
  height: 90px;
}

总结

希望你已经清楚了什么是mixins和placeholders,而且知道什么时候去使用它们和它们编译之后的效果。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-01-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 前端知否 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Sass 基础(五)
@if   @if 指令是一个SassScript,它可以根据条件处理样式块,如果条件为true返回一个样式块,反之   false 返回另一个样式块,在Sass 中除了@if之,还可以配合@else if和eles 一起。   例如:      //SCSS       @mixin blockOrHidden($boolean:true){             @if $boolean {               @debug "$boolean is
用户1197315
2018/01/19
7750
前端架构师技术之Sass
CSS 仅仅是一个标记语言,不是编程语言,因此不可以自定义变量,也不可以引用。CSS 主要有以下缺点。
用户9184480
2024/12/13
590
bootstrap快速入门笔记(四)-less用法指南, mixin和变量
这是主要的 Less 文件。该文件中导入了一些其他的 less 文件。该文件中没有任何代码。
用户3055976
2019/02/25
2.1K0
Sass混合宏
在Sass中,我们可以使用“混合宏(mixin)”来处理经常被多个地方使用的相同的CSS代码块。混合宏,跟JavaScript中的函数很相似,我们可以称之为“Sass中的函数”。
Qwe7
2022/05/15
4880
Sass-学习笔记【进阶篇】
特别说明: 没有sass基础请移步:【Sass-学习笔记【基础篇】】http://www.cnblogs.com/padding1015/articles/7056323.html 最底部附结构图(实
xing.org1^
2018/05/17
4.6K0
前端 Web 开发常见问题概述
以下列举的,都是 JS 前端开发中最为常见的问题。知悉这些问题,不懂编程也能冒充前端大牛了。
LIYI
2019/09/02
1.4K0
前端 Web 开发常见问题概述
拥抱sass,抛弃compass
IMWeb前端团队
2017/12/29
1.4K0
Sass-学习笔记【基础篇】
最下边附结构图 在线编辑器网址如下:http://sassmeister.com/  注意编写的时候,符号千万别用了中文的:、;、。...之类的,会报错,Sass也转换不成css。 less和sass的区别: 博客园文章—http://www.cnblogs.com/wangpenghui522/p/5467560.html 本章主要内容:变量 、混合宏 、继承 、占位 、插值 、运算 、数据类型 1:定义 Sass是css预处理器的一种,也是最早的css预处理语言。Sass采用Ruby语言编写,为css增
xing.org1^
2018/05/17
4.9K0
走进Sass殿堂
IMWeb前端团队
2017/12/29
6880
Sass(Scss)、Less的区别与选择 + 基本使用
Sass(Scss)、Less 都是 CSS 预处理器,他们定义了一种新的语言,其基本思想是,用一种专门的编程语言为 CSS 增加了一些编程的特性,将 CSS 作为目标生成文件,然后开发者就只要使用这种语言进行 CSS 的编码工作。
老猫-Leo
2023/12/11
1.7K0
【编码规范】Airbnb CSS \u002F Sass 编码风格指南
在规则声明中,“选择器” 负责选取 DOM 树中的元素,这些元素将被定义的属性所修饰。选择器可以匹配 HTML 元素,也可以匹配一个元素的类名、ID, 或者元素拥有的属性。以下是选择器的例子:
一尾流莺
2022/12/10
2.4K0
CSS预处理器的对比 — sass、less和stylus
本文根据Johnathan Croom的《sass vs. less vs. stylus: Preprocessor Shootout》所译,整个译文带有我们自己的理解与思想,如果译得不好或不对之处还请同行朋友指点。如需转载此译文,需注明英文出处:http://net.tutsplus.com/tutorials/html-css-techniques/sass-vs-less-vs-stylus-a-preprocessor-shootout/,以及作者相关信息 ——作者:Johnathan Croom
laixiangran
2018/04/11
4.7K0
CSS预处理器的对比 — sass、less和stylus
SASS详解@mixins/@include/@extend/@at-root
Sass 支持所有CSS3的 @规则,以及一些已知的其他特定的Sass "指令"。这些在 Sass 都有对应的效果,更多资料请查看 控制指令 (control directives) 。今天重点讲mixins/include/extend
周陆军博客
2023/05/14
1.1K0
CSS预处理器入门:Sass/SCSS的实用指南
随着网页开发越发复杂,CSS 的可维护性也越显重要,但在 CSS 语法仍然受限的状况下,发展出了 CSS Preprocessor(CSS 预处理器)来扩展更多的写法。
写bug的高哈哈
2025/01/26
2110
CSS预处理器入门:Sass/SCSS的实用指南
【Sass学习笔记】004-Sass 的基本特性-基础(重要)
在有些编程语言中(如,JavaScript)声明变量都是使用关键词“var”开头,但是在 Sass 不使用这个关键词,而是使用大家都喜欢的美元符号“$”开头。我想用一张图来解释,我一直坚信,一图胜千言万语:
訾博ZiBo
2025/01/06
1000
sass 概要
前端开发中最大的坑之一莫过于写css,流水账式的写法让众多码农们头痛不已。好在有了sass,写css不再死板。sass对css的增强如下:
宅蓝三木
2020/02/18
9370
CSS预处理器之Sass
"liveSassCompile.settings.autoprefix": 自动添加 CSS 前缀的配置。设置为使用最新的两个版本和全球使用率超过 1% 的浏览器。
HelloWorldZ
2024/03/20
1930
CSS预处理器之Sass
前端面试(4)less,sass,stylus
注意,border 后面必须加上冒号。 在嵌套的代码块内,可以使用&引用父元素。比如 a:hover 伪类,可以写成:
leader755
2022/03/08
1.4K0
小而美的 css 的原子化
引用 文章 Let’s Define Exactly What Atomic CSS is 中定义:
政采云前端团队
2022/12/01
8440
小而美的 css 的原子化
Sass 基础(八)
@import       Sass 支持所有css 的@规则,以及一些Sass 专属的规则,也被称为“指令(directive)”.这些规则在Sass 中具有不同的       功效,详细解释如下。       @import         Sass 扩展了CSS 的@import 规则,让它能够引入 SCSS 和 Sass         文件。 所有引入的 SCSS 和 Sass 文件都会被合并并输出一个单一         的 CSS 文件。 另外,被导入的文件中所定义的变量或
用户1197315
2018/01/19
9870
相关推荐
Sass 基础(五)
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验