- Анимация css3 движение звездочки по эллипсу svg
- Ответы (2 шт):
- Настройки и несколько совмещенных анимаций
- How to Move an Element in a Circular Path with CSS
- Demo #1 — Moving Along a Circe by 120 Degrees from the Starting Point
- Demo #2 — Moving Along a Circle by 120 Degrees Each Time
- How Circular Motion is Achieved
- Step 1 : CSS of the Parent Element
- Step 2 : CSS of the Child Element
- Step 3 : Showing the Animation
- Using Web Animations API
- Анимации элементов по дугам, окружностям и эллипсам с использованием CSS
- Окружности
- Дуги
- Эллипсы
- Анимация путей по окружности с помощью CSS3
- Дайте мне CSS!
- Moving along a curved path in CSS with layered animation
- The problem
Анимация css3 движение звездочки по эллипсу svg
Подскажите пожалуйста, как сделать вращение звёздочки по синему кругу?
.svg__hidden < display: none; >.ellipse < width: 550px; height: 160px; border-radius: 50%; top: 500px; left: 0; right: 0; bottom: 0; margin: auto; position: absolute; border: 2px #e5007e solid; transform-style: preserve-3d; >.ellipse svg < width: 27px; height: 27px; top: 160px; left: -140px; right: 0; bottom: 0; margin: auto; position: absolute; animation: move linear infinite; >.ellipse:nth-child(1) < transform: rotateZ(20deg); >.ellipse:nth-child(2) < transform: rotateZ(30deg); border: 2px #006ab4 solid; z-index: 1; >.ellipse:nth-child(2) svg < transform: rotateZ(-30deg); animation-duration: 20s; >@keyframes move < from < transform: rotateZ(0deg) translateX(180px) rotateZ(0deg) rotateY(-30deg); >to < transform: rotateZ(360deg) translateX(180px) rotateZ(-360deg) rotateY(-30deg); >>
Ответы (2 шт):
При движении элемента по заданной траектории лучше вместо трансформаций CC3, использовать анимацию SVG: animateMotion
При этом варианте вам не нужно будет мучаться, подбирая многочисленные параметры и трансформации CSS.
Достаточно создать path траектории движения и объект будет четко двигаться по назначенному в теге пути.
Если вам нужна будет какая-то другая траектория, то не возникнет никаких проблем, достаточно будет указать эту траекторию.
Прочтите пожалуйста комментарии в коде:
Если нужно запустить звезду по другому эллипсу, достаточно вместо
указать id другого эллипса
Настройка размера звезды и её положения относительно эллипса
Приложение будет адаптивно и кроссбраузерным в современных браузерах, включая Edge MS/
Настройки и несколько совмещенных анимаций
Если не смещать объект, то при animateMotion он будет двигаться по трассе соединяясь с ней верхним левым углом.
Поднимаем звезду вверх, теперь она касается траектории нижним углом
Добавляем к анимации движения, анимацию вращения звезды, чтобы согласовать две анимации друг с другом необходимо добавить additive=»sum»
Две звездочки бегут по одной трассе, но они разного размера и имеют разные скорости
How to Move an Element in a Circular Path with CSS
Moving an element along a circular path is an interesting problem to solve using CSS. It can be achieved by animating the CSS transform property.
Demo #1 — Moving Along a Circe by 120 Degrees from the Starting Point
Demo #2 — Moving Along a Circle by 120 Degrees Each Time
This is similar to Demo #1, except that the sum of rotation angles is saved. On each click, the element moves from X degrees to X+120 degrees.
How Circular Motion is Achieved
The element which is to be rotated must have a parent element. To rotate the child by 60 degrees, first rotate the parent by 60 degrees. At the same time, rotate the child by minus(-) 60 degrees. The child must be rotated by an equal opposite angle so that it does look inverted when the animation is completed.
You can animate using CSS transition, CSS animation or the new Web Animations API.
Step 1 : CSS of the Parent Element
The child is going to have absolute position, so the parent must have relative position (or absolute position). Give equal height and width, and make its border-radius as 50% so that it becomes circular in shape. Add the initial value of transform property. Also add transition property for animating the transform property.
Step 2 : CSS of the Child Element
The child is absolutely positioned. Place the child at an appropriate starting position, in this case at the top center of the parent.
Add transform and transition properties.
In this example case, the child contains an image.
Step 3 : Showing the Animation
Assume that you have a button, which on clicked is supposed to move the child by 120 degrees. In the event handler, rotate the parent by 120 degrees and rotate the child by -120 degrees.
$("#button").on('click', function() < $("#parent").css(< transform: 'rotate(120deg)' >); $("#child").css(< transform: 'rotate(-120deg)' >); >);
This is how the circular motion in Demo #1 is achieved.
In Demo #2, the total angle moved is saved in a variable. Upon click, rotation happens from the old angle to the newly incremented angle.
var _CURRENT_ANGLE = 0; $("#button").on('click', function() < _CURRENT_ANGLE += 120; $("#parent-2").css(< transform: 'rotate(' + _CURRENT_ANGLE + 'deg)' >); $("#child-2").css(< transform: 'rotate(-' + _CURRENT_ANGLE + 'deg)' >); >);
Using Web Animations API
The animation can also be done with the new Web Animations API, except that the syntax is a little different and the performance of the animation will be better.
Of course you don’t need to add transition property here to perform the animation. In this case animate method will perform the animation.
Using Web Animations API, the code would be like :
$("#button").on('click', function() < $("#parent").get(0).animate([ < transform: 'rotate(0deg)' >, < transform: 'rotate(120deg)' >, ], < duration: 700, easing: 'linear', iterations: 1, fill: 'forwards' >); $("#child").get(0).animate([ < transform: 'rotate(0deg)' >, < transform: 'rotate(-120deg)' >, ], < duration: 700, easing: 'linear', iterations: 1, fill: 'forwards' >); >);
Note that Web Animations API is available only in the latest versions of Chrome & Opera.
Анимации элементов по дугам, окружностям и эллипсам с использованием CSS
Веб-анимация наиболее часто создается с использованием двух положений: начального и конечного состояний или расположений A и B. Движение элементов по дугам, эллипсам и окружностям используется реже, но об этом тоже важно знать.
Окружности
Окружности — наиболее простой вариант. Самое важное, от чего зависит все остальное, — задать значения свойства начала трансформации элемента. Здесь и далее весь код CSS приведен для ясности без приставок производителей, которые уже и не нужны для большинства современных версий браузеров:
div#redball width: 50px; height: 50px; border-radius: 50%; background: red; transform-origin: 200% center; >
Начальная точка для каждой трансформации будет располагаться в 200px правее элемента:
Элемент HTML со смещенным началом трансформации
Это означает, что вращение элемента будет происходить вокруг точки смещения начала трансформации:
@keyframes circle to transform: rotate(1turn); > > div#redball animation: circle 2s infinite; >
Также важно изменить значение по умолчанию временной характеристики перехода: если Вам нужно, чтобы движение было бесконечным прямолинейным, используйте следующие значения:
div#redball animation: circle 2s infinite linear; >
Это создаст бесшовную анимации движения по кругу.
Lea Verou предложила другой хороший способ анимирования движения элементов по кругу.
Дуги
Линейная анимация, примененная к движению по дуге, обычно будет выглядеть искусственно и неуместно. Для создания движения маятника, как в уроке о гипнотизирующей анимации логотипа, нужно применить значение временной характеристики перехода ease-in-out, при котором анимация начнется медленно, немного ускорится и закончится тоже медленно, а также ограничить область вращения:
@keyframes sway to transform: rotate(30deg); > > #watch transform-origin: center top; transform: rotate(-30deg); animation: sway 2.2s infinite alternate ease-in-out; >
Такой тип анимации часто используется для показа чего-то : урок «веер из фотографий с иcпользованием CSS» — это хороший пример такого применения.
Эллипсы
Самая сложная форма движения — наиболее характерное для нашей вселенной движение по эллипсу. Наиболее простой известный нам способ создать это движение — разделить анимированное движение на слои: двигать элемент вверх и вниз половину фазы, когда он двигается по кругу. Чтобы добиться этого, элемент вкладывается в контейнер:
И каждый элемент анимируется отдельно:
@keyframes circle to transform: rotate(1turn); > > @keyframes updown to transform: translateY(200px); > > figure animation: updown 1s infinite ease-in-out alternate; > div#redball width: 100px; height: 50px; border-radius: 50%; background: red; transform-origin: center 300%; animation: circle 2s infinite linear; >
Движение вверх-вниз продляет круговую анимацию в эллипс, усиливая вертикальное или горизонтальное движение, определяя основные оси эллипса. Значение временной характеристики перехода ease-in-out используется, чтобы сделать движение плавным, так как иначе получится движение по закругленному ромбу, Направление анимации alternate проигрывает ключевые кадры вперед, затем назад и так по кругу и используется для того, чтобы вертикальное движение повторялось вперед-назад плавно. Обратите внимание на то, что анимация вверх-вниз происходит половину времени, в отличие от анимации по кругу.
И результат выглядит следующим образом:
Автор урока Dudley Storey
Анимация путей по окружности с помощью CSS3
От автора: Долгое время я предполагал, что нельзя применять CSS Transitions или анимацию для передвижения объектов DOM каким-либо другим образом, кроме движения по прямой. Конечно, разработчик мог бы применить множество ключевых кадров для создания списка прямых путей и симулировать кривую, но не думал, что можно определить кривую с помощью всего двух ключевых кадров или простого CSS transition. Я ошибался.
Вышеприведенный пример анимирован с помощью всего двух ключевых кадров анимации CSS3! Хотя вы могли применить для этого jQuery.animate() или requestAnimationFrame, лучше взять CSS3 вместо JavaScript’а — полученная анимация всегда гарантированно будет глаже (особенно на мобильных устройствах) плюс может сэкономить энергию батареи. В данной статье приведен рецепт CSS выполнения этого трюка во всех браузерах с включенной анимацией CSS3 с тщательным описанием примененной математики, а также альтернативный вариант для старых версий IE, не поддерживающих анимацию CSS3.
Дайте мне CSS!
Единственная причина, почему CSS здесь такой длинный – повторение кода префикса для браузеров:
Онлайн курс по JavaScript
Научитесь создавать приложения со сложными интерфейсами
Это основной язык для современной веб-разработки — почти 100% сайтов работает на JavaScript. Освойте его с нуля всего за 4 месяца, и вы сможете зарабатывать от 70 000 рублей.
Moving along a curved path in CSS with layered animation
CSS animations and transitions are great for animating something from point A to B. That is, if you want to animate along a straight path. No matter how much you bend your bezier curves, you can’t make something move along a curved path by applying an animation or a transition to an object. You can overshoot with custom timing functions, and produce spring-like effects, but the relative movement along the X and Y-axis will always be identical.
Instead of turning to JavaScript for producing more natural-looking motion, there’s an easy way to work around this limitation: layered animation. By using two or more objects to drive an animation, we get fine-grained control over an object’s path, and can apply one timing function for the movement along the X-axis, and another one for the Y-axis.
The problem
Before we dive into the solution, let’s look closer at the problem. CSS animations and transitions restrict us to animating along straight paths. How? By always taking the shortest path from point A to point B. That’s great—this is what we’re after in most cases—but we lack a way of telling CSS to “take a nicer path” rather than “take the shortest path”.
The most straightforward way of animating between two points in CSS (with hardware acceleration) is to use transform to translate an object over time. This produces movement along a linear path. In this @keyframes block, we’re going back and forth between (0,0) and (100,-100), as seen in the example above:
@keyframes straightLine 50% transform: translate3D(100px, -100px, 0); > > .dot animation: straightLine 2.5s infinite linear; >
This isn’t complicated, but let’s stop here for a moment. To understand the solution to the problem we need to, at least visually, take the animation apart.
At 0% we start out at (0,0), and at 50% we use translate3D(100px, -100px, 0) to move to (100,-100), then back again. Put another way, we move the object 100px to the right, and 100px upwards, and these two translations combined move the object at an angle.