Как сверстать таймлайн с пунктирной линией и кружком из SVG

    При создании лендингов и сайтов-портфолио часто возникает задача реализовать красивый таймлайн (хронологию событий). В макете дизайнер может использовать SVG-элементы: пунктирную линию и кружок. Разберём, как правильно интегрировать такую графику в вёрстку, чтобы таймлайн выглядел точно как в дизайне, был адаптивным и доступным.

    Способы вставки SVG в таймлайн

    Есть три основных подхода:

    • Inline SVG (встроенный код) - самый гибкий вариант. Вы копируете код SVG прямо в HTML. Это позволяет управлять цветами, размерами и анимацией через CSS.
    • Тег img с src - подходит, если SVG статичен и не требует стилизации. Минус - сложнее адаптировать под разные экраны.
    • SVG как background-image - удобно для декоративных элементов. Можно использовать в псевдоэлементах ::before или ::after.

    Для таймлайна с кружком и пунктиром чаще всего выбирают inline SVG, чтобы точно позиционировать кружок относительно текста.

    Структура таймлайна

    Типичная разметка состоит из контейнера, внутри которого находятся блоки событий. Каждый блок содержит точку (кружок) и текст. Пунктирная линия обычно соединяет все точки.

    <div class='timeline'>
    <div class='timeline__item'>
    <div class='timeline__dot'>
    <svg>...</svg>
    </div>
    <div class='timeline__content'>
    <h3>2024</h3>
    <p>Запуск проекта</p>
    </div>
    </div>
    </div>

    Позиционирование SVG-линии и кружка

    Чтобы линия проходила ровно по центру кружков, используйте CSS Flexbox или Grid. Кружок фиксированного размера (например, 20×20 px) выравнивается по центру колонки. Пунктирная линия рисуется либо как отдельный SVG-элемент между точками, либо как фон с повторяющимся паттерном.

    Пример стилей для inline SVG:

    .timeline__dot svg {
    width: 20px;
    height: 20px;
    display: block;
    }
    .timeline__line {
    position: absolute;
    left: 50%;
    top: 0;
    bottom: 0;
    width: 2px;
    background: repeating-linear-gradient(to bottom, #333, #333 4px, transparent 4px, transparent 8px);
    }

    Адаптивность и ретина

    SVG отлично масштабируется, поэтому проблем с ретиной не возникает. Главное - задать размеры через CSS, а не атрибуты width/height в SVG, если нужна гибкость. Для мобильных версий можно скрывать линию или менять её толщину.

    Доступность (a11y)

    Не забывайте добавлять атрибут role='img' и aria-label к декоративным SVG, если они несут смысловую нагрузку. Для чисто декоративных элементов используйте aria-hidden='true'.

    Частые ошибки при вёрстке

    • Использование растровых изображений вместо SVG - теряется чёткость.
    • Жёсткая привязка к пикселям - на мобильных кружок может съехать.
    • Игнорирование свойства viewBox - без него SVG может неправильно масштабироваться.

    Правильно организованный таймлайн с SVG-линией и кружком не только повторяет макет, но и остаётся удобным для пользователя на любом устройстве.

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