@function

関数は、スタイルシート全体で再利用できるSassScript値に対する複雑な操作を定義できます。これにより、共通の式と動作を分かりやすく抽象化することができます。

関数は、@function <name>(<arguments...>) { ... }と書かれた@function atルールを使用して定義されます。関数の名前は、--で始まらない任意のSass識別子にすることができます。ユニバーサルステートメントと、関数の呼び出しの結果として使用する値を示す@return atルールのみを含めることができます。関数は、通常のCSS関数構文を使用して呼び出されます。

プレイグラウンド

SCSS構文

@function fibonacci($n) {
  $sequence: 0 1;
  @for $_ from 1 through $n {
    $new: nth($sequence, length($sequence)) + nth($sequence, length($sequence) - 1);
    $sequence: append($sequence, $new);
  }
  @return nth($sequence, length($sequence));
}

.sidebar {
  float: left;
  margin-left: fibonacci(4) * 1px;
}
プレイグラウンド

Sass構文

@function fibonacci($n)
  $sequence: 0 1
  @for $_ from 1 through $n
    $new: nth($sequence, length($sequence)) + nth($sequence, length($sequence) - 1)
    $sequence: append($sequence, $new)
  @return nth($sequence, length($sequence))

.sidebar
  float: left
  margin-left: fibonacci(4) * 1px



CSS出力

.sidebar {
  float: left;
  margin-left: 5px;
}









💡豆知識

関数名は、他のSass識別子と同様に、ハイフンとアンダースコアを同一視します。つまり、scale-colorscale_colorは同じ関数を指します。これは、Sassが識別子名にアンダースコアのみを許可していた初期の頃から残っているものです。SassがCSSの構文に合わせるためにハイフンのサポートを追加すると、移行を容易にするために両方が同等になりました。

⚠️ご注意ください!

技術的には、グローバル変数の設定などの副作用を持つ関数を定義することは可能ですが、これは強く推奨されません。副作用にはミックスインを使用し、関数は値の計算のみに使用してください。

引数引数パーマリンク

引数を使用すると、関数が呼び出されるたびに動作をカスタマイズできます。引数は、関数の名前の後に@functionルールで、括弧で囲まれた変数名のリストとして指定されます。関数は、SassScript式の形式で同じ数の引数を使用して呼び出す必要があります。これらの式の値は、関数本体内で対応する変数として使用できます。

💡豆知識

引数リストには、末尾にカンマを含めることもできます!これにより、スタイルシートのリファクタリング時の構文エラーを回避しやすくなります。

オプション引数オプション引数パーマリンク

通常、関数が宣言するすべての引数は、その関数が含まれるときに渡す必要があります。ただし、引数が渡されない場合に使用されるデフォルト値を定義することで、引数をオプションにすることができます。デフォルト値は、変数宣言と同じ構文を使用します。変数名、コロン、SassScript式です。これにより、シンプルまたは複雑な方法で使用できる柔軟な関数APIを簡単に定義できます。

プレイグラウンド

SCSS構文

@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%);
}
プレイグラウンド

Sass構文

@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%)

CSS出力

.header {
  background-color: rgb(81.6, 51, 20.4);
}






💡豆知識

デフォルト値は任意のSassScript式にすることができ、以前の引数を参照することもできます!

キーワード引数キーワード引数パーマリンク

関数が呼び出されると、引数は引数リストの位置で渡すだけでなく、名前で渡すこともできます。これは、複数のオプション引数を持つ関数、または名前がないと意味が不明なブール値引数を持つ関数に特に役立ちます。キーワード引数は、変数宣言およびオプション引数と同じ構文を使用します。

プレイグラウンド

SCSS構文

$primary-color: #036;
.banner {
  background-color: $primary-color;
  color: scale-color($primary-color, $lightness: +40%);
}
プレイグラウンド

Sass構文

$primary-color: #036
.banner
  background-color: $primary-color
  color: scale-color($primary-color, $lightness: +40%)

CSS出力

.banner {
  background-color: #036;
  color: rgb(10.2, 132.6, 255);
}

⚠️ご注意ください!

任意の引数を名前で渡すことができるため、関数の引数を名前変更する際には注意が必要です…ユーザーのコードが壊れる可能性があります!しばらくの間、古い名前をオプション引数として残しておき、誰かが渡した場合に警告を出力すると、新しい引数に移行する必要があることが分かります。

任意の引数の取得任意の引数の取得パーマリンク

関数が任意の数の引数を取ることができるようにすることが役立つ場合があります。@function宣言の最後の引数が...で終わる場合、その関数への追加の引数はすべて、リストとしてその引数に渡されます。この引数は、引数リストとして知られています。

プレイグラウンド

SCSS構文

@function sum($numbers...) {
  $sum: 0;
  @each $number in $numbers {
    $sum: $sum + $number;
  }
  @return $sum;
}

