Java, UX, HTML, CSS, WEB-design

Представляем меню навигации Jelly: когда Canvas встречается с PaperJS

[ad_1]

  • Олег Соломка

  • 0 Комментарии

Представляем меню навигации Jelly: когда Canvas встречается с PaperJS

  • 7 минут чтения

  • Кодирование, CSS, JavaScript, HTML

Краткое резюме ↬

В этой статье я хотел бы поделиться своим опытом и историей о том, как я воплотил в жизнь «Jelly Navigation Menu».

Нет сомнений в том, что Интернет помогает дизайнерам и разработчикам находить лучшее вдохновение и ресурсы для своих проектов. Несмотря на то, что в Интернете доступно множество различных руководств и советов, я чувствую, что техники холста HTML5 не хватает больше всего. Хорошие новости: у меня был шанс заполнить этот большой пробел. В этой статье я хотел бы поделиться своим опытом и историей о том, как я воплотил в жизнь «Jelly Navigation Menu». Кредиты принадлежат Capptivate.co и иконкам Эшли Бреннан — они были моим вдохновением для этого проекта.

Прежде чем мы начнем

Исходный код для этого проекта изначально был написан на CoffeeScript — я считаю, что это лучший способ выразить и поделиться кодом JavaScript таким образом. Я буду ссылаться на исходный код CoffeScript в разделах кода в этом посте, и вы также заметите ссылки на CodePen, которые были переписаны на JavaScript и также представляют собой локальные части кода. Я рекомендую загрузить исходный код на GitHub, чтобы вы могли легко следовать за мной, пока я подробно объясняю необходимый код.

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

Еще после прыжка! Продолжить чтение ниже ↓


Предварительный просмотр меню навигации Jelly.

Первый шаг: изменение формы сечения

Наша первая цель — изменить форму раздела меню, манипулируя кривыми. Каждый объект состоит из опорных точек. Эти точки соединены друг с другом кривыми. Таким образом, каждая точка имеет маркеры «In» и «Out», чтобы определить местоположение и направление определенных кривых. Люди, которые работают с векторными редакторами, должны чувствовать себя комфортно на этом шаге.


В Paper.js пути представлены последовательностью сегментов, соединенных кривыми. Сегмент состоит из точки и двух маркеров, определяющих положение и направление кривых. Посмотрите на ручки в действии.

Все, что нам нужно сделать, это изменить handleOut положение top-left и bottom-right точки. Для этого я написал простые так называемые функции «toppie» и «bottie»:


toppie:(amount)->
  @base.segments[1].handleOut.y = amount
  @base.segments[1].handleOut.x = (@wh/2)

bottie:(amount)-> @base.segments[3].handleOut.y = amount @base.segments[3].handleOut.x = - @wh/2

@wh/2 is section center.

@base variable holds section’s rectangle path.

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

Второй шаг: расчет скорости прокрутки

