sass-site/source/documentation/snippets/_number-units.erb

148 lines
5.1 KiB
Plaintext
Raw Normal View History

2018-09-01 22:35:20 +02:00
## Units
Sass has powerful support for manipulating units based on how
[real-world unit calculations][] work. When two numbers are multiplied, their
units are multiplied as well. When one number is divided by another, the result
takes its numerator units from the first number and its denominator units from
the second. A number can have any number of units in the numerator and/or
denominator.
[real-world unit calculations]: https://en.wikipedia.org/wiki/Unit_of_measurement#Calculations_with_units_of_measurement
<% example(autogen_css: false) do %>
@debug 4px * 6px; // 24px*px (read "square pixels")
@debug 5px / 2s; // 2.5px/s (read "pixels per second")
@debug 5px * 30deg / 2s / 24em; // 3.125px*deg/s*em
// (read "pixel-degrees per second-em")
$degrees-per-second: 20deg/1s;
@debug $degrees-per-second; // 20deg/s
@debug 1 / $degrees-per-second; // 0.05s/deg
===
@debug 4px * 6px // 24px*px (read "square pixels")
@debug 5px / 2s // 2.5px/s (read "pixels per second")
@debug 5px * 30deg / 2s / 24em // 3.125px*deg/s*em
// (read "pixel-degrees per second-em")
$degrees-per-second: 20deg/1s
@debug $degrees-per-second // 20deg/s
@debug 1 / $degrees-per-second // 0.05s/deg
2018-09-01 22:35:20 +02:00
<% end %>
<% heads_up do %>
2019-03-05 03:07:45 +01:00
Because CSS doesn't support complex units like square pixels, using a number
with complex units as a [property value][] will produce an error. This is a
feature in disguise, though; if you aren't ending up with the right unit, it
usually means that something's wrong with your calculations! And remember, you
can always use the [`@debug` rule][] to check out the units of any variable or
[expression][].
[property value]: /documentation/style-rules/declarations
[`@debug` rule]: /documentation/at-rules/debug
[expression]: /documentation/syntax/structure#expressions
2018-09-01 22:35:20 +02:00
<% end %>
Sass will automatically convert between compatible units, although which unit it
will choose for the result depends on which implementation of Sass you're
using.If you try to combine incompatible units, like `1in + 1em`, Sass will
throw an error.
<% example(autogen_css: false) do %>
// CSS defines one inch as 96 pixels.
@debug 1in + 6px; // 102px or 1.0625in
@debug 1in + 1s;
// ^^^^^^^^
// Error: Incompatible units s and in.
===
// CSS defines one inch as 96 pixels.
@debug 1in + 6px // 102px or 1.0625in
@debug 1in + 1s
// ^^^^^^^^
// Error: Incompatible units s and in.
2018-09-01 22:35:20 +02:00
<% end %>
As in real-world unit calculations, if the numerator contains units that are
compatible with units in the denominator (like `96px / 1in`), they'll cancel
out. This makes it easy to define a ratio that you can use for converting
between units. In the example below, we set the desired speed to one second per
50 pixels, and then multiply that by the number of pixels the transition covers
to get the time it should take.
<%# TODO(nweiz): auto-generate this CSS once we're compiling with Dart Sass %>
<% example do %>
$transition-speed: 1s/50px;
2018-09-01 22:35:20 +02:00
@mixin move($left-start, $left-stop) {
position: absolute;
left: $left-start;
transition: left ($left-stop - $left-start) * $transition-speed;
2018-09-01 22:35:20 +02:00
&:hover {
left: $left-stop;
}
}
.slider {
@include move(10px, 120px);
}
===
$transition-speed: 1s/50px
@mixin move($left-start, $left-stop)
position: absolute
left: $left-start
transition: left ($left-stop - $left-start) * $transition-speed
&:hover
left: $left-stop
.slider
@include move(10px, 120px)
===
.slider {
position: absolute;
left: 10px;
transition: left 2.2s;
}
.slider:hover {
left: 120px;
2018-09-01 22:35:20 +02:00
}
<% end %>
<% heads_up do %>
If your arithmetic gives you the wrong unit, you probably need to check your
math. You may be leaving off units for a quantity that should have them!
Staying unit-clean allows Sass to give you helpful errors when something isn't
right.
You should especially avoid using interpolation like `#{$number}px`. This
doesn't actually create a number! It creates an [unquoted string][] that
*looks* like a number, but won't work with any [number operations][] or
[functions][]. Try to make your math unit-clean so that `$number` already has
the unit `px`, or write `$number * 1px`.
[unquoted string]: /documentation/values/strings#unquoted
[number operations]: /documentation/operators/numeric
[functions]: /documentation/functions/math
2018-09-01 22:35:20 +02:00
<% end %>
<% heads_up do %>
Percentages in Sass work just like every other unit. They are *not*
interchangeable with decimals, because in CSS decimals and percentages mean
different things. For example, `50%` is a number with `%` as its unit, and
Sass considers it different than the number `0.5`.
You can convert between decimals and percentages using unit arithmetic.
`$percentage / 100%` will return the corresponding decimal, and `$decimal *
100%` will return the corresponding percentage. You can also use the
[`percentage()` function][] as a more explicit way of writing `$decimal *
100%`.
[`percentage()` function]: /documentation/functions/math#percentage
2018-09-01 22:35:20 +02:00
<% end %>