Гид по технологиям

Эффект печатной машинки с CSS: steps(), анимации и лайфхаки

5 min read Frontend Обновлено 15 Apr 2026
Эффект печатной машинки с CSS
Эффект печатной машинки с CSS

Экран ноутбука с редактором кода

CSS прошёл большой путь. Сегодня он позволяет делать эффекты, которые раньше требовали JavaScript. Одним из таких приёмов является имитация печатающего курсора и постепенного появления текста. В статье показано, как получить эффект печатной машинки с помощью CSS-функции steps(), как оживить курсор и какие варианты полезны в реальных проектах.

Что такое эффект печатной машинки

Эффект печатной машинки — это анимация текста, при которой символы (или блоки текста) появляются постепенно, как будто их печатают в реальном времени. Зритель видит постепенное раскрытие сообщения, что создаёт интригу и привлекает внимание.

Кратко: эффект удобен для заголовков, интро-страниц, презентаций и интерфейсов, где важно последовательно раскрывать информацию.

Как работает функция steps()

CSS-функции дают гибкость, которую сложно достичь только статическими стилями. Функция steps() используется в timing-function и заставляет анимацию «шагать» дискретно, а не плавно.

Синтаксис:

animation-timing-function: steps(n, direction)

Параметры:

  • n — число шагов (целое). Чем больше n, тем более гладкой будет выглядеть анимация.
  • direction — либо start, либо end. Если опустить — берётся end по умолчанию.

Поведение:

  • start — первый шаг завершён сразу при старте анимации.
  • end — последний шаг соответствует концу анимации.

Пример HTML-разметки для демонстрации движения блока:

  
  

Базовая анимация движения в CSS — блок плавно перемещается:

.container {  
    background-color: blue;  
}  
  
div:not(.container) {  
    background-color: red;  
    width: 88px;  
    height: 88px;  
    animation: movebox 4s infinite;  
}  
  
@keyframes movebox {  
    100% {  
        transform: translateX(100vw);  
    }  
}  

Если вместо плавности нужен «рывок», добавьте steps():

div:not(.container){  
    background-color: red;  
    width: 88px;  
    height: 88px;  
    animation: movebox 4s infinite;  
    animation-timing-function: steps(10, end);  
}  

Чем выше n, тем меньше заметна «рывистость».

Важно: если направление не указано, браузер использует end.

Реализация эффекта печатной машинки — структура проекта

Создайте папку проекта и добавьте два файла: index.htm и style.css.

Содержимое index.htm (шаблон):

  
  
    
      
      
    Document  
      
    
    
      
        
        Lorem ipsum dolor sit amet consectetur   
        adipisicing elit. Reiciendis, tempore!   
      
    
  

HTML прост: контейнер с текстовым блоком внутри.

Анимируем текст — ключевые правила

  1. Сделайте ширину контейнера равной содержимому:
.container{  
    width: fit-content;  
}  
  1. Определите ключевые кадры для изменения ширины от 0% до 100%:
@keyframes type-text {  
  0% {  
    width: 0%;  
  }  
  100% {  
    width: 100%;  
  }  
}  
  1. Для текстового блока:
  • Скрываем переполнение (overflow: hidden). Это позволяет «скрывать» не набранную часть текста.
  • Запрещаем переносы (white-space: nowrap).
  • Используем моноширинный шрифт.
  • Добавляем правую границу как курсор.
  • Применяем анимацию ширины с steps().

Пример стилей для .text:

.text {  
  overflow: hidden;  
  white-space: nowrap;  
  font-family: "Courier New", Courier, monospace;  
  border-right: solid 10px green;  
  font-size: 23px;  
  animation: type-text forwards 4s;  
  animation-timing-function: steps(40);  
}  

Параметры, которые можно настроить:

  • Длительность animation (4s в примере).
  • Число шагов в steps(n) — чем выше, тем плавнее набор.
  • Толщина и цвет border-right — внешний вид курсора.

Оживляем курсор

Чтобы курсор мигал, добавьте отдельную анимацию, меняющую цвет границы:

@keyframes cursor-blink {  
    0% {  
        border-color: transparent;  
    }  
  
    100% {  
        border-color: green;  
    }  
}  

Обновите свойство animation у .text, чтобы применить обе анимации:

.text{  
    /* Другие правила */  
    animation: type-text forwards 4s,  
             cursor-blink .6s infinite;  
}  

В результате вы получите набор текста с мигающим курсором.

Частые вопросы и подводные камни

Важно: если длина строки меняется в зависимости от ширины экрана (адаптивная вёрстка), использование width в процентах может вести себя непредсказуемо. В таких случаях целесообразно фиксировать ширину контейнера в em или использовать max-width.

Когда этот приём не годится:

  • Когда нужно поддерживать переносы или многострочный текст.
  • Для сложной логики морфинга текста (смена фраз, цикличность) удобнее JS.
  • Для экранных читалок нужно обеспечить доступный аналог (см. раздел Доступность).

