Верстка формы с внутренними тенями на чистом CSS
Создание сложных визуальных эффектов, таких как внутренние тени (глубина) у формы, часто требует использования растровых изображений (PNG). Однако современный CSS позволяет добиться аналогичного результата без картинок, сохраняя гибкость и производительность. В этой статье разберём, как объединить круглые элементы и направляющие линии в единую композицию с общей внутренней тенью.
Почему стоит отказаться от PNG?
Использование PNG для крайних точек и центральных элементов - простое, но неоптимальное решение. Оно увеличивает вес страницы, усложняет адаптацию под разные экраны и требует генерации новых изображений при изменении количества точек. CSS-решение лишено этих недостатков и легко масштабируется.
Основная проблема: слияние круга и линии для общей тени
Главная сложность - создать эффект, при котором круглая точка и соединительная линия выглядят как единое целое с общей внутренней тенью. Обычное наложение box-shadow: inset на каждый элемент по отдельности даёт разрыв в месте стыка. Решение лежит в использовании псевдоэлементов и переопределении порядка наложения (z-index).
Пошаговая реализация на CSS
1. Базовая структура HTML
Создаём контейнер формы, внутри которого располагаем точки и линии. Каждая точка - это div с классом .point, линия - div с классом .line. Все элементы обёрнуты в общий блок .form-track.
2. Стилизация точки с внутренней тенью
Для круга используем border-radius: 50% и box-shadow: inset 0 0 10px rgba(0,0,0,0.5). Это создаёт глубину внутри самого круга.
.point {
width: 20px;
height: 20px;
border-radius: 50%;
background: #fff;
box-shadow: inset 0 0 10px rgba(0,0,0,0.5);
position: relative;
z-index: 2;
}3. Стилизация линии с тенью
Линии задаём height: 4px и background: #ccc. Чтобы тень не прерывалась в месте соединения с кругом, используем псевдоэлемент ::before, который накладывается поверх стыка и имитирует продолжение тени.
.line {
width: 100px;
height: 4px;
background: #ccc;
position: relative;
z-index: 1;
}
.line::before {
content: '';
position: absolute;
top: -8px;
left: -10px;
width: calc(100% + 20px);
height: 20px;
background: transparent;
box-shadow: inset 0 0 10px rgba(0,0,0,0.5);
border-radius: 10px;
z-index: 0;
}Псевдоэлемент перекрывает область стыка, создавая иллюзию единой внутренней тени, проходящей через круг и линию.
4. Общий контейнер и выравнивание
Располагаем точки и линии в ряд с помощью display: flex и align-items: center. Убеждаемся, что перекрытия z-index работают корректно: круг (z-index: 2) находится поверх линии (z-index: 1), а псевдоэлемент линии (z-index: 0) - под кругом, но перекрывает стык.
Альтернативный метод: SVG-фильтры
Если требуется более сложная форма или множество точек, можно использовать SVG-фильтры с feDropShadow или feGaussianBlur. Однако для простых форм описанный выше CSS-подход более производительный и проще в поддержке.
Преимущества CSS-решения
- Без изображений: не нужно загружать PNG, страница грузится быстрее.
- Адаптивность: легко менять размеры точек и линий через CSS.
- Масштабируемость: добавление новых точек не требует редактирования графики.
- Глубина: внутренняя тень выглядит естественно без разрывов.
Заключение
Верстка формы с внутренними тенями без использования изображений - реальная задача для CSS. Используя box-shadow: inset в комбинации с псевдоэлементами и правильным z-index, вы добьётесь эффекта глубины, который ранее требовал PNG-комплектов. Это решение экономит трафик, упрощает поддержку и делает интерфейс более гибким.