Функции

Подкаст CSS - 020: Функции

До сих пор в этом курсе вы познакомились с несколькими функциями CSS. В модуле сетки вы познакомились с minmax() и fit-content() , которые помогают вам изменять размер элементов. В модуле цвета вы познакомились с rgb() и hsl() , которые помогают вам определять цвета.

Как и многие другие языки программирования, CSS имеет множество встроенных функций , к которым вы можете получить доступ в любое время.

Каждая функция CSS имеет определенное назначение. В этом уроке вы получите общий обзор, который позволит вам лучше понять, где и как их использовать.

Что такое функция?

Функция — это именованный, самодостаточный фрагмент кода, который выполняет определенную задачу. Функция имеет имя, чтобы вы могли вызывать ее в своем коде и передавать данные в функцию. Это называется передачей аргументов.

Диаграмма функции, описанной выше

Многие функции CSS являются чистыми функциями , что означает, что если вы передаете им те же аргументы, они всегда будут возвращать вам тот же результат, независимо от того, что происходит в остальной части вашего кода. Эти функции часто будут пересчитываться по мере изменения значений в вашем CSS, подобно другим элементам в языке, таким как вычисляемые каскадные значения, такие как currentColor .

В CSS вы можете использовать только предоставленные функции, а не писать свои собственные, но функции могут быть вложены друг в друга в некоторых контекстах, что дает им большую гибкость. Мы рассмотрим это более подробно позже в этом модуле.

Функциональные селекторы

.post :is(h1, h2, h3) {
    line-height: 1.2;
}

Вы узнали о функциональных селекторах в модуле псевдоклассов , в котором подробно описаны такие функции, как :is() и :not() . Аргументы, передаваемые в эти функции, являются селекторами CSS, которые затем оцениваются. Если есть совпадение с элементами, к ним будет применена остальная часть правила CSS .

Пользовательские свойства и var()

:root {
    --base-color: #ff00ff;
}

.my-element {
    background: var(--base-color);
}

Пользовательское свойство — это переменная, которая позволяет вам токенизировать значения в вашем CSS-коде. Каскад также влияет на пользовательские свойства , что означает, что их можно контекстно изменять или переопределять. Пользовательское свойство должно иметь префикс из двух дефисов ( -- ) и чувствительно к регистру.

Функция var() принимает один обязательный аргумент: пользовательское свойство, которое вы пытаетесь вернуть в качестве значения.

В предыдущем фрагменте функция var() имеет --base-color переданный в качестве аргумента. Если --base-color определен, то var() вернет значение.

.my-element {
    background: var(--base-color, hotpink);
}

Вы также можете передать резервное значение декларации в функцию var() . Это означает, что если --base-color не может быть найден, вместо него будет использована переданная декларация , которая в случае этого примера является цветом hotpink .

Функции, возвращающие значение

Функция var() — это всего лишь одна из функций CSS, возвращающих значение. Такие функции, как attr() и url() следуют структуре, похожей на var() — вы передаете один или несколько аргументов и используете их в правой части вашего объявления CSS.

a::after {
  content: attr(href);
}

Функция attr() здесь берет содержимое атрибута href элемента <a> и устанавливает его как content псевдоэлемента ::after . Если бы значение атрибута href элемента <a> изменилось, это автоматически отразилось бы в этом атрибуте content .

.my-element {
    background-image: url('/path/to/image.jpg');
}

Функция url() принимает строку URL и используется для загрузки изображений, шрифтов и контента. Если действительный URL не передан или ресурс, на который указывает URL, не может быть найден, функция url() ничего не вернет.

Цветовые функции

Вы узнали все о цветовых функциях в модуле цвета . Если вы еще не читали его, настоятельно рекомендуется это сделать.

Некоторые доступные функции цвета в CSS: rgb() , hsl() , lab() , lch() , oklab() , oklch() и color() . Все они имеют схожую форму, в которой передаются аргументы конфигурации, а обратно возвращается цвет.

Математические выражения

Как и многие другие языки программирования, CSS предоставляет полезные математические функции, облегчающие выполнение различных типов вычислений.

Арифметические функции

calc()

