SASS详解之沿袭(extend)

SASS详解之继承(extend)

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

  HTML代码

<div class="one two">
梦龙小站
</div>


  CSS代码

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


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

  SCSS代码

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


  编译后的CSS代码

.one, .two {
  width: 100px;
  height: 100px;
}

.two {
  background: red;
  border: 5px solid #000;
}


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

 它是如何工作

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

  SCSS代码

.one {
	width:100px;height:100px;
}
.two {
	/*继承的样式*/
	@extend .one;
	/*独立的样式*/
	background:red;
	border:5px solid #000;
}


  编译后的CSS代码

.one, .two {
  /*继承的样式*/
  width: 100px;
  height: 100px;
}

.two {
  /*独立的样式*/
  background: red;
  border: 5px solid #000;
}


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

 继承复杂的选择器


  

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

  SCSS代码

.hoverlink {
  @extend a:hover;
}
a:hover {
  text-decoration: underline;
}


  编译后的CSS代码

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


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

 继承多个选择器


 

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

  SCSS代码

.one {
	width:100px;height:100px;
}
.two {
	/*继承的样式*/
	@extend .one;
	@extend .three;
	/*独立的样式*/
	background:red;
	border:5px solid #000;
}
.three {
	padding:10px;
}


  编译后的CSS代码

.one, .two {
  width: 100px;
  height: 100px;
}

.two {
  background: red;
  border: 5px solid #000;
}

.three, .two {
  padding: 10px;
}


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

  SCSS代码

.one {
	width:100px;height:100px;
}
.two {
	/*继承的样式*/
	@extend .one, .three;
	/*独立的样式*/
	background:red;
	border:5px solid #000;
}
.three {
	padding:10px;
}


  编译后的CSS代码

.one, .two {
  width: 100px;
  height: 100px;
}

.two {
  /*独立的样式*/
  background: red;
  border: 5px solid #000;
}

.three, .two {
  padding: 10px;
}


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

 链型继承

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

  SCSS代码

.one {
	width:100px;height:100px;
}
.two {
	/*继承的样式*/
	@extend .one;
	/*独立的样式*/
	background:red;
	border:5px solid #000;
}
.three {
	/*继承的样式*/
	@extend .two;
	/*独立的样式*/
	padding:10px;
}


  编译后的CSS代码

.one, .two, .three {
  /*继承的样式*/
  width: 100px;
  height: 100px;
}

.two, .three {
  /*独立的样式*/
  background: red;
  border: 5px solid #000;
}

.three {
  /*独立的样式*/
  padding: 10px;
}


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

 继承的局限性

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

  SCSS代码

.myLink {
  @extend a;
}
a {
  color: blue;
  &:hover {
    text-decoration: underline;
  }
}


  编译后的CSS代码

a, .myLink {
  color: blue;
}
a:hover, .myLink:hover {
  text-decoration: underline;
}


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

 继承交叉合并选择

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

  SCSS代码

.meng a {
	font-weight:bold;
}

.long .link {
	@extend a;
}


  编译后的CSS代码

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


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

 继承带%的东西

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

  SCSS代码

#meng a%long {
  color: blue;
  font-weight: bold;
  font-size: 2em;
}

.notice {
  @extend %long;
}


  编译后的CSS代码

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


 继承在指令中的作用域

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

  SCSS代码

.one {
	height:300px;
}
@media print {
  .two {
	@extend .one;
	width:300px;
  }
}


  编译后的CSS代码

.one {
  height: 300px;
}

@media print {
  .two {
    width: 300px;
  }
}


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

  SCSS代码

@media print {
	.one {
		height:300px;
	}
	.two {
		@extend .one;
		width:300px;
	}
}


  编译后的CSS代码

@media print {
  .one, .two {
    height: 300px;
  }

  .two {
    width: 300px;
  }
}

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

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

时间: 2024-10-11 05:13:58

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

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

1.认识jQuery extend()和jQuery.fn.extend() jQuery的API手册中,extend方法挂载在jQuery和jQuery.fn两个不同对象上方法,但在jQuery内部代码实现的是相同的,只是功能却不太一样: 且看官方给出解释: jQuery.extend(): Merge the contents of two or more objects together into the first object.(把两个或者更多的对象合并到第一个当中): jQuery.

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