Альтернативы:

  • JS-реализация, посимвольно вставляющая текст в DOM. Даёт точный контроль, но требует скриптов.
  • SVG‑анимация для декоративного набора с кривыми и кастомными эффектами.

Практические советы и хитрости

  • Используйте steps(n, end) для предсказуемого поведения при завершении анимации.
  • Для нескольких строчек: вместо ограничения по ширине применяйте clip-path или анимируйте width внутри inline-block-элемента с display: inline-block.
  • Для плавного перехода между разными фразами комбинируйте анимацию ширины с opacity и задержками.

Важно: не полагайтесь только на визуальный эффект. Добавьте скрытый текст для скринридеров или альтернативный статический контент.

Мини-методология: шаг за шагом

  1. Подготовьте HTML: контейнер и текстовый элемент.
  2. Установите overflow: hidden и white-space: nowrap для текста.
  3. Задайте ширину контейнера равной содержимому (fit-content) или фиксируйте в em.
  4. Создайте @keyframes для плавного изменения ширины от 0% до 100%.
  5. Примените animation с steps(n) и подберите duration и n.
  6. Добавьте @keyframes для cursor-blink и объедините анимации.
  7. Тестируйте на разных размерах экрана и в assistive-технологиях.

Шпаргалка: компактные сниппеты

  1. Базовый набор с cursor-blink:
.text {
  display: inline-block;
  overflow: hidden;
  white-space: nowrap;
  border-right: 3px solid #0f0;
  animation: type-text 3s steps(30) forwards, cursor-blink .6s infinite;
}

@keyframes type-text {
  0% { width: 0; }
  100% { width: 100%; }
}

@keyframes cursor-blink {
  0% { border-color: transparent; }
  50% { border-color: #0f0; }
  100% { border-color: transparent; }
}
  1. Для адаптивного текста с фиксированным количеством символов используйте ch (символьная единица):
.text { width: 0; }
@keyframes type-text { to { width: 40ch; } }
  1. Множественные фразы через CSS только с ключевыми кадрами и задержками; для динамического контента лучше JS.

Чеклист по ролям

Дизайнер:

  • Выбрать шрифт и цвет курсора.
  • Решить, нужен ли эффект на мобильных.

Фронтенд-разработчик:

  • Реализовать анимацию с запасом по шагам и длительности.
  • Проверить поведение при изменении размера экрана.
  • Обеспечить резервный вариант для устаревших браузеров.

QA:

  • Проверить анимацию в Chrome, Firefox, Safari.
  • Протестировать с включёнными экономией батареи и низкой производительностью.
  • Проверить доступность с экранными читалками.

Доступность и SEO

  • Для скринридеров оставьте полный текст в DOM; не убирайте текст через aria-hidden при анимации.
  • Если текст важен для SEO, он должен быть видимым для поисковых роботов. CSS-анимация не скрывает текст из DOM, поэтому обычно безопасна.

Совет: добавьте data-атрибут с полной строкой и при помощи CSS/JS показывайте статичный текст для пользователей с ограниченными возможностями.

Фактбокс: полезные значения

  • Частота мигания курсора: 0.5–0.8 с обычно выглядит естественно.
  • Стандартное число шагов в примерах: 20–60 (меньше — более «рывисто», больше — плавнее).
  • Если direction опущен — значение steps() по умолчанию end.

Критерии приёмки

  1. Текст набирается посимвольно визуально, длина анимации соответствует ТЗ.
  2. Курсор мигает во время набора и остаётся видимым либо исчезает в соответствии с дизайном.
  3. Текст доступен для скринридеров и для поисковых роботов.
  4. Работает в основных современных браузерах без ошибок верстки.

1‑линейный глоссарий

  • steps(): CSS timing-function для дискретной анимации; задаёт число шагов и поведение начала/конца.
  • overflow: hidden: прячет часть содержимого, используемую для «скрытия» не набранного текста.
  • ch: единица ширины символа в CSS, полезна для измерения длины текста.

Заключение

Эффект печатной машинки на CSS — простой и эффективный приём, который можно внедрить без JavaScript. Он подходит для заголовков, лендингов и интерфейсных подсказок. Помните про доступность, адаптивность и тестирование на разных устройствах. Если требуется сложная логика или динамическая замена текста — комбинируйте CSS с JavaScript.

Важно: используйте этот эффект умеренно — слишком частые декоративные анимации могут раздражать пользователей.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Подготовка к техническому собеседованию разработчика
Карьера

Подготовка к техническому собеседованию разработчика

Запуск мастера устранения неполадок в Windows
Windows

Запуск мастера устранения неполадок в Windows

Как создать мем: полное руководство
Социальные сети

Как создать мем: полное руководство

Как устранить BSOD 0x0000003B в Windows
Windows

Как устранить BSOD 0x0000003B в Windows

Clone Stamp в Photoshop — подробное руководство
Графика

Clone Stamp в Photoshop — подробное руководство

Синхронизация звука и видео в After Effects
Видео монтаж

Синхронизация звука и видео в After Effects