• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • @function

    函数允许您在 SassScript 值上定义复杂的操作,您可以在整个样式表中重用这些值。它们便于以可读的方式抽象出常见的公式和行为。

    函数是使用@function规则定义的,该规则编写为@function<name>(<arguments...>){...}。函数的名称可以是任何 Sass 标识符。它只能包含通用语句,以及@return规则,该规则指示要用作函数调用结果的值。使用常规 CSS 函数语法调用函数。

    scss 语法css 语法
    @function pow($base, $exponent) {
      $result: 1;
      @for $_ from 1 through $exponent {
        $result: $result * $base;
      }
      @return $result;
    }
    
    .sidebar {
      float: left;
      margin-left: pow(4, 3) * 1px;
    }
    
    .sidebar {
      float: left;
      margin-left: 64px;
    }
    
    与所有 Sass 标识符一样,函数名称将连字符和下划线视为相同。这意味着scale-colorscale_color都指的是相同的功能。这是 Sass 早期的历史遗留问题,当时它只允许在标识符名称中使用下划线。一旦 Sass 添加了对连字符的支持以匹配 CSS 的语法,这两者就等同于使迁移更容易。
    ⚠️注意!
    虽然从技术上讲,函数可能会产生诸如设置全局变量之类的副作用,但强烈建议不要这样做。使用 mixins 来产生副作用,并使用函数来计算值。


    参数

    参数,允许在每次调用函数时。自定义函数的行为。参数在@function函数名称之后的规则中,指定为用括号括起来的变量名称列表。该函数必须以 SassScript 表达式的形式。使用相同数量的参数调用。这些表达式的值,在函数体中作为相应的变量可用。

    参数列表也可以有尾随逗号!这使得重构样式表时更容易避免语法错误。

    可选参数

    通常,函数声明的每个参数都必须在包含该函数时传递。但是,您可以通过定义一个默认值来使参数成为可选参数,如果该参数未传递,则将使用该默认值。默认值使用与变量声明相同的语法:变量名,后跟一个冒号和一个 SassScript 表达式。这使得定义灵活的函数 API 变得容易,这些 API 可以以简单或复杂的方式使用。

    scss 语法css 语法
    @function invert($color, $amount: 100%) {
      $inverse: change-color($color, $hue: hue($color) + 180);
      @return mix($inverse, $color, $amount);
    }
    
    $primary-color: #036;
    .header {
      background-color: invert($primary-color, 80%);
    }
    
    .header {
      background-color: #523314;
    }
    


    关键字参数

    调用函数时,除了按参数列表中的位置传递参数外,还可以按名称传递参数。这对于具有多个可选参数的函数或带有布尔参数的函数特别有用,这些参数的含义在没有名称的情况下并不明显。关键字参数使用与变量声明和可选参数相同的语法。

    scss 语法css 语法
    $primary-color: #036;
    .banner {
      background-color: $primary-color;
      color: scale-color($primary-color, $lightness: +40%);
    }
    
    .banner {
      background-color: #036;
      color: #0a85ff;
    }
    
    ⚠️注意!
    因为任何参数都可以通过名称传递,所以在重命名函数的参数时要小心……它可能会破坏你的用户!将旧名称作为可选参数保留一段时间并在有人通过它时打印警告会很有帮助,因此他们知道要迁移到新参数。


    接收任意参数

    有时,函数能够接受任意数量的参数很有用。如果@function声明中的最后一个参数以结尾...,则该函数的所有额外参数都作为列表传递给该参数。此参数称为参数列表。

    scss 语法css 语法
    @function sum($numbers...) {
      $sum: 0;
      @each $number in $numbers {
        $sum: $sum + $number;
      }
      @return $sum;
    }
    
    .micro {
      width: sum(50px, 30px, 100px);
    }
    
    .micro {
      width: 180px;
    }
    


    接收任意关键字参数

    参数列表也可用于获取任意关键字参数。该meta.keywords()函数接受一个参数列表并返回任何额外的关键字,这些关键字作为从参数名称(不包括$)到这些参数值的映射传递给函数。

    如果您从未将参数列表传递给meta.keywords()函数,则该参数列表将不允许额外的关键字参数。这有助于您的函数的调用者确保他们没有意外拼错任何参数名称。


    传递任意参数

    就像参数列表允许函数接受任意位置或关键字参数一样,可以使用相同的语法将位置参数和关键字参数传递给函数。如果你传递一个列表...作为函数调用的最后一个参数,它的元素将被视为额外的位置参数。同样,后跟的映射...将被视为附加关键字参数。你甚至可以同时通过!

    scss 语法css 语法
    $widths: 50px, 30px, 100px;
    .micro {
      width: min($widths...);
    }
    
    .micro {
      width: 30px;
    }
    

    因为参数列表同时跟踪位置参数和关键字参数,所以您可以使用它同时将两者传递给另一个函数。这使得为​​函数定义别名变得非常容易!

    @function fg($args...) {
      @warn "The fg() function is deprecated. Call foreground() instead.";
      @return foreground($args...);
    }
    


    @return

    @retur规则指示用作调用函数结果的值。它只允许在@function正文中,并且每个都@function必须以@retur

    @retur遇到时,它立即结束函数并返回其结果。提前返回对于处理边缘情况,或在不将整个函数包装到@else块的情况下,可以使用更高效算法的情况非常有用。

    @use "sass:string";
    
    @function str-insert($string, $insert, $index) {
      // Avoid making new strings if we don't need to.
      @if string.length($string) == 0 {
        @retur $insert;
      }
    
      $before: string.slice($string, 0, $index);
      $after: string.slice($string, $index);
     @retur $before + $insert + $after;
    }
    


    其他功能

    除了用户定义的函数外,Sass 还提供了大量的内置函数核心库,这些函数始终可供使用。Sass 实现还可以在宿主语言中定义自定义函数。当然,您总是可以调用普通的CSS函数(即使是语法怪异的函数)。

    纯CSS 函数

    任何不是用户定义或内置函数的函数调用都被编译为纯 CSS 函数(除非它使用 Sass 参数语法)。参数将被编译为 CSS并按原样包含在函数调用中。这确保了 Sass 支持所有 CSS功能,而无需在每次添加新版本时发布新版本。

    @debug var(--main-bg-color); // var(--main-bg-color)
    
    $primary: #f2ece4;
    $accent: #e1d7d2;
    @debug radial-gradient($primary, $accent); // radial-gradient(#f2ece4, #e1d7d2)
    
    ⚠️注意!
    因为任何未知的函数都会被编译成 CSS,所以当你输入一个函数名时很容易漏掉。考虑在样式表的输出上运行 CSS linter ,以便在发生这种情况时得到通知!
    一些 CSS 函数,喜欢calc()并且element()有不寻常的语法。Sass 将这些函数专门解析为不带引号的字符串。

    上篇:@mixin 与 @include

    下篇:@extend