目录 1 . jquery extend的基本使用 通过285行的源码 jQuery.extend = jQuery.fn.extend = function() { ,extend方法要么是直接挂在到jQuery的静态方法,要么是挂载到fn上其实就是原型上(参考283行的赋值操作)的实例方法.extend方法可以传一个对象,类似于插件的方式,也可以传多个对象进行拷贝. <script src="js/jquery-2.0.3.js"></script> <

jQuery.extend()、jQuery.fn.extend()扩展方法详解

jQuery自定义了jQuery.extend()和jQuery.fn.extend()方法.其中jQuery.extend()方法能够创建全局函数或者选择器,而jQuery.fn.extend()方法能够创建jQuery对象方法. 例如: jQuery.extend({ showName : function(name){ alert(name) } }); jQuery.showName("深蓝"); jQuery.extend()除了可以创建插件外,还可以用来扩展jQuery对象

jQuery extend函数详解

一 jQuery的扩展方法原型是 $.extend(dest,src1,src2,src3); 含义是将src1,src2,src3合并到dest中,返回值为合并后的dest,该方法合并后,dest的结构被修改. <script> var dest = {'type':'person'} var src1 = {'name':'lisi','age':12} var src2 = {'sex':'male'} var src3 = {'class':'class 1'} var result

jQuery插件开发及jQuery.extend函数详解和jQuery.fn与jQuery.prototype区别

一.jQuery插件开发分为两种:  1.类级别: 类级别你可以理解为拓展jquery类,最明显的例子是$.ajax(...),相当于静态方法. 开发扩展其方法时使用$.extend方法,即jQuery.extend(object); $.extend({ add:function(a,b){return a+b;} , minus:function(a,b){return a-b;} }); var i = $.add(3,2); var j = $.minus(3,2); 2.对象级别: 对

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

混合宏-声明混合宏如果你的整个网站中有几处小样式类似,比如颜色,字体等,在 Sass 可以使用变量来统一处理,那么这种选择还是不错的.但当你的样式变得越来越复杂,需要重复使用大段的样式时,使用变量就无法达到我们目了.这个时候 Sass 中的混合宏就会变得非常有意义.1.声明混合宏不带参数混合宏:在 Sass 中,使用"@mixin"来声明一个混合宏.如: 1 @mixin border-radius{ 2 -webkit-border-radius: 5px; 3 border-rad

Nuxt.js学习(二) --- Nuxt目录结构详解、Nuxt常用配置项、Nuxt路由配置和参数传递

[TOC] 1.Nuxt目录结构详解 Nuxt项目文件目录结构 |-- .nuxt // Nuxt自动生成,临时的用于编辑的文件,build |-- assets // 用于组织未编译的静态资源入LESS.SASS 或 JavaScript |-- components // 用于自己编写的Vue组件,比如滚动组件,日历组件,分页组件 |-- layouts // 布局目录,用于组织应用的布局组件,不可更改. |-- middleware // 用于存放中间件 |-- pages // 用于存放

学习ASP .NET MVC5官方教程总结(七)Edit方法和Edit视图详解

学习ASP .NET MVC5官方教程总结(七)Edit方法和Edit视图详解 在本章中,我们研究生成的Edit方法和视图.但在研究之前,我们先将 release date 弄得好看一点.打开Models\Movie.cs 文件.先添加一个引用: <span style="font-size:14px;">using System.ComponentModel.DataAnnotations;</span> 然后在Movie类中添加以下代码: [Display(

(转)Linux下PS命令详解

(转)Linux下PS命令详解 整理自:http://blog.chinaunix.net/space.php?uid=20564848&do=blog&id=74654 要对系统中进程进行监测控制,查看状态,内存,CPU的使用情况,使用命令:/bin/ps (1) ps :是显示瞬间进程的状态,并不动态连续: (2) top:如果想对进程运行时间监控,应该用 top 命令: (3) kill 用于杀死进程或者给进程发送信号: (4) 查看文章最后的man手册,可以查看ps的每项输出的含义