SASS详解@mixins/@include/@extend/@at-root

2023-05-14 17:29:33 浏览数 (2)

Sass 支持所有CSS3的 @规则,以及一些已知的其他特定的Sass "指令"。这些在 Sass 都有对应的效果,更多资料请查看 控制指令 (control directives) 。今天重点讲mixins/include/extend

  • @at-root限定输出在文档的根层级上,而不是被嵌套在其父选择器下。
  • @extend 继承另一选择器样式
  • @mixin 指令允许我们定义一个可以在整个样式表中重复使用的样式。
  • @include 指令可以将混入(mixin)引入到文档中。

@extend

当一个样式类(class)含有另一个类的所有样式,并且它自己的特定样式。我们使用@extend

代码语言:javascript复制
.error {
  border: 1px #f00;
  background-color: #fdd;
}
.seriousError {
  @extend .error;
  border-width: 3px;
}

编译为

代码语言:javascript复制
.error, .seriousError {
  border: 1px #f00;
  background-color: #fdd;
}

.seriousError {
  border-width: 3px;
}

@extend通过在样式表中出现被扩展选择器(例如.error)的地方插入扩展选择器(例如.seriousError)

混合(mixins)

混入(mixin)通过 @mixin 指令定义。在它后面跟混入的名称和任选的arguments(参数),以及混入的内容块。

Mixin有点像C语言的宏(macro),是可以重用的代码块。使用@mixin命令,定义一个代码块。

@mixin命令应用

使用@mixin命令,可以指定参数和缺省值。

代码语言:javascript复制
@mixin left($value: 10px) {
    float: left;
    margin-right: $value;
}

使用的时候,根据需要加入参数:

代码语言:javascript复制
div {
    @include left(20px);
  }

下面是一个mixin的实例,用来生成浏览器前缀。

代码语言:javascript复制
@mixin rounded($vert, $horz, $radius: 10px) {
    border-#{$vert}-#{$horz}-radius: $radius;
    -moz-border-radius-#{$vert}#{$horz}: $radius;
    -webkit-border-#{$vert}-#{$horz}-radius: $radius;
}
#navbar li { @include rounded(top, left); }
#footer { @include rounded(top, left, 5px); }

再来个复杂点的

scss换肤

  • 添加全局样式,动态改变主题
  • 通过scss 定义多套主题
  • 使用混合模式动态取值
代码语言:javascript复制
// 1.主题定义
$theme-default: (
  font-color: red,
  font-size: 14px,
  background: pink,
);

$theme-green: (
  font-color: green,
  font-size:18px,
  background: yellow,
);

$theme-blue: (
  font-color: blue,
  font-size:24px,
  background: #fff,
);

//  2.将定义好到主题添加到map中
$themes:(
  default:$theme-default,
  green:$theme-green,
  blue:$theme-blue,
);

// 4. 调用混合指令themify() ,定义规则,此处到规则会替换@content
@mixin mytheme{
  @include themify() {
    color: themed("font-color");
    font-size: themed("font-size");
    .test-theme {
      background: themed("background");
    }
  }
};

// 3.定义混合指令, 切换主题,并将主题中到所有规则添加到theme-map中
@mixin themify() {
  @each $theme-name, $map in $themes {
    // & 表示父级元素
    // !global 表示覆盖原来的
    .theme-#{$theme-name} & {
      $theme-map: () !global;
      // 循环合并键值对
      @each $key, $value in $map {
        $theme-map: map-merge($theme-map, ($key: $value)) !global;
      }
      // 表示包含 下面函数 themed()
      @content;
      $theme-map: null !global;
    }
  }
}

// 通过key获取map中到值
@function themed($key) {
  @return map-get($theme-map, $key);
}

这里需要熟悉 Sass Maps的语法

Sass Maps的语法

Maps代表一个键和值对集合,其中键用于查找值。

Sass的map使用一个括号,并用冒号将键值与值分隔开来,并且使用逗号将一对键值/值隔开。下面是一个有效的Sass的map:

代码语言:javascript复制
$map: ( 
    key1: value1, 
    key2: value2,
    nextKey: nextvalue,
    other-key: other-value 
);

键值不一定是字符串,他可以是任何类型。甚至是null,甚至是map。

  • map中的最后一对键值/值后面的逗号可以省略
  • 键值必须是唯一的
  • 键值/值可以是Sass的任何类型,包括列表和其他的Sass map

Maps的主要操作使用的是 SassScript 函数。map-get函数用于查找map中的值,map-merge函数用于添加值到map中的值, @each 指令可以用来为 map 中的每个键值对添加样式。map中键值对的顺序和map创建时始终相同。

  • map-get()方法来找出某个key的value
  • map-has-key()检测出某个key是否存在
  • map-merge()合并两个甚至更多个maps成一个
代码语言:javascript复制
$colors: (
  light: #ccc,
  dark: #000
);

$brand-colors: (
  main: red,
  alternative: blue
);
.element {
  //判断是否存在light颜色
  @if map-has-key($colors, light){
    color: map-get($colors, light);
  } @else {
    color: map-get($brand-colors, light);
    content: 'color Map has not this key.'
  }
}
// 合并maps
$merged: map-merge($colors, $brand-colors);
.element {
  content: map-get($merged, alternative);
}

这个只是用法说明

sass map的经典案例

代码语言:javascript复制
// _m-buttons.scss
$buttons: (
  error: (#d82d2d, #666),
  success: (#52bf4a, #fff),
  warning: (#c23435, #fff)
);

.m-button {
  display: inling-block;
  padding: .5em;
  background: #ccc;
  color: #666;

  @each $name, $colors in $buttons {
    $bgcolor: nth($colors, 1);
    $fontcolor: nth($colors, 2);

    &--#{$name} {
      background-color: $bgcolor;
      color: $fontcolor;
    }
  }
}

参考文章:

介绍Sass Maps:用法跟例子 https://aotu.io/notes/2015/12/09/an-introduction-to-sass-maps/index.html

使用Sass Maps https://www.w3cplus.com/preprocessor/using-sass-maps.html

新手也可以輕鬆玩轉 SASS - @mixin and @include https://5xruby.tw/posts/play-sass-mixin-and-include/

extend、mixin、function使用時機 https://icguanyu.github.io/scss/scss_2/

Sass (3.4.21) 中文文档 https://www.html.cn/doc/sass/#mixins

转载本站文章《SASS详解@mixins/@include/@extend/@at-root》, 请注明出处:https://www.zhoulujun.cn/html/webfront/style/sass/2020_0827_8550.html

0 人点赞