Dobrovoi Master
сделано с душой
В состоянии постоянного подключения...

Эффект пульсации при клике с помощью CSS3 и jQuery

Материальный дизайн (Material Design) от компании Google, в котором анимации не просто оживляют интерфейс, но и представляют пользователю, что происходит. Завораживающие идеи о трехмерном пространстве не оставили равнодушными большую часть сообщества веб-разработчиков и дизайнеров всех мастей.
Фрейморки использующие принципы материального дизайна выходят в свет один за одним и используются не только для унификации интерфейсов приложений ОС Андроид, но для разработки элементов интерфейса веб-сайтов.
Многие фичи из состава материального дизайна можно очень даже просто воспроизвести у себя на сайте и без подключения фреймворков. Что я сегодня вам и продемонстрирую, на примере реализации эффекта пульсации (), или если хотите, эффекта расходящихся кругов на воде(ряби), при клике на любой части страницы.
 
Эффект пульсации при клике

Для этого нам понадобится: заблаговременно подключенная библиотека javascript jQuery, небольшой плагин для запуска эффекта и немного магии -анимации.

Начнём с рассмотрения кода CSS, сформируем стили и настроим анимацию @keyframes.

CSS

Для тега <html> обозначим высоту документа в 100%.

html {
  height:100%;
}

Далее сформируем стили самого эффекта. Краткие комментарии к коду, помогут быстрее разобраться что к чему:

.ripple {
  position: relative;
  overflow: hidden;
  -webkit-transform: translate(0);
}
/* параметры визуального элемента эффекта */
.effekt {
  display: block;
  position: absolute;
  pointer-events: none;
/* абсолютно круглый */
  border-radius: 50%;
/* Увеличение или уменьшение размера элемента */
  transform: scale(0);
/* располагаем выше других объектов веб-страницы */
  z-index:9999;
/* цвет фона элемента */
  background: rgba(52, 152, 219,.7);
/* не прозрачный */
  opacity: 1;
}
/* имя, длительность и изменение скорости анимации */
.effekt.replay {
  -webkit-animation: ripple 2s cubic-bezier(0.165, 0.85, 0.45, 1);
  -o-animation: ripple 2s cubic-bezier(0.165, 0.85, 0.45, 1);
  animation: ripple 2s cubic-bezier(0.165, 0.85, 0.45, 1);
}

Теперь подготовим анимацию для разных браузеров используя префиксы, имя анимации, как мы помним ripple:

@keyframes ripple {
  100% {
    opacity: 0;
    -webkit-transform: scale(2);
    -ms-transform: scale(2);
    -o-transform: scale(2);
    transform: scale(2);
  }
}
@-webkit-keyframes ripple {
  100% {
    opacity: 0;
    -webkit-transform: scale(2);
    -ms-transform: scale(2);
    -o-transform: scale(2);
    transform: scale(2);
  }
}
@-moz-keyframes ripple {
  100% {
    opacity: 0;
    -webkit-transform: scale(2);
    -ms-transform: scale(2);
    -o-transform: scale(2);
    transform: scale(2);
  }
}
@-ms-keyframes ripple {
  100% {
    opacity: 0;
    -webkit-transform: scale(2);
    -ms-transform: scale(2);
    -o-transform: scale(2);
    transform: scale(2);
  }
}
@-o-keyframes ripple {
  100% {
    opacity: 0;
    -webkit-transform: scale(2);
    -ms-transform: scale(2);
    -o-transform: scale(2);
    transform: scale(2);
  }
}

На стороне CSS мы всё подготовили, остаётся подключить библиотеку jQuery к документу, если вы ещё этого не сделали. В примере, подключил библиотеку напрямую из Google CDN, перед закрывающим тегом

достаточно разместить следующую строку:

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>

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

Регулировать диаметр расходящегося круга, вы можете изменяя значения height: d/5, width: d/5. Только следует помнить, что уменьшая значения вы увеличиваете диаметр круга, а увеличивая, наоборот уменьшаете. Вот такая круговерть))). Привычнее указывать равнозначные величины в пикселях, например height: 150 и width: 150, что собственно вы можете и делать. Больше в плагине, особо настраивать и нечего.

<script type="text/javascript">
    // Объект для которого будет применён эффект
$("html").click(function(e){
        var ripple = $(this);
    // визуальный элемент эффекта
        if(ripple.find(".effekt").length == 0) {
                ripple.append("<span class='effekt'></span>");
        }
        var efekt = ripple.find(".effekt");
        efekt.removeClass("replay");
        if(!efekt.height() && !efekt.width())
        {
                var d = Math.max(ripple.outerWidth(), ripple.outerHeight());
                efekt.css({height: d/5, width: d/5});// Определяем размеры элемента эффекта 
        }
        var x = e.pageX - ripple.offset().left - efekt.width()/2;
        var y = e.pageY - ripple.offset().top - efekt.height()/2;
        efekt.css({
                top: y+'px',
                left:x+'px'
        }).addClass("replay");
})
</script>

Если всё сделаете правильно, получите в своё распоряжение ещё одну замечательную дизайнерскую фишку. Такой эффект, вы можете применять к любым блочным элементам вашего сайта, для этого достаточно его указать в исполняемом js. Например, вы хотите применить ripple-эффект к div-контейнеру с содержанием статей, который имеет класс content допустим. В jQuery плагине определяете функцию именно для этого элемента. Тогда, если применительно к нашему примеру, $("html") заменяете на $("div.content"), первая строка в коде плагина будет выглядеть так:

$("div.content").click(function(e)

Кнопки и другие активные элементы работают с эффектом по тому же принципу.

Ещё раз посмотрите живой пример работы плагина и при желании, смело забирайте исходники.

С Уважением, Андрей .

Буду всем признателен, если поддержите проект — добавив блог в исключения AdBlock и поделитесь ссылкой на запись в своих соц-сетях:

Всего комментариев: 2

  • Виталий: 8 декабря, 2016 в 23:16

    Здравствуйте!
    Не подскажите, попробовал применить этот эффект к меню сайта — прописываю $(«$NMENU_1$»).click (function (e), а в ответ тишина.
    Проверял просто на работоспособность у себя, прописывая Html — работает, а с меню не хочет. Или надо не $NMENU_1$ вставлять, а что-то другое?

    Ответить
    • driver: 8 декабря, 2016 в 23:45

      У вашего меню наверняка есть class или id вот что либо из этого и прописывайте,
      $(".class").click(function(e)
      $("#id").click(function(e)
      а если вы используете тег <menu>, то просто пишете
      $("menu").click(function(e)
      В принципе в конце статьи всё расписано, как применять эффект к другим элементам страницы

      Ответить

Оставить комментарий

Ваш email не будет опубликован.

Вы можете использовать следующие HTML тэги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>