Итак, следующее, что нужно сделать, это рассчитать скорость и направление прокрутки, а затем передать эти данные в bottie и toppie функции. Мы можем прослушать событие прокрутки контейнера и определить текущую позицию прокрутки (в моем случае «контейнер» — это #wrapper элемент, тогда как в примерах пера это объект окна).


# get current scroll value
window.PaperSections.next = window.PaperSections.$container.scrollTop()

# and calculate the difference with previous scroll position
window.PaperSections.scrollSpeed = (window.PaperSections.next - window.PaperSections.prev)

# to make it all work, all we have left to do is to save current scroll position to prev variable
window.PaperSections.prev = window.PaperSections.next

Это повторяется для каждого события прокрутки. В этом фрагменте кода window.PaperSections просто глобальная переменная. Я также сделал несколько незначительных дополнений в своей реализации:

  • Глупый коэффициент для увеличения скорости прокрутки путем умножения на 1.2 (просто поигрался с ним),
  • Я нарезал результат скорости прокрутки по максимуму, чтобы он не превышал sectionHeight/2,
  • Я также добавил коэффициент направления (это может быть 1 или -1вы можете изменить его в dat.gui в правом верхнем углу страницы). Таким образом, вы можете контролировать направление реакции секций.

Вот окончательный код:


if window.PaperSections.i % 4 is 0
  direction = if window.PaperSections.invertScroll then -1 else 1
  window.PaperSections.next = window.PaperSections.$container.scrollTop()
  window.PaperSections.scrollSpeed = direction*window.PaperSections.slice 1.2*(window.PaperSections.next - window.PaperSections.prev), window.PaperSections.data.sectionheight/2
  window.PaperSections.prev = window.PaperSections.next
  window.PaperSections.i++

В этом примере if window.PaperSections.i % 4 is 0 помогает нам реагировать на каждое четвертое событие прокрутки — аналогично фильтру. Эта функция живет в window.PaperSections.scrollControl.

Вот и все! Мы почти закончили! Это не может быть проще, верно? Попробуйте прокрутку здесь.

Шаг третий: сделайте желе!

На этом последнем шаге нам нужно анимировать toppie и bottie функции для 0 с эластичным замедлением TweenJS каждый раз, когда прокрутка останавливается.

3.1 Определите, когда прокрутка останавливается

Для этого добавим setTimeout функция для нашего window.PaperSections.scrollControl функция (или scroll) с задержкой 50 мс. Каждый раз, когда запускается событие прокрутки, тайм-аут сбрасывается, кроме последнего, т.е. когда прокрутка останавливается, код в нашем тайм-ауте будет выполняться.


clearTimeout window.PaperSections.timeOut
window.PaperSections.timeOut = setTimeout ->
  window.PaperSections.$container.trigger ‘stopScroll’
  window.PaperSections.i = 0
  window.PaperSections.prev = window.PaperSections.$container.scrollTop()
    , 50

Основное внимание здесь уделяется window.PaperSections.$container.trigger stopScroll событие. Мы можем подписаться на него и соответствующим образом запустить анимацию. Две другие строки кода просто используются для сброса вспомогательных переменных на более поздний срок. scrollSpeed расчеты.

3.2 Ручка Animate PointOut To «0»

Далее мы напишем translatePointY чтобы оживить нашу желейную анимацию. Эта функция примет объект в качестве параметра со следующими наборами ключ-значение:


{
  // point to move (our handleOut point)
  point: @base.segments[1].handleOut,

// destination point to: 0, duration }

Тело функции состоит из следующих элементов:


translatePointY:(o)->
  # create new tween(from point position) to (options.to position, with duration)
  mTW = new TWEEN.Tween(new Point(o.point)).to(new Point(o.to), o.duration)

# set easing to Elastic Out mTW.easing TWEEN.Easing.Elastic.Out

# on each update set point’s Y to current animation point mTW.onUpdate -> o.point.y = @y

# finally start the tween mTW.start()

То TWEEN.update() Функция также должна быть добавлена ​​к каждому кадру цикла анимации PaperJS:


onFrame = ->
  TWEEN.update()

Также нам нужно остановить все анимации при прокрутке. Я добавил следующую строку в функцию прослушивателя прокрутки:

TWEEN.removeAll()

Наконец, нам нужно подписаться на stopScroll событие и запустить анимацию, позвонив в наш translatePointY функция:


window.PaperSections.$container.on ‘stopScroll’, =>
  # calculate animation duration
  duration = window.PaperSections.slice(Math.abs(window.PaperSections.scrollSpeed*25), 1400) or 3000

# launch animation for top left point @translatePointY( point: @base.segments[1].handleOut to: 0 duration: duration ).then => # clear scroll speed variable after animation has finished # without it section will jump a little when new scroll event fires window.PaperSections.scrollSpeed = 0

# launch animation for bottom right point @translatePointY point: @base.segments[3].handleOut to: 0 duration: duration

И вуаля!

Примечание: В моем исходном коде translatePointY я добавил отложенный объект для цепочки, опциональное смягчение и функцию onUpdate. Здесь он опущен для простоты.

В заключении

И последнее, но не менее важное: необходимо добавить класс для разделов. Конечно, вы можете создать столько экземпляров, сколько захотите; вам просто нужно определить начальное смещение Y и цвета. Кроме того, вам нужно будет убедиться, что раздел в вашем макете имеет ту же высоту, что и раздел на холсте. Тогда мы можем просто применить translated3d обоим на scroll событие и анимация. Это приведет к тому, что разделы HTML будут двигаться правильно, как и разделы холста, и, следовательно, создаст реалистичную анимацию.

HTML-разделы

Причина, по которой нам нужно использовать translate3d вместо translateY заключается в том, чтобы убедиться, что механизмы рендеринга Webkit используют аппаратное ускорение при их рендеринге, поэтому мы не выпадаем из бюджета анимации 60 кадров в секунду. Но держите ухо востро, если ваши разделы содержат какой-либо текст. 3D-преобразования сбрасывают сглаживание с субпикселя на оттенки серого, поэтому изображение может выглядеть немного размытым!

Обратная связь

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

(вф) (иль)



[ad_2]
Source: https://smashingmagazine.com

Заключение

Вы ознакомились с статьей — Представляем меню навигации Jelly: когда Canvas встречается с PaperJS

Пожалуйста оцените статью, и напишите комментарий.

Похожие статьи

Добавить комментарий

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

Краткое описание по статье Представляем меню навигации Jelly: когда Canvas встречается с PaperJS

Название: Представляем меню навигации Jelly: когда Canvas встречается с PaperJS . Краткое описание: [ad_1] ⭐ Олег Со . Дата публикации: 12.02.2022 . Автор: Алишер Валеев .

Для чего создан сайт Novosti-Nedeli.ru

Данный сайт посвящен новостям мира и мира технологий . Также тут вы найдете руководства по различным девайсам.

Сколько лет сайту?

Возраст составляет 3 года

Кнопка «Наверх»