.micro {
  width: sum(50px, 30px, 100px);
}
プレイグラウンド

Sass構文

@function sum($numbers...)
  $sum: 0
  @each $number in $numbers
    $sum: $sum + $number

  @return $sum


.micro
  width: sum(50px, 30px, 100px)

CSS出力

.micro {
  width: 180px;
}








任意のキーワード引数の取得任意のキーワード引数の取得パーマリンク

引数リストを使用して、任意のキーワード引数を取ることができます。meta.keywords()関数は、引数リストを取得し、関数に渡された追加のキーワードを、引数名($を除く)からその引数の値へのマップとして返します。

💡豆知識

meta.keywords()関数に引数リストを渡さない場合、その引数リストは追加のキーワード引数を許可しません。これにより、関数呼び出し元は、引数名を誤って入力していないことを確認できます。

任意の引数の渡し任意の引数の渡しパーマリンク

引数リストにより、関数が任意の位置引数またはキーワード引数を取ることができるようにするのと同じ構文を使用して、位置引数とキーワード引数を関数に渡すことができます。関数呼び出しの最後の引数としてリストに続いて...を渡すと、その要素は追加の位置引数として扱われます。同様に、マップに続いて...を渡すと、追加のキーワード引数として扱われます。両方同時に渡すこともできます!

プレイグラウンド

SCSS構文

$widths: 50px, 30px, 100px;
.micro {
  width: min($widths...);
}
プレイグラウンド

Sass構文

$widths: 50px, 30px, 100px
.micro
  width: min($widths...)

CSS出力

.micro {
  width: 30px;
}

💡豆知識

引数リストは位置引数とキーワード引数の両方を追跡するため、これを使用して両方同時に別の関数に渡します。これにより、関数のエイリアスを簡単に定義できます!

プレイグラウンド

SCSS構文

@function fg($args...) {
  @warn "The fg() function is deprecated. Call foreground() instead.";
  @return foreground($args...);
}
プレイグラウンド

Sass構文

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

@return@returnパーマリンク

@return atルールは、関数を呼び出した結果として使用する値を示します。これは@function本体内でのみ許可され、各@function@returnで終わる必要があります。

@returnが検出されると、関数はすぐに終了し、その結果を返します。早期の返却は、エッジケースや、関数を@elseブロックでラップせずに、より効率的なアルゴリズムを使用できる場合に役立ちます。

プレイグラウンド

SCSS構文

@use "sass:string";

@function str-insert($string, $insert, $index) {
  // Avoid making new strings if we don't need to.
  @if string.length($string) == 0 {
    @return $insert;
  }

  $before: string.slice($string, 0, $index);
  $after: string.slice($string, $index);
  @return $before + $insert + $after;
}
プレイグラウンド

Sass構文

@use "sass:string"

@function str-insert($string, $insert, $index)
  // Avoid making new strings if we don't need to.
  @if string.length($string) == 0
    @return $insert


  $before: string.slice($string, 0, $index)
  $after: string.slice($string, $index)
  @return $before + $insert + $after

その他の関数その他の関数パーマリンク

ユーザー定義関数に加えて、Sassは常に使用できるコアライブラリのビルトイン関数を多数提供しています。Sassの実装では、ホスト言語でカスタム関数を定義することもできます。そしてもちろん、プレーンCSS関数奇妙な構文を持つ関数も含む)を常に呼び出すことができます。

プレーンCSS関数プレーンCSS関数パーマリンク

ユーザー定義関数またはビルトイン関数ではない関数呼び出しは、(Sass引数構文を使用しない限り)プレーンCSS関数にコンパイルされます。引数はCSSにコンパイルされ、関数呼び出しにそのまま含まれます。これにより、新しい関数が追加されるたびに新しいバージョンをリリースする必要なく、SassですべてのCSS関数をサポートできます。

プレイグラウンド

SCSS構文

@debug var(--main-bg-color); // var(--main-bg-color)

$primary: #f2ece4;
$accent: #e1d7d2;
@debug radial-gradient($primary, $accent); // radial-gradient(#f2ece4, #e1d7d2)
プレイグラウンド

Sass構文

@debug var(--main-bg-color)  // var(--main-bg-color)

$primary: #f2ece4
$accent: #e1d7d2
@debug radial-gradient($primary, $accent)  // radial-gradient(#f2ece4, #e1d7d2)

⚠️ご注意ください!

不明な関数はすべてCSSにコンパイルされるため、関数名をタイプミスしたときに気付かない場合があります。この問題が発生したときに通知を受けるために、スタイルシートの出力をCSSリンターで実行することを検討してください!

💡豆知識

calc()element()などの一部のCSS関数は、珍しい構文を持っています。Sassは、これらの関数を特別に解析して引用されていない文字列として扱います。