Сегодня рассмотрим, как сделать эффект тряски (shake) любых элементов на вашем сайте без использования плагинов jQuery, на чистом CSS. Смотрится эффектно, делается легко, есть разные виды тряски, одним словом — ништяк. Этот эффект придумал зарубежный вебмастер, вот страница его сайта с демо. Рассмотрим, как это всё дело подключить к себе на сайт.
Способ №1: Подключение эффекта тряски
Подключение эффектов тряски осуществляется с помощью Download Center. Это отдельная страница сайта разработчика, на которой размещены .css-файлы с каждым эффектом тряски. Вам нужно выбрать понравившийся эффект, затем скачать файл с выбранным эффектом (либо скопировать код в созданный вами .css-файл с названием эффекта) и залить файл в корневую папку шаблона вашего сайта.
Также нужно будет указать путь к данному файлу перед закрывающим тегом </head>
:
1 |
<link rel="stylesheet" type="text/css" href="<?php bloginfo('template_url'); ?>/csshake-hard.css"> |
Примечание: Вместо <?php bloginfo('template_url'); ?>
вам нужно указать свой путь к файлу.
Затем вы можете выбрать любой div
, li
, a
или другой объект, к которому хотите применить эффект, и добавить к нему клас с названием эффекта, например:
1 |
<li><a class="csshake-hard" href="#">Объект</a></li> |
Способ №2: Подключение эффекта тряски
Можно не подключать отдельный .css-файл, а добавить код напрямую в файл style.css. Например, добавим эффект shake-hard к ссылкам следующего списка:
1 2 3 4 5 6 7 8 9 10 11 |
<div class="spisok"> <ul> <li><a href="#">Джеки Чан </a></li> <li><a href="#">Брюс Ли </a></li> <li><a href="#">Сильвестр Сталлоне </a></li> <li><a href="#">Джейсон Стэтхэм </a></li> <li><a href="#">Халк Хоган </a></li> <li><a href="#">Брюс Уиллис </a></li> <li><a href="#">Марк Уолберг </a></li> </ul> </div> |
Для этого в style.css нужно добавить тот же код из файла csshake-hard.css (который находится в Download Center):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 |
.shake-hard { display: inline-block; transform-origin: center center; } .shake-freeze, .shake-constant.shake-constant--hover:hover, .shake-trigger:hover .shake-constant.shake-constant--hover { animation-play-state: paused; } .shake-freeze:hover, .shake-trigger:hover .shake-freeze, .shake-hard:hover, .shake-trigger:hover .shake-hard { animation-play-state: running; } @keyframes shake-hard { 2% { transform: translate(10px, -5px) rotate(-0.5deg); } 4% { transform: translate(4px, 1px) rotate(0.5deg); } 6% { transform: translate(10px, 9px) rotate(2.5deg); } 8% { transform: translate(7px, 7px) rotate(3.5deg); } 10% { transform: translate(10px, 0px) rotate(0.5deg); } 12% { transform: translate(-3px, -4px) rotate(0.5deg); } 14% { transform: translate(-4px, -2px) rotate(-0.5deg); } 16% { transform: translate(8px, 7px) rotate(3.5deg); } 18% { transform: translate(-8px, -3px) rotate(0.5deg); } 20% { transform: translate(2px, -7px) rotate(-2.5deg); } 22% { transform: translate(6px, 1px) rotate(-1.5deg); } 24% { transform: translate(1px, 1px) rotate(-2.5deg); } 26% { transform: translate(-1px, 10px) rotate(2.5deg); } 28% { transform: translate(10px, -1px) rotate(3.5deg); } 30% { transform: translate(-8px, -2px) rotate(2.5deg); } 32% { transform: translate(7px, 0px) rotate(3.5deg); } 34% { transform: translate(-1px, -3px) rotate(-1.5deg); } 36% { transform: translate(-5px, 8px) rotate(1.5deg); } 38% { transform: translate(8px, 5px) rotate(3.5deg); } 40% { transform: translate(10px, 2px) rotate(-1.5deg); } 42% { transform: translate(0px, -1px) rotate(-2.5deg); } 44% { transform: translate(-3px, -6px) rotate(0.5deg); } 46% { transform: translate(0px, -6px) rotate(-2.5deg); } 48% { transform: translate(6px, 6px) rotate(-2.5deg); } 50% { transform: translate(-3px, 9px) rotate(-0.5deg); } 52% { transform: translate(7px, -3px) rotate(1.5deg); } 54% { transform: translate(7px, 0px) rotate(1.5deg); } 56% { transform: translate(3px, -7px) rotate(0.5deg); } 58% { transform: translate(2px, -3px) rotate(-2.5deg); } 60% { transform: translate(5px, 2px) rotate(-2.5deg); } 62% { transform: translate(-2px, 10px) rotate(-0.5deg); } 64% { transform: translate(8px, -2px) rotate(3.5deg); } 66% { transform: translate(8px, -3px) rotate(1.5deg); } 68% { transform: translate(4px, 5px) rotate(2.5deg); } 70% { transform: translate(0px, -7px) rotate(2.5deg); } 72% { transform: translate(5px, -7px) rotate(1.5deg); } 74% { transform: translate(-4px, -2px) rotate(-2.5deg); } 76% { transform: translate(-8px, -2px) rotate(1.5deg); } 78% { transform: translate(2px, -5px) rotate(0.5deg); } 80% { transform: translate(-2px, -3px) rotate(0.5deg); } 82% { transform: translate(-4px, -1px) rotate(-0.5deg); } 84% { transform: translate(-4px, 8px) rotate(0.5deg); } 86% { transform: translate(3px, 5px) rotate(-0.5deg); } 88% { transform: translate(6px, -4px) rotate(3.5deg); } 90% { transform: translate(-8px, 3px) rotate(-0.5deg); } 92% { transform: translate(-5px, 3px) rotate(-2.5deg); } 94% { transform: translate(10px, 2px) rotate(1.5deg); } 96% { transform: translate(-8px, 6px) rotate(-2.5deg); } 98% { transform: translate(10px, 9px) rotate(1.5deg); } 0%, 100% { transform: translate(0, 0) rotate(0); } } .shake-hard:hover, .shake-trigger:hover .shake-hard, .shake-hard.shake-freeze, .shake-hard.shake-constant { animation-duration: 100ms; animation-iteration-count: infinite; animation-name: shake-hard; animation-timing-function: ease-in-out; } |
И добавить class="shake-hard"
к ссылкам:
1 2 3 4 5 6 7 8 9 10 11 |
<div class="spisok"> <ul> <li><a class="shake-hard" href="#">Джеки Чан </a></li> <li><a class="shake-hard" href="#">Брюс Ли </a></li> <li><a class="shake-hard" href="#">Сильвестр Сталлоне </a></li> <li><a class="shake-hard" href="#">Джейсон Стэтхэм </a></li> <li><a class="shake-hard" href="#">Халк Хоган </a></li> <li><a class="shake-hard" href="#">Брюс Уиллис </a></li> <li><a class="shake-hard" href="#">Марк Уолберг </a></li> </ul> </div> |
Готово! Если эффект не будет отображаться в вашем браузере, то попробуйте добавить к правилу @keyframes следующие приставки:
-webkit-
для Google Chrome, Safari;
-moz-
для Mozilla;
-o-
для Opera.
Например:
1 2 3 |
@-webkit-keyframes shake-hard {код} @-moz-keyframes shake-hard {код} @-o-keyframes shake-hard {код} |
Делаем эффект тряски самостоятельно
Если вы не хотите подключать файлы или хотите сократить количество кода, то можно попробовать самостоятельно создать эффект тряски на чистом CSS. Кода при этом будет в два раза меньше.
Как вы уже могли заметить, в коде каждого эффекта меняются только px (пиксели) и deg (градусы) для % (процентов). Также с каждой новой строкой добавляется 2% (см. выше). Мы можем легко сократить этот код. Например, минимизируем код эффекта shake:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
@-webkit-keyframes shake { 0% { -webkit-transform: translate(2px, 1px) rotate(0deg); } 10% { -webkit-transform: translate(-1px, -2px) rotate(-1deg); } 20% { -webkit-transform: translate(-3px, 0px) rotate(1deg); } 30% { -webkit-transform: translate(0px, 2px) rotate(0deg); } 40% { -webkit-transform: translate(1px, -1px) rotate(1deg); } 50% { -webkit-transform: translate(-1px, 2px) rotate(-1deg); } 60% { -webkit-transform: translate(-3px, 1px) rotate(0deg); } 70% { -webkit-transform: translate(2px, 1px) rotate(-1deg); } 80% { -webkit-transform: translate(-1px, -1px) rotate(1deg); } 90% { -webkit-transform: translate(2px, 2px) rotate(0deg); } 100% { -webkit-transform: translate(1px, -2px) rotate(-1deg); } } .shake:hover, .shake:focus { -webkit-animation-name: shake; -webkit-animation-duration: 0.8s; -webkit-transform-origin:50% 50%; -webkit-animation-iteration-count: infinite; -webkit-animation-timing-function: linear; } .shake { display:inline-block; } |
Здесь мы увеличивали каждую строку не на 2%, а на 10%, и немного изменили px и deg. Вставьте этот код в style.css и добавьте к любому элементу на сайте class="shake"
. Появится эффект тряски при наведении курсора на элемент.
Теперь разберемся, что за что отвечает:
transform: translate(2px 1px);
— сдвигаем элемент на 2 пикселя по горизонтали и на 1 пиксель по вертикали;
rotate(1deg);
— поворачиваем элемент на 1 градус;
animation-name: shake;
— название эффекта, который мы добавляем;
animation-duration: 0.8s;
— указываем скорость тряски в секундах или миллисекундах;
transform-origin: 50% 50%;
— изменяем положение элементов при тряске;
animation-iteration-count: infinite;
— делаем эффект тряски бесконечным (только при наведении курсора);
animation-timing-function: linear;
— изменяем скорость перехода анимации.
На этом всё! Пробуйте, экспериментируйте!