摘录自Understanding placeholder selectors.

@extend

@extend让你能够在多个选择器中通过继承的方式共享一段样式:

.icon {
transition: background-color ease .2s;
margin: 0 .5em;
} .error-icon {
@extend .icon;
/* error specific styles... */
} .info-icon {
@extend .icon;
/* info specific styles... */
}

会被转化为:

.icon, .error-icon, .info-icon {
transition: background-color ease .2s;
margin: 0 .5em;
} .error-icon {
/* error specific styles... */
} .info-icon {
/* info specific styles... */
}

有个问题就是, 如果你不可能用到icon这个类呢?

占位符选择器%

占位符选择器(Placeholder Selector)是以%而不是.作为开始符的选择器. 它自身不会出现在编译后的CSS文件中, 只会出现在@extend了它的那些选择器中.

上例中, 用%icon替换.icon会得到:

.error-icon, .info-icon {
transition: background-color ease .2s;
margin: 0 .5em;
} .error-icon {
/* error specific styles... */
} .info-icon {
/* info specific styles... */
}

CSS中不会出现.icon类!

@extend vs. @include

乍看下, %选择器和无参数mixin差不多, 在浏览器中产生的效果是一样的, 但是编译后的CSS有很大不同.

@mixin icon {
transition: background-color ease .2s;
margin: 0 .5em;
} .error-icon {
@include icon;
/* error specific styles... */
} .info-icon {
@include icon;
/* info specific styles... */
}

以上代码会编译成

.error-icon {
transition: background-color ease .2s;
margin: 0 .5em;
/* error specific styles... */
} .info-icon {
transition: background-color ease .2s;
margin: 0 .5em;
/* info specific styles... */
}

可以看到, .error-icon.info-icon中继承自mixinicon的部分重复了两次, 有冗余. 但是用%选择器配合@extend就不会有这样的问题.

@extend的限制

@extend有个限制, 就是你不能@extend不同@media块中的样式. 这个限制同样对%选择器有效.

%icon {
transition: background-color ease .2s;
margin: 0 .5em;
} @media screen {
.error-icon {
@extend %icon;
} .info-icon {
@extend %icon;
}
}

这会导致编译错误:

You may not @extend an outer selector from within @media.
You may only @extend selectors within the same directive.
From "@extend %icon" on line 8 of icons.scss

这是由于@extend的实现方式其实是用调用@extend的类替换被@extend的类, 上例中即用.error-icon, .info-icon替换%icon. 但是由于这些调用@extend的类属于@media块, 这样直接替换会导致替换后的规则脱离@media块, 因此是非法的.

但是, 反过来就没事儿. 因为%icon属性原本就是在@media内部生效的, .error-icon, .info-icon继承来的这部分规则自然也只应该在该@media下生效.

@media screen {
%icon {
transition: background-color ease .2s;
margin: 0 .5em;
}
} .error-icon {
@extend %icon;
background-color: red;
} .info-icon {
@extend %icon;
background-color: green;
}

会被编译成

@media screen {
.error-icon, .info-icon {
transition: background-color ease .2s;
margin: 0 .5em;
}
} .error-icon {
background-color: red;
} .info-icon {
background-color: green;
}

