SASS @etend官方文档剖析

@extend用法剖析

我们经常会遇到这样的情况,当我们在开发页面时候一个class需要包含前一个class的所有样式,但是又必须有他自己特殊新增的样式。但是这两个class其实都是相差无几的,只是有细微的差别。比如错误提示的样式(.error和.specialerror),既然后着只是比前者多一两句样式,为何还要写两个class呢,因为我们不想把前者.error的样式重新在写一遍,无聊极了。但是这样带来一个问题,就是html标签上会多出好几个class。

为了解决这个问题,sass里提供了@extend的解决方法
先看一个例子:

  Oh no! You've been hacked!

我们的css如下

.error {  border: 1px # f00;  background-color: # fdd;}.specialerror {  border-width: 3px;}

这里就出现我们刚说的问题了,其实我们心里是十万个不愿意就这么在后面唐突的加个specialerror的,因为如果只写specialerror,就丢失了前面的样式(为什么呢,因为我们没有在specialerror里复写error的样式,只是新增了)

通过Sass的@extend,一个选择器将继承另一个选择器的样式
例如:

.error {  border: 1px # f00;  background-color: # fdd;}.specialerror {  @extend .error;  border-width: 3px;}

被编译为:

.error, .specialerror {  border: 1px # f00;  background-color: # fdd;}.specialerror {  border-width: 3px;}

意味着.error所有的样式都会加到.specialerror上,这样.specialerror就会有.error的样式了。这样我们就可以只写.specialerror了。目前就先这样理解,其实这个@extend实现的方式是跟我们现实逻辑颠倒的。

但是如果改成这样:

 .error {      border: 1px # f00;      background-color: # fdd;    }    .specialerror {      @extend .error;      border-width: 3px;    }    .error.intrusion {      background-image: url("/image/hacked.png");    }

加上面这段样式后 就会加上和一样的背景

怎么做到的呢

.error {      border: 1px # f00;      background-color: # fdd;    }.error.intrusion {  background-image: url("/image/hacked.png");}.specialerror {  @extend .error;  border-width: 3px;}

被编译为:

.error, .specialerror {  border: 1px # f00;  background-color: # fdd; }.error.intrusion, .specialerror.intrusion {  background-image: url("/image/hacked.png"); }.specialerror {  border-width: 3px; }

这里需要重点讲解下,其实我们正常理解增加扩充添加就是copy然后paste,是的,这样思考其实也是对的,就像文章一开始那个最简单的例子。但是为了避免不必要的重复。@extend的逻辑稍稍不同。你可以这样认为,使用@extend时候sass会将.error相关样式先拷贝一份,

 .specialerror {      @extend .error;      border-width: 3px;    }

然后把字符“specialerror”存储在@extend里,遇到”error“字符就进行替换,这样.specialerror就有了.error的样式啦!这也就能解释,为什么会出现下面.specialerror.intrusion的原因了。

  .error.intrusion, .specialerror.intrusion {      background-image: url("/image/hacked.png"); }

当组合选择器的样式时, @extend 能够很聪明得避免不必要的重复,例如.seriousError.seriousError会被转换成.seriousError。不会生成类似# main# footer的不可用选择器。

求证例子:

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

被编译为:

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

就像上面的.error.intrusion ,任何使用 a:hover 都会替换为 .hoverlink,即使中间包含其他选择器。例如:

.hoverlink {  @extend a:hover;}.comment a.user:hover {  font-weight: bold;}

被编译为:

.comment a.user:hover, .comment .user.hoverlink {  font-weight: bold; }

Multiple Extends

一个选择器还可以扩充多个选择器的样式例如:

.error {  border: 1px # f00;  background-color: # fdd;}.attention {  font-size: 3em;  background-color: # ff0;}.seriousError {  @extend .error;  @extend .attention;  border-width: 3px;}

被编译为:

.error, .seriousError {  border: 1px # f00;  background-color: # fdd; }.attention, .seriousError {  font-size: 3em;  background-color: # ff0; }.seriousError {  border-width: 3px; }

对于下面这种只需注意下就行,就是.criticalError内 “@extend .seriousError”这句话。在运行这句语句时候,sass会检测到.seriousError内有“@extend .error”。
所以.criticalError既有.error的样式也有.seriousError的样式,故criticalError需要替换的是error和seriousError。

.error {  border: 1px # f00;  background-color: # fdd;}.seriousError {  @extend .error;  border-width: 3px;}.criticalError {  @extend .seriousError;  position: fixed;  top: 10%;  bottom: 10%;  left: 10%;  right: 10%;}

被编译为:

.error, .seriousError, .criticalError {  border: 1px # f00;  background-color: # fdd; }.seriousError, .criticalError {  border-width: 3px; }.criticalError {  position: fixed;  top: 10%;  bottom: 10%;  left: 10%;  right: 10%; }

选择器序列
例如.foo .bar或者 .foo + .bar, 目前还不能扩展. 但是对于嵌套的选择器还是可以使用@extend添加到其他选择器的 例如:

# fake-links .link {  @extend a;}a {  color: blue;  &:hover {    text-decoration: underline;  }}

编译为:

a, # fake-links .link {  color: blue; }  a:hover, # fake-links .link:hover {    text-decoration: underline; }

当两个没有共同点的序列扩充组合时候, 将会产生两个不同的选择器: 一种是第一个序列在前,另一种是第二个序列在前例如: # admin .tabbar会和# demo .overview调换位置。

# admin .tabbar a {  font-weight: bold;}# demo .overview .fakelink {  @extend a;}

被编译为:

# admin .tabbar a,# admin .tabbar # demo .overview .fakelink,# demo .overview # admin .tabbar .fakelink {  font-weight: bold; }

如果另个序列有一些共同的选择器,这些选择器将会被组合在一起而且只有不同的将会保留下来。下面这个例子中, 每个写都包含id # admin, 所以产生的选择器就会合并这两个# admin。# admin .tabbar和 # admin .overview会调换位置,换完之后在省略重复的。

  # admin .tabbar a {      font-weight: bold;    }    # admin .overview .fakelink {      @extend a;    }

这被编译为:

 # admin .tabbar a,    # admin .tabbar .overview .fakelink,    # admin .overview .tabbar .fakelink {      font-weight: bold; }

关键字:sass, css

版权声明

本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处。如若内容有涉嫌抄袭侵权/违法违规/事实不符,请点击 举报 进行投诉反馈!

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部