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

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 прост: контейнер с текстовым блоком внутри.
Анимируем текст — ключевые правила
- Сделайте ширину контейнера равной содержимому:
.container{
width: fit-content;
} - Определите ключевые кадры для изменения ширины от 0% до 100%:
@keyframes type-text {
0% {
width: 0%;
}
100% {
width: 100%;
}
} - Для текстового блока:
- Скрываем переполнение (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 и задержками.
Важно: не полагайтесь только на визуальный эффект. Добавьте скрытый текст для скринридеров или альтернативный статический контент.
Мини-методология: шаг за шагом
- Подготовьте HTML: контейнер и текстовый элемент.
- Установите overflow: hidden и white-space: nowrap для текста.
- Задайте ширину контейнера равной содержимому (fit-content) или фиксируйте в em.
- Создайте @keyframes для плавного изменения ширины от 0% до 100%.
- Примените animation с steps(n) и подберите duration и n.
- Добавьте @keyframes для cursor-blink и объедините анимации.
- Тестируйте на разных размерах экрана и в assistive-технологиях.
Шпаргалка: компактные сниппеты
- Базовый набор с 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; }
}- Для адаптивного текста с фиксированным количеством символов используйте ch (символьная единица):
.text { width: 0; }
@keyframes type-text { to { width: 40ch; } }- Множественные фразы через 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‑линейный глоссарий
- steps(): CSS timing-function для дискретной анимации; задаёт число шагов и поведение начала/конца.
- overflow: hidden: прячет часть содержимого, используемую для «скрытия» не набранного текста.
- ch: единица ширины символа в CSS, полезна для измерения длины текста.
Заключение
Эффект печатной машинки на CSS — простой и эффективный приём, который можно внедрить без JavaScript. Он подходит для заголовков, лендингов и интерфейсных подсказок. Помните про доступность, адаптивность и тестирование на разных устройствах. Если требуется сложная логика или динамическая замена текста — комбинируйте CSS с JavaScript.
Важно: используйте этот эффект умеренно — слишком частые декоративные анимации могут раздражать пользователей.
Похожие материалы
Подготовка к техническому собеседованию разработчика
Запуск мастера устранения неполадок в Windows
Как создать мем: полное руководство
Как устранить BSOD 0x0000003B в Windows
Clone Stamp в Photoshop — подробное руководство