Полное руководство по функциям CSS
Tags: css, tutorial, webdev
Published: 2020-05-17 14:42:52

Вольный перевод статьи [A Complete Guide to CSS Functions](https://css-tricks.com/complete-guide-to-css-functions/)

## Вступление

В программировании функции - это именованная часть кода, которая выполняет определенную задачу. Примером этого может быть функция, написанная на JavaScript, называемая `sayWoof ()`:

```
function sayWoof() {
 console.log("Woof!");
} 
```

Мы можем использовать эту функцию позже в нашем коде, после того как мы определили желаемое поведение. Для этого примера, каждый раз, когда вы вводите `sayWoof ()` на своем веб-сайте или в JavaScript веб-приложения, будет напечатано «Woof!» в консоль браузера.

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

```
function countDogs(amount) {
 console.log("There are " + amount + " dogs!");
}
```

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

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

## Базовые CSS функции 

### url() 

Позволяет ссылаться на другие ресурсы, чтобы загрузить их. Это могут быть изображения, шрифты и даже другие css файлы. По соображениям производительности рекомендуется ограничивать объем загружаемых данных с помощью url (), поскольку каждое объявление является дополнительным HTTP-запросом.

### attr()

Эта функция позволяет нам проникать в HTML, брать содержимое атрибута и передавать его в свойство содержимого CSS. Например, 

````
<p data-name="Arif">My name is </p>
<style>
	p::after {
		content: attr(data-example);
	}
</style>
````

Также есть дополнительный синтаксис [MDN](https://developer.mozilla.org/en-US/docs/Web/CSS/attr)

````
/* With type */
attr(src url);
attr(data-count number);
attr(data-width px);

/* With fallback */
attr(data-count number, 0);
attr(src url, "");
attr(data-width px, inherit);
attr(data-something, "default");
````

Вы часто увидите `attr ()`, используемый в таблицах стилей печати, где он используется для отображения URL ссылки после ее текста. Еще одно замечательное применение этой функции - использовать его для отображения альтернативного описания изображения, если оно не загружается.

### calc() 

Эта функция принимает два аргумента и вычисляет результат из оператора (+, -, *, /). Аргументами могут быть custom-propertie и все возможные юниты для обозначения длины или ширины (px, %, em  итп) 

    width: calc(100% - 30px);

### lang() 

Если мы добавим `lang` атрибут для `<html>`, то дальше сможем работать с функцией `lang()` и применять стили в соответствии от языка страницы.   

````
  <p><q>Some text</q></p>
  
  <style> 
	q:before { content: open-quote; }
	q:after { content: close-quote; }
	
	:lang(en) q { quotes: '“' '”'; }
	:lang(fr) q { quotes: '«' '»'; }
	:lang(de) q { quotes: '»' '«'; }
  </style>
````

### not() 

Этот псевдокласс селектор выберет все, что НЕ то, что мы указали. Например, вы можете нацелить все, что не является изображением с `body:not(img)`.

Пока что браузеры поддерживают только один атрибут, но уже ведется работа над добавлением сразу нескольких атрибутов через запятую. 

## CSS Custom Properties 

`var()` используется для ссылки на custom propertie, объявленное ранее в документе. Оно невероятно мощно в сочетании с `calc()`, так как `calc()` работает динамично и мы также динамично можем менять custom propertie. Плюс ко всему мы можем их менять через JS (почему-то сразу подумал про изменение цветовой схемы в runtime).

## Функции цветов

Тут всё просто. Используем `rgb()` или `hsl()` для генерирования цвета. Также по спецификации [CSS Color Module Level 4](https://www.w3.org/TR/css-color-4/) доступен четвертый параметр, отвевающий за прозрачность. Это значит, что `rgba()` и `hsla()` станут не нужны. 

## Селекторы псевдоним класса

`:nth-child()` - Выбирает элементы на основе предоставленного алгебраического выражения (например, «2n» или «4n-1»). Например, вы можете использовать «2n» для выбора четных позиций и «2n-1» для нечетных позиций. Или можно написать `odd` и `even`. Имеет возможность делать другие вещи, такие как выбор «каждый четвертый элемент» `(4n)`, «первые шесть элементов» `(-n+6)` и тому подобное.

`:nth-of-type()` - работает как `nth-child()`, только работает для случаев, когда дети родителя относятся к разными типам. 
Например есть в `<div>` 10 вложенных детей, некоторые из которых    `<p>`, а другие `<div>`.

````
<div>
 <p></p>
 <p></p> 
 <p></p>
 <div></div>
 <div></div>
 <div></div>
 <div></div>    
 <p></p>
 <p></p>
 <p></p>    
</div>
````

Если мы хотим выделить "нечетные" параграфы, не учитывая <div>, то тут поможет как раз `:nth-of-type()`.

`:nth-last-child()` - работает как `:nth-child()`, только считает не с начала, а с конца.

`:nth-last-of-type()` - работает как `:nth-of-type()`, только считает не с начала, а с конца.

## Функции анимаций 

`cubic-bezier()` - выдает различный рода тайминг для анимации. Например, ease, ease-in-out или linear, а также написать собственные значения. Подробнее [тут](https://cubic-bezier.com)

`path()` - эта функция связана со свойством `offset-path`. Она позволяет вам «рисовать» SVG-путь, по которому могут быть анимированы другие элементы.

`steps()` - Эта относительно новая функция позволяет вам установить время замедления анимации, что обеспечивает большую степень контроля над тем, какая часть анимации происходит, когда. Хорошие примеры [тут](https://danielcwilson.com/blog/2019/02/step-and-jump/)

## Функции определения размера и масштабирования

Работают со свойством transform. 

`scaleX(), scaleY(), scaleZ(), scale3d() и scale()` - позволяют  увеличить/уменьшить размер относительно одной или более плоскостей. 

`translateX(), translateY(), translateZ(), translate3d() и translate()` - перемещает элемент относительно одной или более плоскостей. 

`perspective()` - помогает визуализировать 3D объект. Отвечает за визуальное расстояние оси Z от элемента до пользователя. 

`rotateX(), rotateY(), rotateZ(), rotate3d() и rotate()` - поворачивает элемент относительно одной или более плоскостей.

`skewX(), skewY() и skew()` - наклоняет элемент сразу в двумерном пространстве по горизонтали и вертикали или одновременно в двух направлениях. Из прямоугольника как бы превратить в параллелограмм (скошенный прямоугольник) 

## Функции фильтрации цветов 

Работают со свойством `filter`. Что-то похожее на фотошоп.

`brightness()` - отвечает за яркость элемента. 

`blur()` - отвечает за размытость 

`contrast()` - отвечает за контраст 

`grayscale()` - удаляет за цвет. Можно убрать весь цвет с компьютера

`invert()` - с помощью него можно сделать негативную версию картинки 

`opacity()` - насколько елемент прозрачен

`saturate()` - насыщенность цветов

`sepia()` - применение фильтра сепии 

`drop-shadow()` - как box-shadow, только если элемент с прозрачным фоном, тень применяется для непрозрачной области. Хорошо подходит для текста или картинок с прозрачным фоном. 

`hue-rotate()` - меняет попиксельно цвета. Hue-rotate(180deg) как бы осуществляет инверсию цвета, как негатив.

## Функции форм элемента

Работает со свойством `clip-path`.

`circle()` - урезает кругом

`ellipse()` - урезает овалом

`inset()` - урезает квадратом

`polygon()` - с помощью связующих точек можно построить любую фигуру, которая будет обрезать элемент