Sass占位符选择器`%`的更多相关文章

  1. [Sass]占位符 %placeholder

    [Sass]占位符 %placeholder Sass 中的占位符 %placeholder 功能是一个很强大,很实用的一个功能,这也是我非常喜欢的功能.他可以取代以前 CSS 中的基类造成的代码冗余 ...

  2. sass中的占位符%,@extend,@mixin(@include)的编译区别和使用场景

    对于下面同一段css,它们的编译效率是不同的. 1.使用@extend:基础类icon会出现在编译后的css文件中,即使它可能只是拿来被继承,而不是作为icon这个class单独使用 //基础类ico ...

  3. sass中 混合宏 VS 继承 VS 占位符 各自的使用时机和特点

    初学者都常常纠结于这个问题“什么时候用混合宏,什么时候用继承,什么时候使用占位符?”其实他们各有各的优点与缺点,先来看看他们使用效果: a) Sass 中的混合宏使用 举例代码见 2-24 行 编译出 ...

  4. css编译工具Sass中混合宏,继承,占位符分别在什么时候使用

    //SCSS中混合宏使用 @mixin mt($var){ margin-top: $var; } .block { @include mt(5px); span { display:block; @ ...

  5. Sass混合宏、继承、占位符

    混合宏-声明混合宏如果你的整个网站中有几处小样式类似,比如颜色,字体等,在 Sass 可以使用变量来统一处理,那么这种选择还是不错的.但当你的样式变得越来越复杂,需要重复使用大段的样式时,使用变量就无 ...

  6. Sass之混合宏、继承、占位符

    1.混合宏. 当样式变得越来越复杂,需要重复使用大段的样式时,使用变量就无法达到我们目的了.这个时候混合宏就派上用场了. 而使用混合宏时,首先要声明混合宏,而声明混合宏时有两种,不带参数混合宏和带参数 ...

  7. Sass 混合宏、继承、占位符 详解

    混合宏-声明混合宏如果你的整个网站中有几处小样式类似,比如颜色,字体等,在 Sass 可以使用变量来统一处理,那么这种选择还是不错的.但当你的样式变得越来越复杂,需要重复使用大段的样式时,使用变量就无 ...

  8. sass 继承 占位符 %placeholder

    @extend //SCSS .btn { border: 1px solid #ccc; padding: 6px 10px; font-size: 14px; } .btn-primary { b ...

  9. sass---Sass混合宏、继承、占位符

    混合宏-声明混合宏如果你的整个网站中有几处小样式类似,比如颜色,字体等,在 Sass 可以使用变量来统一处理,那么这种选择还是不错的.但当你的样式变得越来越复杂,需要重复使用大段的样式时,使用变量就无 ...

随机推荐

  1. centos 6.4 Apache 配置 flv mp4.h264 流媒体拖动

    http://blog.csdn.net/xst686/article/details/9763995 加入流媒体扩展后要重启 httpd flv 流媒体 <textarea style=&qu ...

  2. 全面认识网络诊断命令功能与参数——netsh diagnostic命令

    netsh diagnostic是网络诊断命令,主要检测网络连接和服务器连接的状态.    注意:netsh不能在Window2000以下系统中使用.案例1:使用netsh diagnostic命令检 ...

  3. java培训(5-8节课)

    面向对象: 1.利用面向对象的语法,实现代码的拆分(数据存储:对象的传值). 2.利用面向对象的语法,实现程序的结构处理(继承,多态,接口,抽象类). 3.用面向对象的编程方法,理解实现程序开发的框架 ...

  4. 责任链模式(Chain of Responsibility Pattern)

    责任链模式:可以为某个请求创建一个对象链.每个对象依序检查此请求,并对其处理,或者把它传给链中的下一个对象. 责任链上的对象负责处理请求,客户只需要将请求发送到责任链上即可,无需关心处理的细节和请求的 ...

  5. Xml通用操作类

    using System; using System.Collections.Generic; using System.IO; using System.Text; using System.Xml ...

  6. Javascript 中 null、NaN和undefined的区别

    1.类型分析: js中的数据类型有undefined,boolean,number,string,object等5种,前4种为原始类型,第5种为引用类型. 代码 var a1; var a2 = tr ...

  7. 初涉GitHub

    安装 访问https://help.github.com/articles/set-up-git/,选择对应OS平台.有文档参考,我的是OpenSuse. 在console中下载安装http://ww ...

  8. php curl request

    /** * @desc curl request请求 * @date 2016-12-07 16:26:55 * * @param $arguments * * @return bool|mixed ...

  9. linux(centos)搭建svn

    1.yum install subversion 2.输入rpm -ql subversion查看安装位置 输入 svn --help可以查看svn的使用方法 3.创建svn版本库目录 mkdir - ...

  10. 2011年-CUshell编程大赛

    今天群里有人在做练习时遇到一个问题,$0中的分隔符使用OFS没有成功作用,遂查到这个问题,留作备忘查看 http://bbs.chinaunix.net/thread-2319120-1-1.html