SASS详解之继承(extend)

  每一个类名都有可能有另一个类名的所有样式和它自己的特定样式的。当一个div的身上有两个类名,一个是“one”,另一个是“two”的时候。如下

  HTML代码

  1. <div class="one two">
  2. 梦龙小站
  3. </div>


  CSS代码

  1. .one {width:100px;height:100px;}
  2. .two {background:red;border:5px solid #000;}


  这就意味着,我们要配备一个很好的记忆力才能应急那些棘手的BUG问题。很多时候,我们需要一个个的找到类名“one”的样式才逐一改过。这样在无形中加大了。而在SASS中,有那么一个功能,继承,可以方便轻松的让这棘手的问题变得很简单。@extend指令,可以继承你想要的类名。如下

  SCSS代码

  1. .one {
  2. width:100px;height:100px;
  3. }
  4. .two {
  5. @extend .one;
  6. background:red;border:5px solid #000;
  7. }


  编译后的CSS代码

  1. .one, .two {
  2. width: 100px;
  3. height: 100px;
  4. }
  5.  
  6. .two {
  7. background: red;
  8. border: 5px solid #000;
  9. }


  从上面的例子可以看出,类名“one”,可以被所有的类名继承。而继承类名“.one”的类名还可以有专属于自己的类名,专属的样式和风格,并不影响类名“.one”本身的样式。

 它是如何工作

  SASS中继承(Extend)将想要继承的选择器(如“.two”)和其引用的选择器(如“.one”)组成群组选择器中间用逗号隔开,组成群组选择器。如下:红色背景和边框是类名“.two”单加的样式,而宽度高度都是继承类名(“.one”)的。如下

  SCSS代码

  1. .one {
  2. width:100px;height:100px;
  3. }
  4. .two {
  5. /*继承的样式*/
  6. @extend .one;
  7. /*独立的样式*/
  8. background:red;
  9. border:5px solid #000;
  10. }


  编译后的CSS代码

  1. .one, .two {
  2. /*继承的样式*/
  3. width: 100px;
  4. height: 100px;
  5. }
  6.  
  7. .two {
  8. /*独立的样式*/
  9. background: red;
  10. border: 5px solid #000;
  11. }


  就在合并选择器的时候,SASS中继承(Extend)是相当聪明的,会自己避免一些不必要的错误,或者说是不为人知的错处,也不会产生各种多余的东西如“##two”。

 继承复杂的选择器


  

  要继承的不仅仅是一个类名,可以是一个id也可以是一个元素,也可以是某个状态,任何选择器都能继承。如下

  SCSS代码

  1. .hoverlink {
  2. @extend a:hover;
  3. }
  4. a:hover {
  5. text-decoration: underline;
  6. }


  编译后的CSS代码

  1. a:hover, .hoverlink {
  2. text-decoration: underline;
  3. }


  就像上面编译出来的一样,在hover状态下的样式也能继承。所以不仅是a的hover状态,几乎任何选择器都能继承。

 继承多个选择器


 

  在编写的过程中,往往会遇到一个选择器要继承多个选择器的样式,那么这应该怎么办呢?看看下面的小实例吧。

  SCSS代码

  1. .one {
  2. width:100px;height:100px;
  3. }
  4. .two {
  5. /*继承的样式*/
  6. @extend .one;
  7. @extend .three;
  8. /*独立的样式*/
  9. background:red;
  10. border:5px solid #000;
  11. }
  12. .three {
  13. padding:10px;
  14. }


  编译后的CSS代码

  1. .one, .two {
  2. width: 100px;
  3. height: 100px;
  4. }
  5.  
  6. .two {
  7. background: red;
  8. border: 5px solid #000;
  9. }
  10.  
  11. .three, .two {
  12. padding: 10px;
  13. }


  上面的例子告诉我,继承多个选择器的样式是得写多个“@extend”,但事实上有没有简便写法呢?看下面的小例子。

  SCSS代码

  1. .one {
  2. width:100px;height:100px;
  3. }
  4. .two {
  5. /*继承的样式*/
  6. @extend .one, .three;
  7. /*独立的样式*/
  8. background:red;
  9. border:5px solid #000;
  10. }
  11. .three {
  12. padding:10px;
  13. }


  编译后的CSS代码

  1. .one, .two {
  2. width: 100px;
  3. height: 100px;
  4. }
  5.  
  6. .two {
  7. /*独立的样式*/
  8. background: red;
  9. border: 5px solid #000;
  10. }
  11.  
  12. .three, .two {
  13. padding: 10px;
  14. }


  从上面的小例子,不难看出,继承多个选择器的样式是有简便方法的,那就是继承的多个选择器自己用逗号“,”隔开即可。

 链型继承

  在咱们编写的过程中,不仅仅的单方面的继承,很多时候都是类名“.three”继承类名“.two”,而类名“.two”又继承了类名“.one”。那么这样的情况在SASS中应该怎么写呢?写法如下

  SCSS代码

  1. .one {
  2. width:100px;height:100px;
  3. }
  4. .two {
  5. /*继承的样式*/
  6. @extend .one;
  7. /*独立的样式*/
  8. background:red;
  9. border:5px solid #000;
  10. }
  11. .three {
  12. /*继承的样式*/
  13. @extend .two;
  14. /*独立的样式*/
  15. padding:10px;
  16. }


  编译后的CSS代码

  1. .one, .two, .three {
  2. /*继承的样式*/
  3. width: 100px;
  4. height: 100px;
  5. }
  6.  
  7. .two, .three {
  8. /*独立的样式*/
  9. background: red;
  10. border: 5px solid #000;
  11. }
  12.  
  13. .three {
  14. /*独立的样式*/
  15. padding: 10px;
  16. }


  从编译后的CSS中不难看出,类名“.one”变成了群组选择,添加了类名“.two”和类名“.three”。而类名“.two”变成了群组选择,添加了类名“.three”。那么为什么叫做链型继承呢?是因为一层一层的继承,很像一条链子故得名。

 继承的局限性

  虽然能够继承的选择器数量很多,但是也有很多选择器并不被支持继承的,如包含选择器(.one .two)或者相邻兄弟选择器(.one+.two)目前还是不支持继承。但若继承的元素是“a”,恰巧这个元素“a”又有hover状态的样式,那么hover状态的样式也会被继承。如下

  SCSS代码

  1. .myLink {
  2. @extend a;
  3. }
  4. a {
  5. color: blue;
  6. &:hover {
  7. text-decoration: underline;
  8. }
  9. }


  编译后的CSS代码

  1. a, .myLink {
  2. color: blue;
  3. }
  4. a:hover, .myLink:hover {
  5. text-decoration: underline;
  6. }


  继承有强大的地方,也有局限的地方。对于a的继承可以继承其hover状态,但是对于某些选择器就不适用了。

 继承交叉合并选择

  继承交叉合并选择,从字面上其实很难理解说的事件什么事儿。既然有点难理解,那么就先看小例子吧,用例子来解释感觉会比较清楚。例子如下

  SCSS代码

  1. .meng a {
  2. font-weight:bold;
  3. }
  4.  
  5. .long .link {
  6. @extend a;
  7. }


  编译后的CSS代码

  1. .meng a, .meng .long .link, .long .meng .link {
  2. font-weight: bold;
  3. }


  从上面 的例子不难看出,类名“.meng”中的“a”选择器被类名“.long”中的类名“.link”继承了,但是由于没有在同一个父级下,会产生交叉合并的编译结果。这种其实是可以解决的,就是把父级改成相同的即可。若父级不能改的话,那么就乖乖的在写一遍,或者将“.meng a”直接换成类名,继承这个类名也可以。

 继承带%的东西

  有时候你想继承一个类名,但是并不想再在HTML中使用,就单单想写一个能够继承的类名。尤其是不想让它出现在css样式中。我们可以用占位符来写一些继承的样式(如“%one”),然后再通过@extend继承,这样就可以防止被渲染到CSS的规则集中。如下

  SCSS代码

  1. #meng a%long {
  2. color: blue;
  3. font-weight: bold;
  4. font-size: 2em;
  5. }
  6.  
  7. .notice {
  8. @extend %long;
  9. }


  编译后的CSS代码

  1. #meng a.notice {
  2. color: blue;
  3. font-weight: bold;
  4. font-size: 2em;
  5. }


 继承在指令中的作用域

  继承在指令中是有作用域问题的,继承是无法使在指令如(@media)之外的选择器继承的,要是继承就只能写在指令中。实例如下

  SCSS代码

  1. .one {
  2. height:300px;
  3. }
  4. @media print {
  5. .two {
  6. @extend .one;
  7. width:300px;
  8. }
  9. }


  编译后的CSS代码

  1. .one {
  2. height: 300px;
  3. }
  4.  
  5. @media print {
  6. .two {
  7. width: 300px;
  8. }
  9. }


  右上可见,类名“.two”并没有继承类名“.one”的样式,那么需要让类名“.two”成功继承类名“.one”的样式,就应该把类名“.one”也放在@media中,实例如下

  SCSS代码

  1. @media print {
  2. .one {
  3. height:300px;
  4. }
  5. .two {
  6. @extend .one;
  7. width:300px;
  8. }
  9. }


  编译后的CSS代码

  1. @media print {
  2. .one, .two {
  3. height: 300px;
  4. }
  5.  
  6. .two {
  7. width: 300px;
  8. }
  9. }

  SASS详解之继承(extend)就为大家介绍到这里了,感谢大家能够耐心的看到这里。更多有关SASS的详解敬请关注梦龙小站SASS详解的更新。

     来源:http://www.myexception.cn/web/1457740.html

