В інформатиці ми використовуємо слово затискач як спосіб обмежити число між двома іншими числами. При затисканні число або зберігатиме власне значення, якщо живе в діапазоні, накладеному двома іншими значеннями, приймає нижче значення, якщо спочатку нижче за нього, або вище значення, якщо спочатку вище за нього.
Як швидкий приклад перед подальшим кроком:
$clamp: clamp(42, $min: 0, $max: 1337); // 42 $clamp: clamp(42, $min: 1337, $max: 9000); // 1337 $clamp: clamp(42, $min: 0, $max: 1); // 1
Повертаючись до CSS. Є кілька способів, коли вам може знадобитися обмеження номера між двома іншими. Візьмемо, наприклад, opacity
властивість: воно має бути плаваючим (між 0 і 1). Зазвичай це тип величини, який ви хочете затиснути, щоб переконатися, що він не є ні від’ємним, ні вищим за 1.
Реалізація затискної функції в Sass може бути виконана двома способами, обидва строго еквівалентні, але один набагато витонченіший за інший. Почнемо з не дуже великого.
Брудний
Ця версія покладається на if
виклики вкладених функцій. В основному ми говоримо: якщо $number
нижче ніж $min
, то тримай $min
, інакше якщо $number
вище $max
, то тримай $max
, ще тримай $number
.
/// Clamp `$number` between `$min` and `$max` /// @param (Number) $number - Number to clamp /// @param (Number) $min - Minimum value /// @param (Number) $max - Maximum value /// @return (Number) @function clamp($number, $min, $max) ( @return if($number $max, $max, $number)); )
Якщо ви не дуже впевнені у вкладених викликах if, подумайте про попереднє твердження як про:
@if $number $max ( @return $max; ) @return $number;
Чистий
Ця версія набагато елегантніша, оскільки добре використовує обидва функції min
та max
функції Sass.
/// Clamp `$number` between `$min` and `$max` /// @param (Number) $number - Number to clamp /// @param (Number) $min - Minimum value /// @param (Number) $max - Maximum value /// @return (Number) @function clamp($number, $min, $max) ( @return min(max($number, $min), $max); )
Буквально означає мінімум між $max
і максимум між $number
і $min
.
Приклад
Тепер давайте створимо трохи мікшину непрозорості лише для демонстрації:
/// Opacity mixin /// @param (Float) $value - Opacity value /// @output `opacity` @mixin opacity($value) ( $clamped-value: clamp($value, 0, 1); @if $value != $clamped-value ( @warn "Mixin `opacity` needs a float; #($value) given, clamped to #($clamped-value)."; ) opacity: $clamped-value; )