Можно ли выполнить эту последовательность в HTML5?

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

Я программист, но моя сильная сторона в PHP, JavaScript, традиционном HTML и т. д. ... У меня еще не было возможности поиграться с HTML5.

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

Библиотека KineticJS выглядит многообещающе и для этого типа анимации, но я оставлю рекомендации вам, дорогие ребята.

Во всяком случае, вот пример, который я хочу воспроизвести:

введите здесь описание изображения


person hannebaumsaway    schedule 24.02.2014    source источник
comment
Это можно сделать с помощью Canvas или SVG, но это сам по себе проект. Объем этого вопроса слишком широк для StackOverflow.   -  person Diodeus - James MacFarlane    schedule 24.02.2014
comment
@Diodeus Спасибо. И я понимаю, что это широко; но, как я уже сказал, я не ожидаю, что кто-то на самом деле предложит решение. Кажется, что KineticJS может делать все, что вы там видите, а именно вращение и масштабирование. Единственный знак вопроса для меня по целесообразности - это таймер в центре.   -  person hannebaumsaway    schedule 24.02.2014
comment
В целом вопросы о рекомендациях библиотек закрыты, потому что они быстро устаревают и вызывают сильное самоуверенность. Вы можете добиться большего успеха в конкретных вопросах реализации, если у вас есть код за поясом. Удачи. Это звучит как отличный маленький проект.   -  person Diodeus - James MacFarlane    schedule 24.02.2014


Ответы (2)


Я не буду давать какие-либо рекомендации по библиотекам по тем же причинам, на которые указывает @Diodeus, но, возможно, я могу помочь вам в процессе выбора. То, что вы пытаетесь сделать, прямо сейчас можно сделать в браузере несколькими способами: анимация Canvas, SVG и/или CSS3.

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

Элемент canvas лучше подходит для попиксельного управления вашим визуальным контентом на странице. Добавление контента в canvas не увеличивает DOM (как в случае с SVG), поэтому обычно он работает лучше, но вы теряете такие вещи, как встроенные обработчики событий и анимацию, которые вам в конечном итоге придется заново реализовывать самостоятельно.

Подробнее о выборе между SVG и Canvas и пример анимации SVG< /а>

Когда у вас есть компоненты на странице, их необходимо подключить и анимировать. Анимацию можно разделить на:

  1. Масштабирование
  2. Выцветание фона
  3. Вращение
  4. "Странный таймер круговой диаграммы градиента" пример с CSS3

Это можно сделать с помощью анимации CSS, анимации SVG или простого старого JavaScript. Выбор зависит от того, что вы будете анимировать. Если бы я выбирал библиотеку, я бы хотел найти ту, которая пытается использовать более новые методы (SVG/CSS3), когда это возможно, и изящно деградирует, когда не может.

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

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