Browser Support

  • Хром: 26.
  • Край: 12.
  • Firefox: 16.
  • Сафари: 7.

Source

Функция calc() принимает одно математическое выражение в качестве параметра. Это математическое выражение может быть смесью типов, таких как длина, число, угол и частота. Единицы измерения также могут быть смешанными.

.my-element {
    width: calc(100% - 2rem);
}

В этом примере функция calc() используется для установки ширины элемента в размере 100% от содержащего его родительского элемента, а затем удаления 2rem из этого вычисленного значения.

:root {
  --root-height: 5rem;
}

.my-element {
  width: calc(calc(10% + 2rem) * 2);
  height: calc(var(--root-height) * 3);
}

Функция calc() может быть вложена в другую функцию calc() . Вы также можете передавать пользовательские свойства в функцию var() как часть выражения.

min() и max()

Browser Support

  • Хром: 79.
  • Край: 79.
  • Firefox: 75.
  • Сафари: 11.1.

Source

Функция min() возвращает наименьшее вычисленное значение одного или нескольких переданных аргументов. Функция max() делает противоположное: получает наибольшее значение одного или нескольких переданных аргументов.

.my-element {
  width: min(20vw, 30rem);
  height: max(20vh, 20rem);
}

В этом примере ширина должна быть наименьшим значением между 20vw — что составляет 20% от ширины области просмотра — и 30rem . Высота должна быть наибольшим значением между 20vh — что составляет 20% от высоты области просмотра — и 20rem .

clamp()

Browser Support

  • Хром: 79.
  • Край: 79.
  • Firefox: 75.
  • Сафари: 13.1.

Source

Функция clamp() принимает три аргумента: минимальный размер, идеальный размер и максимальный.

h1 {
  font-size: clamp(2rem, 1rem + 3vw, 3rem);
}

В этом примере font-size будет жидким в зависимости от ширины области просмотра. Единица vw добавляется к единице rem для облегчения масштабирования экрана, поскольку независимо от уровня масштабирования единица vw будет иметь тот же размер. Умножение на единицу rem — на основе размера корневого шрифта — предоставляет функции clamp() относительную точку расчета.

Подробнее о функциях min() , max() и clamp () можно узнать в этой статье, посвященной этим функциям .

Тригонометрические функции

Тригонометрические функции позволяют находить любую точку на окружности на основе угла, моделировать циклические явления, такие как звуковые волны, описывать орбиты и т. д. В CSS вы можете использовать тригонометрические функции для установки свойств на основе вращения, временной анимации, вращения элементов на основе точки и других применений.

Дополнительную информацию и примеры можно найти в нашей статье о тригонометрических функциях .

sin() , cos() и tan()

Функции sin() , cos() и tan() принимают аргумент угла и возвращают синус, косинус и тангенс соответственно. Функции sin() и cos() возвращают число от -1 до 1 . Функция tan() возвращает число от -Infinity до +Infinity . Аргумент угла может быть любой поддерживаемой единицей измерения угла.

:root {
  --sine-degrees: sin(45deg);     /* returns 0.7071 */
  --sine-radians: sin(0.7853rad); /* returns 0.7071 */
}

В предыдущем примере --sine-degrees и --sine-radians имеют одинаковое значение (в данном случае 0.7071 ).

В предыдущем примере функции sin() и cos() используются для создания колебательных анимаций по осям x и y путем умножения результата на указанный радиус. Использование обеих функций одновременно позволяет получить анимацию вращения. Мы используем пользовательское свойство --angle для плавной анимации угла для всех вызовов функций.

asin() , acos() и atan()

Функции asin() , acos() и atan() являются обратными функциям sin() , cos() и tan() , принимающими число в качестве аргумента и возвращающими значение угла между -90deg и 90deg . Функции asin() и acos() принимают число между -1 и 1 тогда как функция atan() принимает число между -Infinity и +Infinity .

:root {
  --degrees: asin(0.7071); /* returns 45deg */
}

atan2()

Функция atan2() принимает два аргумента, представляющих точку относительно начала координат, и возвращает угол, представляющий направление к этой точке. Вы можете использовать это для поворота элементов в направлении определенной точки. Аргументы могут быть числами, единицами размера или процентами, но оба аргумента должны быть одного типа.

