Анимация текста
На сегодняшнем уроке мы создадим особый текстовый эффект. Идея состоит в том, чтобы анимировать отдельные части предложения. Мы будем “менять” некоторые слова предложения с помощью CSS-анимации.
Пожалуйста, обратите внимание: результат этого урока будет работать только в браузерах, поддерживающих CSS анимацию.
Итак, давайте начнем!
HTML-разметка
У нас будет основной контейнер с заголовком второго уровня, который содержит несколько блоков с текстом:
<section class="rw-wrapper"> <h2 class="rw-sentence"> <span>Real poetry is like</span> <span>creating</span> <div class="rw-words rw-words-1"> <span>breathtaking moments</span> <span>lovely sounds</span> <span>incredible magic</span> <span>unseen experiences</span> <span>happy feelings</span> <span>beautiful butterflies</span> </div> <br /> <span>with a silent touch of</span> <div class="rw-words rw-words-2"> <span>sugar</span> <span>spice</span> <span>colors</span> <span>happiness</span> <span>wonder</span> <span>happiness</span> </div> </h2> </section>
Слова внутри блока с классом rw-words будут сменять друг друга. Для этого мы будем использовать CSS анимацию. Мы создадим анимацию для каждого div-а и для каждого span-a, просто она будет срабатывать с разными задержками.
Теперь давайте взглянем на CSS.
CSS3
Во-первых, мы зададим стили для основного контейнера и поместим его в центре страницы:
.rw-wrapper{ width: 80%; position: relative; margin: 110px auto 0 auto; font-family: 'Bree Serif'; padding: 10px; }
Добавим тень для текста ко всем элементам в заголовке:
.rw-sentence{ margin: 0; text-align: left; text-shadow: 1px 1px 1px rgba(255,255,255,0.8); }
И добавим некоторые стили для текста в span-ах:
.rw-sentence span{ color: #444; white-space: nowrap; font-size: 200%; font-weight: normal; }
Блоки будут выводится как inline-элементы, что позволит “вставить” их в предложения, не нарушая верстки:
.rw-words{ display: inline; text-indent: 10px; }
Каждый span внутри div-a с классом rw-words будет позиционироваться абсолютно, и мы будем скрывать любое его переполнение (overflow: hidden):
.rw-words span{ position: absolute; opacity: 0; overflow: hidden; width: 100%; color: #6b969d; }
Теперь мы создадим две анимации. Как упоминалось ранее, мы будем запускать одну и ту же анимацию для всех span-ов в одном div-e, только с разными задержками:
.rw-words-1 span{ animation: rotateWordsFirst 18s linear infinite 0s; } .rw-words-2 span{ animation: rotateWordsSecond 18s linear infinite 0s; } .rw-words span:nth-child(2) { animation-delay: 3s; color: #6b889d; } .rw-words span:nth-child(3) { animation-delay: 6s; color: #6b739d; } .rw-words span:nth-child(4) { animation-delay: 9s; color: #7a6b9d; } .rw-words span:nth-child(5) { animation-delay: 12s; color: #8d6b9d; } .rw-words span:nth-child(6) { animation-delay: 15s; color: #9b6b9d; }
Наша анимация будет отрабатывать один цикл, а это означает, что каждый span будет показан один раз в течение трех секунд. Вся анимация будет работать 6 (количество слов) * 3 (время показа) = 18 секунд.
Мы должны установить правильный процент значения непрозрачности. Деление 6 на 18 дает нам 0,333 …, это будет 33% от нашего шага keyframe. Все, что мы хотим, чтобы случилось с тегом span, должно произойти перед этим. Таким образом, после просмотра различных вариантов выбираем то, что подходит лучше всего, в результате получаем следующую анимацию для первого слова:
@keyframes rotateWordsFirst { 0% { opacity: 1; animation-timing-function: ease-in; height: 0px; } 8% { opacity: 1; height: 60px; } 19% { opacity: 1; height: 60px; } 25% { opacity: 0; height: 60px; } 100% { opacity: 0; } }
Мы прячем span и также изменяем его высоту.
Теперь определим анимацию для слов во втором div-e. Мы изменили немного шаги, потому что мы хотим, чтобы эти слова появлялись чуть-чуть позже, чем в первом блоке:
@keyframes rotateWordsSecond { 0% { opacity: 1; animation-timing-function: ease-in; width: 0px; } 10% { opacity: 0.3; width: 0px; } 20% { opacity: 1; width: 100%; } 27% { opacity: 0; width: 100%; } 100% { opacity: 0; } }
Вот и все! Есть множество вариантов создания анимации, несколько таких примеров вы можете увидеть ниже!