SASS详解之沿袭(extend)的更多相关文章

  1. SASS详解之混合(mixins)

    SASS详解之混合(mixins)可以出现在SASS的任何地方.有很多类名具有相同或者相似的样式,就可以用SASS中的混合(mixins)来进行编写,然后针对不同类名的不同样式逐一编写. 定义一个混合 ...

  2. SASS详解之编译输出的样式

    SASS是一种CSS预处理语言,没有装环境的话是不能被解析的.但是有了koala编译工具之后,解析SASS不需要环境也毫无压力了.SASS的输出格式有四种:嵌套.扩大.紧凑和压缩.下面结合小例子为大家 ...

  3. 区别和详解:jQuery extend()和jQuery.fn.extend()

    1.认识jQuery extend()和jQuery.fn.extend() jQuery的API手册中,extend方法挂载在jQuery和jQuery.fn两个不同对象上方法,但在jQuery内部 ...

  4. jQuery extend方法详解

    先说个概念的东西: jQuery为开发插件提拱了两个方法,分别是: $.fn.extend(item):为每一个实例添加一个实例方法item.($("#btn1") 会生成一个 j ...

  5. 【转载】jQuery.extend 函数详解

    转载自:http://www.cnblogs.com/RascallySnake/archive/2010/05/07/1729563.html jQuery.extend 函数详解 JQuery的e ...

  6. 高效开发之SASS篇 灵异留白事件——图片下方无故留白 你会用::before、::after吗 link 与 @import之对比 学习前端前必知的——HTTP协议详解 深入了解——CSS3新增属性 菜鸟进阶——grunt $(#form :input)与$(#form input)的区别

    高效开发之SASS篇   作为通往前端大神之路的普通的一只学鸟,最近接触了一样稍微高逼格一点的神器,特与大家分享~ 他是谁? 作为前端开发人员,你肯定对css很熟悉,但是你知道css可以自定义吗?大家 ...

  7. jquery的2.0.3版本源码系列(4):285-348行,extend方法详解

    目录 1 . jquery extend的基本使用 通过285行的源码 jQuery.extend = jQuery.fn.extend = function() { ,extend方法要么是直接挂在 ...

  8. Sass map详解

    作为一个CSS预处理器,Sass正受到越来越多的青睐,诸如Github.Codepen.CSS-Tricks.SitePoint.w3cplus等网站采用Sass组织.管理CSS文件,Sass正在逐渐 ...

  9. jQuery插件开发的两种方法及$.fn.extend的详解(转)

    jQuery插件开发的两种方法及$.fn.extend的详解 jQuery插件开发分为两种:1 类级别.2 对象级别,下面为大家详细介绍下   jQuery插件开发分为两种: 1 类级别 类级别你可以 ...

随机推荐

  1. Solr4.8.0源码分析(21)之SolrCloud的Recovery策略(二)

    Solr4.8.0源码分析(21)之SolrCloud的Recovery策略(二) 题记:  前文<Solr4.8.0源码分析(20)之SolrCloud的Recovery策略(一)>中提 ...

  2. BZOJ 1257 余数之和

    Description 给出正整数\(n\)和\(k\),计算\(j(n, k)=k\;mod\;1\;+\;k\;mod\;2\;+\;k\;mod\;3\;+\;-\;+\;k\;mod\;n\) ...

  3. google yeoman

    Yeoman是Google的团队和外部贡献者团队合作开发的,他的目标是通过Grunt(一个用于开发任务自动化的命令行工具)和Bower(一个HTML.CSS.Javascript和图片等前端资源的包管 ...

  4. Ubiquitous Religions(并查集)

    Description There are so many different religions in the world today that it is difficult to keep tr ...

  5. HYPER-V2008里安装WINDOWS 2012,以及监控宝

    呵呵,这两者有关系么?没关系.哈哈. 为了方便就放一起了. 至少,2008里的HYPERV能安装2012,倒是给我很多欣慰.

  6. Android Wear开发 - 卡片通知 - 第一节 : 添加Android Wear通知特性

    一. 前言说明 Android Wear大部分显示形式是卡片的形式,而最简单地支持Android Wear方式就是用通知**Notification**.而实现最简单的,非高度自定义的通知,则只需要在 ...

  7. OpenGL图形管线和坐标变换

    转:http://blog.csdn.net/zhulinpptor/article/details/5897102 1. OpenGL 渲染管线 OpenGL渲染管线分为两大部分,模型观测变换(Mo ...

  8. HDOJ(HDU) 2106 decimal system(进制相互转换问题)

    Problem Description As we know , we always use the decimal system in our common life, even using the ...

  9. vijosP1194 Domino

    vijosP1194 Domino 链接:https://vijos.org/p/1194 [思路] 矩阵相乘. 参考Matrix67的文章: [代码] #include<cstdio> ...

  10. poj2774 Long Long Message(后缀数组)

    [题目链接] http://poj.org/problem?id=2774 [题意] A & B的最长公共子序列. [思路] 拼接+height数组.将AB拼接成一个形如A$B的串,枚举hei ...