Верстка формы с внутренними тенями на чистом 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-комплектов. Это решение экономит трафик, упрощает поддержку и делает интерфейс более гибким.

    Часто задаваемые вопросы