摘录自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. Mysql - 解决Access denied for user ''@'localhost' to database 'mysql'问题

    http://361324767.blog.163.com/blog/static/11490252520124454042468/ 首先我想说一句话: 我极度鄙视国内搞IT的人,简直无语,同样是解决 ...

  2. PL/SQL Developer 使用中文条件查询时无数据的解决方法

    PL/SQL Developer 使用中文条件查询时无数据,这是由于字符集的不一致导致的. 执行以下sql命令:select userenv('language') from dual; 显示:SIM ...

  3. oracle 12 C启动问题

    启动时出现以下报错信息: SQL> startup; ORA-48146: missing read, write, or exec permission on directory during ...

  4. 17_JSP_入门

    [JSP简述] JSP全称是Java Server Pages,它和Servlet技术一样,都是一种用于开发动态Web页面的技术. * html页面:用html写的页面 * JSP页面:用html写页 ...

  5. 7zS.sfx RunProgram with parameters

    Config.txt as below: Pay attention to this \"  ;!@Install@!UTF-8! RunProgram="setup.exe&qu ...

  6. OpenJudge 2757 最长上升子序列 / Poj 2533 Longest Ordered Subsequence

    1.链接地址: http://poj.org/problem?id=2533 http://bailian.openjudge.cn/practice/2757 2.题目: 总Time Limit: ...

  7. CentOS7 安装LAMP环境

    1.使用yum安装 yum -y install httpd mysql mysql-server php php-mysql postgresql postgresql-server php-pos ...

  8. Navicat for mysql远程连接数据库详(1130错误解决方法)

    用Navicat for mysql连接数据库测试下连接 如果出现1130错误错误代码是1130,ERROR 1130: Host xxx.xxx.xxx.xxx is not allowed to ...

  9. 在linux下安装memcacheq

    #!/bin/bash mkdir ~/build cd ~/build wget http://download.oracle.com/berkeley-db/db-5.1.19.tar.gz .t ...

  10. PHP学习心得(六)——变量

    PHP 中的变量用一个美元符号后面跟变量名来表示.变量名是区分大小写的.一个有效的变量名由字母或者下划线开头,后面跟上任意数量的字母,数字,或者下划线.$this 是一个特殊的变量,它不能被赋值.PH ...