person hert    schedule 24.02.2014
comment
Спасибо, что написали! Хотя, к сведению, я не думаю, что есть что-то странное в моем таймере градиентной диаграммы. ;) - person hannebaumsaway; 25.02.2014
comment
Ха-ха, верно :) Это лучшее, что я мог придумать для общего термина, чтобы описать этот тип анимации. Вроде четкий проект! Было бы неплохо увидеть реализацию, когда вы закончите. Удачи - person hert; 26.02.2014
comment
Является ли SVG жизнеспособным вариантом, если лопасти вентилятора являются изображениями (а не нарисованными фигурами или путями)? Я новичок в SVG. - person hannebaumsaway; 26.02.2014
comment
Да, вы можете использовать изображения вместе с другими элементами SVG. Хорошая часть этого заключается в том, что все компоненты будут в одной системе координат, и вы можете использовать те же операции преобразования/анимации, которые вы используете для своих элементов, не являющихся изображениями. (w3.org/TR/SVG/struct.html#ImageElement ) - person hert; 26.02.2014
comment
Это было бы действительно круто. И если мои изображения векторные (они сделаны в Illustrator), я могу сохранить их как файлы .svg, и они будут масштабироваться как векторы в браузере, да? - person hannebaumsaway; 26.02.2014
comment
Это правильно! Кстати, я только что наткнулся на эту статью об экспорте .svg для Интернета, которая может показаться вам интересной: adobe.com/inspire/2013/09/exporting-svg-illustrator.html - person hert; 26.02.2014

Конечно, это не так уж и сложно, если разбить его на части.

Вот некоторые технологии и приемы, с которых можно начать.

Вы используете Canvas для (1) отображения некоторых рисунков, (2) стирания, (3) отображения некоторых новых рисунков.

Когда вы делаете эту перерисовку быстро, вы получаете анимированные эффекты, как показано на вашем изображении.

Html Canvas использует context для рисования (думайте об этом как о ручке для холста)

  • рисование пути: context.beginPath + context.moveTo + context.lineTo определяет путь, который создает полигоны ваших «лопастей вентилятора». Вы можете использовать context.fillStyle для заполнения полигонов вашими цветами.

  • fading: context.globalAlpha изменит непрозрачность новых рисунков.

  • вращение: context.translate(centerX,centerY) + context.rotate(radianAngle) будет поворачивать новые рисунки (например, ваши вращающиеся многоугольники, ваши деления и т. д.)

  • масштабирование: context.translate(centerX,centerY) + context.scale(scaleX,scaleY) будет масштабировать ваши полигоны.

  • дуги: context.arc(centerX,centerY,radius,beginningAngle,endingAngle) нарисует дугу с указанной центральной точкой и протянется от начального угла к конечному углу.

  • math: circleCircumferenceX = centerX+radius*Math.cos(radianAngle) circleCircumferenceY = centerY+radius*Math.sin(radianAngle) использует тригонометрию для вычисления координаты xy на окружности окружности. Вы можете комбинировать этот триггер + Math.random, чтобы поместить свои «крапинки» по дуге вокруг вашей центральной точки.

person markE    schedule 24.02.2014
comment
Спасибо, Марк! На самом деле, для элементов лопасти вентилятора, делений и кругов внутри и снаружи синего бегунка я подумал, что могу просто использовать готовые изображения (PNG), масштабировать и поворачивать их соответствующим образом, чтобы мне не пришлось рисовать новые. формы. Мысли? - person hannebaumsaway; 25.02.2014
comment
Круги и галочки будут легко масштабироваться/вращаться. Если ваш gif был создан путем масштабирования изображения лезвия, вы также можете масштабировать/поворачивать лезвия. Визуально кажется, что часть лезвий, соединяющая тень, масштабируется иначе, чем прямоугольная часть лезвий, но я мог видеть это неправильно. Прямоугольная часть лопастей могла быть чешуей. Часть лезвий, соединяющая тень, может нуждаться в простом контуре и заливке. - person markE; 25.02.2014
comment
На самом деле прямоугольник и глубина/тень лезвия представляют собой одно изображение, поэтому масштабируется одинаково. Это оптическая иллюзия глубины, потому что теневая часть заканчивается конечной точкой в ​​самом центре всего изображения, и меня бесило, что опорная точка, когда я выполнял масштабирование, поэтому масштабируется наружу от центра изображения, а не центр своего слоя. Так что буквально все, что вы видите, это масштабирование верхнего левого лезвия, тиканье центрального синего круга, некоторая прозрачность и, очевидно, вращение лезвий. - person hannebaumsaway; 25.02.2014
comment
Обман лезвия! Да, тогда вы могли бы масштабировать/вращать изображения. Холст вращается и масштабируется вокруг фиксированной точки — вот почему перед вращением и масштабированием используется context.translate. - person markE; 25.02.2014
comment
Я бы не хотел вращать весь холст, не так ли? Так как не все элементы вращаются... - person hannebaumsaway; 25.02.2014
comment
Правильно - не поворачивайте каждый элемент на холсте. Вы можете повернуть только элемент, (1) сохранив состояние контекста без поворота (2) перевести + повернуть (3) нарисовать элемент, который вам нужно повернуть (4) восстановить контекст в его состояние без поворота. Для сохранения/восстановления контекста вы можете использовать context.save() и context.restore(). По иронии судьбы переводите и вращайте работу, переводя (перемещая) и вращая весь холст — отсюда и необходимость в context.save() и context.restore(). - person markE; 25.02.2014
comment
давайте продолжим это обсуждение в чате - person hannebaumsaway; 25.02.2014