Блеск и будь веселым

Экспериментируйте с переменными CSS и Javascript

После посещения CSSconf EU я начал думать о том, что я могу сделать с переменными CSS, чтобы разобраться в них. Почему бы не изменить цвет фона страницы, когда посетитель нажимает клавишу на своей клавиатуре?

Готовим хеш ключей и цветов

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

Я написал небольшой сценарий, чтобы не создавать вручную список пар ключ-значение для всех возможных ключей, и прогнал его по файлу, содержащему мой простой список имен цветов.

Наибольшее число, представляющее клавишу на клавиатуре, равно 255, но есть только 147 именованных цветов, поэтому я просто дважды читаю файл и помещаю все в массив. Ничего страшного, если этот список не на 100% точен.

Я запустил сценарий с терминала и передал результат в новый файл. Затем я просто скопировал получившийся список в виде хеша в свой JS файл.

Изменение цвета фона при нажатии клавиши

Я хотел изменить цвет фона при нажатии любой клавиши на клавиатуре, поэтому назначение фиксированного цвета в CSS не сработало. Введите первую переменную CSS.

Я назначаю DarkSlateBlue по умолчанию, чтобы цвет фона страницы был установлен уже при загрузке. Затем я использую Javascript для обновления значения при нажатии клавиши.

Я вспомнил упражнение с барабанами из одного из первых уроков Курса Javascript30 Уэса Боса и подумал, что могу еще раз взглянуть на этот код.

Это устанавливает значение --bgColor в зависимости от того, какой цвет соответствует коду клавиши внутри хэша цветов.

Как заставить его работать на сенсорных устройствах

На мобильных телефонах не отображается клавиатура, когда мы открываем веб-страницу, поэтому я решил заставить страницу менять цвет на ощупь. И чтобы было интересно также для одного типа событий, я назначаю случайный цвет из моего хеша.

Согласно MDN, мобильное Safari не очень хорошо работает с событиями щелчка по основной части сайта, поэтому я решил обойти это, добавив main раздел. Тогда это должно было принимать щелчки мыши и - скрещенные пальцы - события касания.

Затем я добавил новую функцию для обработки события щелчка.

Сначала я создаю случайное число от 255 до 1, которое затем использую для выбора цвета из хеша и назначаю его переменной CSS для background-color.

Быстрый тест iPhone. Работал. Хороший.

Пока я играл с изменением цвета на сайте, мне казалось, что это довольно скучно и скучно. Давайте добавим блеска!

Добавление частицы

Я начал с добавления одной частицы в DOM, чтобы посмотреть, смогу ли я заставить ее работать. Пока ничего особенного.

И в Javascript:

Сначала я создаю div с классом particle, а затем добавляю его в DOM как дочерний элемент main. Затем я вызываю функцию из onkeydown и onclick.

Пуф. Сайт меняет цвет и отображает частицу.

Добавляем еще больше частиц

Одна частица резать не буду, хочу еще!

Чтобы было интересно, я рандомизирую такие свойства, как размер, размещение и тень.

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

Чтобы создать множество частиц, я добавляю цикл for к исходной функции addSparkles. Я хочу, чтобы количество частиц каждый раз было разным, поэтому я присваиваю случайное число от 19 до 109 (99 выглядело хорошо как множитель, ха) условию разрыва.

Внутри цикла я создаю частицу, как и раньше, но теперь я вызываю свою функцию randomProperties, чтобы присвоить случайные значения переменным CSS внутри класса particle.

… И удаляя их снова

Но теперь все эти искры накапливаются в DOM всякий раз, когда я нажимаю клавишу. Это не совсем то, что я хочу.

Поэтому я должен их удалить.

Сначала я создаю массив всех элементов DOM с классом particle, затем перебираю его и удаляю каждый из них.

В этот момент мне пришлось остановиться и подумать на мгновение, потому что моей первоначальной реакцией было просто удалить массив и покончить с ним. Но массив содержит только ссылки на элементы DOM, которые нужно удалять оттуда по одному. Это происходит внутри цикла for.

Анимация частиц

Теперь у меня есть частицы, но все еще нет блеска. Время для анимации.

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

Чтобы повысить яркость свечения, я использую случайные значения для непрозрачности на уровне 25%, продолжительности анимации, задержки и того, как часто я повторяю анимацию.

Опять же, значения являются результатом проб и ошибок, пока все не станет более или менее правильным. Никаких других причин нет.

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

Готовимся к сцене

Просто показать страницу без упоминания того, что делать, было немного загадочно. Изначально у меня было прописано, какие действия должен предпринять каждый посетитель (фактически, нажать клавишу), но на мобильных устройствах это не сработало. Поэтому я изменил текст для разных точек останова. Но, конечно, это не помогло бы на больших сенсорных экранах, таких как планшеты, поскольку я не знал, как их обнаружить до того, как будет зарегистрировано какое-либо событие.

Введите смайлики.

Со смайлами все лучше. 💖

Ресурсы