sass-site/source/documentation/syntax/special-functions.liquid

152 lines
5.1 KiB
Plaintext
Raw Normal View History

2023-05-07 18:58:40 +02:00
---
title: Special Functions
introduction: >
CSS defines many functions, and most of them work just fine with Sasss normal
function syntax. Theyre parsed as function calls, resolved to [plain CSS
functions](/documentation/at-rules/function#plain-css-functions), and compiled as-is to
2023-05-07 18:58:40 +02:00
CSS. There are a few exceptions, though, which have special syntax that cant
just be parsed as a [SassScript expression](/documentation/syntax/structure#expressions). All
special function calls return [unquoted strings](/documentation/values/strings#unquoted).
2023-05-07 18:58:40 +02:00
table_of_contents: true
---
2023-05-23 18:24:23 +02:00
2023-05-07 18:58:40 +02:00
{% markdown %}
## `url()`
The [`url()` function][] is commonly used in CSS, but its syntax is different
than other functions: it can take either a quoted _or_ unquoted URL. Because an
unquoted URL isn't a valid SassScript expression, Sass needs special logic to
parse it.
[`url()` function]: https://developer.mozilla.org/en-US/docs/Web/CSS/url
If the `url()`'s argument is a valid unquoted URL, Sass parses it as-is,
although [interpolation][] may also be used to inject SassScript values. If it's
not a valid unquoted URL—for example, if it contains [variables][] or [function
calls][]—it's parsed as a normal [plain CSS function call][].
[interpolation]: /documentation/interpolation
[variables]: /documentation/variables
[function calls]: /documentation/at-rules/function
[plain CSS function call]: /documentation/at-rules/function#plain-css-functions
2023-05-07 18:58:40 +02:00
{% endmarkdown %}
{% codeExample 'url' %}
$roboto-font-path: "../fonts/roboto";
@font-face {
2023-05-23 14:25:18 +02:00
// This is parsed as a normal function call that takes a quoted string.
src: url("#{$roboto-font-path}/Roboto-Thin.woff2") format("woff2");
2023-05-07 18:58:40 +02:00
2023-05-23 14:25:18 +02:00
font-family: "Roboto";
font-weight: 100;
2023-05-07 18:58:40 +02:00
}
@font-face {
2023-05-23 14:25:18 +02:00
// This is parsed as a normal function call that takes an arithmetic
// expression.
src: url($roboto-font-path + "/Roboto-Light.woff2") format("woff2");
2023-05-07 18:58:40 +02:00
2023-05-23 14:25:18 +02:00
font-family: "Roboto";
font-weight: 300;
2023-05-07 18:58:40 +02:00
}
@font-face {
2023-05-23 14:25:18 +02:00
// This is parsed as an interpolated special function.
src: url(#{$roboto-font-path}/Roboto-Regular.woff2) format("woff2");
2023-05-07 18:58:40 +02:00
2023-05-23 14:25:18 +02:00
font-family: "Roboto";
font-weight: 400;
}
2023-05-07 18:58:40 +02:00
===
$roboto-font-path: "../fonts/roboto"
@font-face
2023-05-23 14:25:18 +02:00
// This is parsed as a normal function call that takes a quoted string.
src: url("#{$roboto-font-path}/Roboto-Thin.woff2") format("woff2")
2023-05-07 18:58:40 +02:00
2023-05-23 14:25:18 +02:00
font-family: "Roboto"
font-weight: 100
2023-05-07 18:58:40 +02:00
@font-face
2023-05-23 14:25:18 +02:00
// This is parsed as a normal function call that takes an arithmetic
// expression.
src: url($roboto-font-path + "/Roboto-Light.woff2") format("woff2")
2023-05-07 18:58:40 +02:00
2023-05-23 14:25:18 +02:00
font-family: "Roboto"
font-weight: 300
2023-05-07 18:58:40 +02:00
@font-face
2023-05-23 14:25:18 +02:00
// This is parsed as an interpolated special function.
src: url(#{$roboto-font-path}/Roboto-Regular.woff2) format("woff2")
2023-05-07 18:58:40 +02:00
2023-05-23 14:25:18 +02:00
font-family: "Roboto"
font-weight: 400
2023-05-07 18:58:40 +02:00
{% endcodeExample %}
2023-05-23 18:24:23 +02:00
{{ '## `element()`, `progid:...()`, and `expression()`' | markdown }}
2023-05-07 18:58:40 +02:00
2023-05-24 19:11:47 +02:00
{% # Arguments are (in order): `dart`, `libsass`, `node`, `ruby`, optional feature name, additional details within %}
{% compatibility "<1.40.0", false, null, false, "calc()" %}
2023-05-07 18:58:40 +02:00
LibSass, Ruby Sass, and versions of Dart Sass prior to 1.40.0 parse `calc()` as special syntactic function like `element()`.
Dart Sass versions 1.40.0 and later parse `calc()` as a [calculation].
[calculation]: /documentation/values/calculations
2023-05-07 18:58:40 +02:00
{% endcompatibility %}
2023-05-24 19:11:47 +02:00
{% # Arguments are (in order): `dart`, `libsass`, `node`, `ruby`, optional feature name, additional details within %}
{% compatibility ">=1.31.0 <1.40.0", false, null, false, "clamp()" %}
2023-05-07 18:58:40 +02:00
LibSass, Ruby Sass, and versions of Dart Sass prior to 1.31.0 parse `clamp()`
as a [plain CSS function] rather than supporting special syntax within it.
[plain CSS function]: /documentation/at-rules/function#plain-css-functions
2023-05-07 18:58:40 +02:00
Dart Sass versions between 1.31.0 and 1.40.0 parse `clamp()` as special
syntactic function like `element()`.
Dart Sass versions 1.40.0 and later parse `clamp()` as a [calculation].
[calculation]: /documentation/values/calculations
2023-05-07 18:58:40 +02:00
{% endcompatibility %}
2023-05-23 18:24:23 +02:00
{% markdown %}
2023-05-07 18:58:40 +02:00
The [`element()`] function is defined in the CSS spec, and because its IDs couldbe parsed as colors, they need special parsing.
[`element()`]: https://developer.mozilla.org/en-US/docs/Web/CSS/element
[`expression()`][] and functions beginning with [`progid:`][] are legacy
Internet Explorer features that use non-standard syntax. Although they're no
longer supported by recent browsers, Sass continues to parse them for backwards
compatibility.
[`expression()`]: https://blogs.msdn.microsoft.com/ie/2008/10/16/ending-expressions/
[`progid:`]: https://blogs.msdn.microsoft.com/ie/2009/02/19/the-css-corner-using-filters-in-ie8/
Sass allows _any text_ in these function calls, including nested parentheses.
Nothing is interpreted as a SassScript expression, with the exception that
[interpolation][] can be used to inject dynamic values.
2023-05-23 14:25:18 +02:00
[interpolation]: /documentation/interpolation
2023-05-23 14:25:18 +02:00
2023-05-07 18:58:40 +02:00
{% endmarkdown %}
{% codeExample 'element' %}
$logo-element: logo-bg;
.logo {
background: element(##{$logo-element});
}
===
$logo-element: logo-bg
.logo
background: element(##{$logo-element})
===
.logo {
background: element(#logo-bg);
}
{% endcodeExample %}