В приведенном выше примере функция atan2() используется для определения угла между центром области просмотра и текущим положением мыши. Обратите внимание, что значение y является первым аргументом, а значение x — вторым. Затем угол используется для позиционирования «зрачков» относительно центра «глаз», чтобы они следовали за мышью.

hypot()

Функция hypot() принимает два аргумента длины, представляющих стороны прямоугольного треугольника, и возвращает длину гипотенузы. Вы можете использовать это как сокращение для вычисления этого с помощью экспоненциальных функций. Оба аргумента должны быть одного типа единиц, и hypot() вернет тот же тип.

:root {
  --use-ems: hypot(3em, 4em);   /* returns 5em */
  --use-px:  hypot(30px, 40px); /* returns 50px */
}

Экспоненциальные функции

pow() и exp()

Функция pow() принимает два числовых аргумента, основание и показатель степени, и возводит основание в степень показателя степени. Оба аргумента должны быть числами без единиц измерения. Функция exp() принимает один аргумент и эквивалентна вызову функции pow() с основанием e .

.my-element {
  width: calc(10px * pow(4, 2); /* 10px * (4 * 4) == 160px */
}

sqrt()

Функция sqrt() принимает числовой аргумент и возвращает его квадратный корень. Аргумент не может включать единицы измерения.

:root {
  --root: sqrt(25); /* returns 5 */
}

log()

Функция log() возвращает логарифм числового значения. Если передан один аргумент, она вернет натуральный логарифм . Если передан второй аргумент, функция log() будет использовать второй аргумент в качестве основания для логарифма.

:root {
  --log2: log(16, 2); /* returns 4      */
  --logn: log(16);    /* returns 2.7725 */
}

abs()

Функция abs() принимает числовой аргумент и возвращает абсолютное (положительное) значение аргумента.

.my-element {
  color: rgba(0, 0, 0, abs(-1));
}

В предыдущем примере значение alpha , равное -1 , приведет к прозрачному тексту, но функция abs() возвращает абсолютное значение 1 , что приводит к полностью непрозрачному тексту.

sign()

Функция sign() принимает числовой аргумент и возвращает знак аргумента. Положительные значения возвращают 1 , а отрицательные значения возвращают -1 . Нулевые значения возвращают 0 .

.my-element {
  top: calc(50vh + 25vh * sign(var(--value));
}

В предыдущих примерах, если --value положительно, верхнее значение будет 75vh . Если оно отрицательно, верхнее значение будет 25vh . Если оно равно нулю, верхнее значение будет 50vh .

Формы

Свойства CSS clip-path , offset-path и shape-outside используют фигуры для визуального ограничения вашего блока или придания формы обтекаемому содержимому.

Существуют функции формы, которые можно использовать с обоими этими свойствами. Простые формы, такие как circle() , ellipse() и inset() принимают аргументы конфигурации для определения их размера. Более сложные формы, такие как polygon() принимают разделенные запятыми пары значений осей X и Y для создания пользовательских форм.

.circle {
  clip-path: circle(50%);
}

.polygon {
  clip-path: polygon(0% 0%, 100% 0%, 100% 75%, 75% 75%, 75% 100%, 50% 75%, 0% 75%);
}

Как и polygon() , есть также функция path() , которая принимает правило заливки SVG в качестве аргумента. Это позволяет создавать очень сложные фигуры, которые можно рисовать в графическом инструменте, таком как Illustrator или Inkscape, а затем копировать в CSS.

Превращает

Наконец, в этом обзоре функций CSS есть функции преобразования, которые наклоняют, изменяют размер и даже изменяют глубину элемента. Все следующие функции используются со свойством transform .

Вращение

Browser Support

  • Хром: 1.
  • Край: 12.
  • Firefox: 3.5.
  • Сафари: 3.1.

Source

Вы можете вращать элемент с помощью функции rotate() , которая вращает элемент вокруг его центральной оси. Вы также можете использовать функции rotateX() , rotateY() и rotateZ() для вращения элемента вокруг определенной оси. Вы можете передавать единицы измерения градуса, поворота и радиана для определения уровня вращения.

.my-element {
  transform: rotateX(10deg) rotateY(10deg) rotateZ(10deg);
}

Функция rotate3d() принимает четыре аргумента.

Browser Support

  • Хром: 12.
  • Край: 12.
  • Firefox: 10.
  • Сафари: 4.

Source

Первые 3 аргумента — это числа, которые определяют координаты X, Y и Z. Четвертый аргумент — это поворот, который, как и другие функции поворота, принимает градусы, углы и повороты.

.my-element {
  transform: rotate3d(1, 1, 1, 10deg);
}

Шкала

Browser Support

  • Хром: 1.
  • Край: 12.
  • Firefox: 3.5.
  • Сафари: 3.1.

Source

Вы можете изменить масштабирование элемента с помощью функции transform и scale() . Функция принимает одно или два числа в качестве значения, которое определяет положительное или отрицательное масштабирование. Если вы определяете только один числовой аргумент, обе оси X и Y будут масштабированы одинаково, а определение обеих является сокращением для X и Y. Так же, как и rotate() , существуют функции scaleX() , scaleY() и scaleZ() для масштабирования элемента по определенной оси.

.my-element {
  transform: scaleX(1.2) scaleY(1.2);
}

Также, как и функция rotate , есть функция scale3d() . Она похожа на scale() , но принимает три аргумента: коэффициент масштабирования X, Y и Z.

Переводить

Browser Support

  • Хром: 1.
  • Край: 12.
  • Firefox: 3.5.
  • Сафари: 3.1.

Source

Функции translate() перемещают элемент, сохраняя его положение в потоке документа. Они принимают значения длины и процента в качестве аргументов. Функция translate() перемещает элемент по оси X, если определен один аргумент, и перемещает элемент по осям X и Y, если определены оба аргумента.

.my-element {
  transform: translatex(40px) translatey(25px);
}

Вы можете — как и с другими функциями преобразования — использовать определенные функции для определенной оси, используя translateX , translateY и translateZ . Вы также можете использовать translate3d , который позволяет вам определять перемещение X, Y и Z в одной функции.

Перекос

Browser Support

  • Хром: 1.
  • Край: 12.
  • Firefox: 3.5.
  • Сафари: 3.1.

Source

Вы можете наклонить элемент, используя функции skew() , которые принимают углы в качестве аргументов. Функция skew() работает очень похоже на translate() . Если вы определяете только один аргумент, он будет влиять только на ось X, а если вы определяете оба, он будет влиять на оси X и Y. Вы также можете использовать skewX и skewY , чтобы влиять на каждую ось независимо.

.my-element {
  transform: skew(10deg);
}

Перспектива

Browser Support

  • Хром: 36.
  • Край: 12.
  • Firefox: 16.
  • Сафари: 9.

Source

Наконец, вы можете использовать свойство perspective , которое является частью семейства свойств преобразования, чтобы изменить расстояние между пользователем и плоскостью Z. Это создает ощущение расстояния и может использоваться для создания глубины резкости в ваших проектах.

В этом примере Дэвида Десандро из его очень полезной статьи показано, как его можно использовать вместе со свойствами perspective-origin-x и perspective-origin-y для создания по-настоящему трехмерных эффектов.

Анимационные функции, градиенты и фильтры

CSS также предоставляет функции, которые помогают вам анимировать элементы, применять к ним градиенты и использовать графические фильтры для управления их внешним видом. Чтобы сделать этот модуль максимально кратким, они рассматриваются в связанных модулях. Все они следуют структуре, аналогичной функциям, продемонстрированным в этом модуле.

Проверьте свое понимание

Проверьте свои знания функций

По каким символам можно определить функции CSS?

[]
()
:
::
{}

Есть ли в CSS встроенные математические функции?

ЛОЖЬ
Истинный

Функцию calc() можно поместить внутрь другой функции calc() например font-size: calc(10px + calc(5px * 3));

ЛОЖЬ
Истинный

Какие из следующих аргументов являются допустимыми для sin() и cos() ?

5em
45
10deg
pi

Какие из перечисленных функций являются функциями формы CSS?

circle()
ellipse()
rect()
square()
inset()
polygon()