Фонарик к Часу Земли

в 1:16, , рубрики: Песочница, метки: , ,

image

Не так давно прошел Час Земли, призванный стимулировать интерес к проблеме изменения климата, энергетического объединения человечества. К этому дню на сайте Вконтакте появился фонарик, который вызвал подлинный интерес в тематических сообществах. О создании такового пойдет речь в этой статье.

Disclaimer: пост в первую очередь ориентирован на новичков, у которых вспыхнул интерес к этой теме и не претендует на открытие новых земель.

1. HTML-разметка

Тут всё предельно просто: создаем блок, в котором и будет «лежать» наш фонарик, подключаем файлы стилей и js-скрипты.

Код разметки

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Flashlight demo</title>
    <link href="css/main.css" rel="stylesheet">
</head>
<body>
    <div class="flashlight"></div>

    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
    <script src="js/backgroundpos.js"></script> <!-- Про данную библиотеку будет сказано чуть ниже -->
    <script src="js/main.js"></script>
</body>
</html>

2. Создаем фонарик

image
Необходимо задать сам фонарик с помощью radial-gradient, а так же создать затемнение на всей оставшейся странице.

Фонарик

.flashlight {
  pointer-events: none;
  background: radial-gradient(200px 200px, circle contain, rgba(0, 0, 0, 0), rgba(29, 29, 29, 0.96)) center center;
  background: -webkit-radial-gradient(200px 200px, circle contain, rgba(0, 0, 0, 0), rgba(29, 29, 29, 0.96)) center center;
  background: -moz-radial-gradient(200px 200px, circle contain, rgba(0, 0, 0, 0), rgba(29, 29, 29, 0.96)) center center;
  background: -ms-radial-gradient(200px 200px, circle contain, rgba(0, 0, 0, 0), rgba(29, 29, 29, 0.96)) center center;
  background: -o-radial-gradient(200px 200px, circle contain, rgba(0, 0, 0, 0), rgba(29, 29, 29, 0.96)) center center;
}

Затемнение

.background {
  position: fixed;
  top: 0px;
  left: 0px;
  opacity: 0.8;
  background: #000000;
  background: rgba(29, 29, 29, 0.96);
  width: 100%;
  height: 100%;
  z-index: 10;
}

3. Связываем наш градиент с курсором

Для того, чтобы наш фонарик двигался в след за курсором, нам необходимо менять background-position в зависимости от положения курсора.

Для изменения background-position предлагаю подключить отдельную библиотеку, которая находится тут: BackgroundPos Plugin

Привязка к курсору

$(document).ready(function() {

    var flashlight= $('.flashlight');

    var mouseX;
    var mouseY;
    $(document).mousemove( function(e) {
        // put cursor in center of flashlight
        mouseX = e.clientX-200;
        mouseY = e.clientY-200;

        flashlight.stop().animate({backgroundPosition: mouseX+'px ' + mouseY+'px'}, 0);
    });
});

3. Избавляемся от повторов

Фонарик практически завершен, но сейчас возникает

что-то вроде этого

image

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

Теперь наш код выглядит так:
$(document).ready(function() {

    var flashlight = $('.flashlight');

    // делает фонарик более темным
    flashlight.css('opacity', 1);

    // увеличиваем область и удаляем повторы
    flashlight.height($(this).height()+200);
    flashlight.width($( window ).width()+200);

    var mouseX;
    var mouseY;
    $(document).mousemove( function(e) {
        mouseX = e.clientX-200;
        mouseY = e.clientY-200;
        flashlight.stop().animate({backgroundPosition: mouseX+'px ' + mouseY+'px'}, 0);
    });
});

В результате имеем интересный элемент для сайта. Сложно придумать где такое использовать, но наверняка такое решение может прижиться на интерактивном промо-сайте какого-нибудь хоррора.

Демо и исходники доступны тут.

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js