HTML & CSS
April 28, 2023

Малоизвестные но полезные CSS-свойства

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

isolation

Для того, чтобы ты понял необходимость использования данного свойства, для начала, я коротко расскажу про такую штуку в CSS, как контекст наложения (stacking context). Не путать с "this" в Javascript, это разные вещи!
Итак, в CSS существует определённый набор свойств, который создаёт для элемента собственную вычислительную обёртку - контекст. Простым языком - для всех дочерних элементов данное свойство будет иметь не глобальное значение, а вложенное.
Допустим, у нас есть элемент с "z-index: 1". Добавим ему ребенка с большим индексом:

.block1 { 
  width: 200px; 
  height: 200px;
  background: red;
  position: relative;
  z-index: 1;
}
.child1 { 
  width: 100px; 
  height: 100px;
  background: blue;
  position: relative;
  z-index: 9999;
}

В данном случае, истинный "z-index" у дочернего элемента будет равен 1.9999
То есть вычисление будет производиться относительно родителя с данным свойством. Иначе говоря - block1 создал свой собственный stacking context.

Кроме "z-index" собственный контекст создают свойства "position", "opacity", "animation", "transform" и др.

А что если, нам позарез надо создать у элемента контекст наложения, но для свойства, которое его по дефолту не создаёт ? Тут нам на помощь и приходит свойство "isolation".

Используя данное свойство, можно указать элементу принудительно создать stacking context. Это может очень помочь в том случае, когда ты уже настолько запутался в огромных значениях "z-index" у своих элементов, что хочется их организовать более рационально. Порядок действий будет следующим:

1) Найти родительский элемент, для которого структура будет слишком запутанная

2) Создать wrapper для него, с недвусмысленным названием "stacking-context-1"

3) Применить isolation: isolate.

4) Получить готовый контейнер с отдельным контекстом

will-change

Как часто у тебя бывал такой кейс:

Дизайнер просит сделать тебя офигенную, красивую тяжелую и долгую анимацию для какого нибудь блока, которая должна срабатывать только при выполнении какого-нибудь условия (к примеру, появления элемента в области видимости). Ты берешься, делаешь эту анимацию, выставляешь штук 20 промежуточных точек, вычисляемые положения и прочие изыски твоих алгоритмических познаний... вроде бы всё круто, но как только начинаешь тестить, то ловишь странную задержку, между срабатыванием условия и запуском анимации.
В поисках спрятанного delay, ты проводишь остаток рабочего дня и половину вечера, и... ничего не находишь.

На самом деле, браузер пытается вычислить все свойства твоей анимации "на лету". То есть, любая промежуточная точка в анимации вычисляется только в тот момент, когда она действительно необходима. В том случае, если вычислений много или они достаточно массивные - ты можешь ловить freeze или даже полное зависание страницы.
Для оптимизации данного кейса и придумали свойство "will-change".

Это свойство как бы говорит браузеру, чтобы он вычислил все нужные значения заранее, а при срабатывании условия - просто воспроизвел их.

Однако, использовать данное свойство нужно с осторожностью, так как если на странице будет переизбыток "will-change" - тогда ты можешь ждать очень-очень долго самого первого рендера. В большинстве случаев, рациональным подходом будет являться обычная оптимизация кодовой базы анимаций.

accent-color

Посмотри на эту картинку:

Обычный стандартный чекбокс. Как известно, элементы взаимодействия с пользователем (input, select, option, textarea) очень привередливые к стилям.
Предположим, тебе нужно изменить цвет галочки с синей на золотистую. Неопытный разработчик сразу начнёт это делать через псевдоэлементы, "display: none" и прочие радости верстальщика. Но ты же читаешь этот канал. Ты умнее. Ты просто воспользуешься свойством accent-color и решишь проблему за секунду:

input[type="checkbox"] { 
  accent-color: #fcc050;
}

Если ты думаешь, что про это свойство знают все - ты заблуждаешься. Вот как на простой вопрос отвечают на StackOverflow:

... а ниже строк 56 великолепного кода на CSS.

Читать эту статью или писать кучу CSS ? Решай сам.

shape

Закончим эту статью очень интересной группой свойств.

Ты думаешь, я руками проставлял margin для каждого из этих параграфов?
Нет!
Для создания геометрических фигур в CSS достаточно использовать CSS Shapes.

Данное свойство накладывает небольшие ограничения на целевой элемент - он обязательно должен быть с фиксированными размерами, а так же - быть обтекаемым (float). Не слишком высокая цена, не правда ли ?
С помощью shapes можно создавать различные геометрические фигуры без объемной кодовой базы и изображений. Однако, для того чтобы закрасить созданную нами фигуру - нам необходимо использовать shape в комбинации с clip-path. Пример - закрашенный градиентом треугольник:

.circle { 
  float: left; 
  height: 200px; 
  width: 200px; 
  shape-outside: polygon(0 0, 0 300px, 200px 300px);  
  clip-path: polygon(0 0, 0 300px, 200px 300px);   
  background: linear-gradient(to top right, #86F7CC, #67D7F5); 
}

На этом от меня - всё. Ставь лайк на эту статью, это очень мотивирует меня!
Буду стараться писать качественный материал как можно чаще
Подписывайся на канал и следи за самой актуальной и интересной информацией в мире Frontend