08.09.2017

Анимация на anime.js иконки добавления в избранное

Анимация на anime.js иконки добавления в избранное

Отличный пример анимирования SVG объекта.

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

Анимация работает на anime.js, оригинал статьи:  https://hackernoon.com/how-to-create-a-favorite-animation-with-anime-js-5f9ec02c80dd

<div class="favorite-align">
	<div class="favorite">
		<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100" viewBox="0 0 100 100">
			<defs>
				<mask id="favorite__halo-mask">
					<rect width="100%" height="100%" fill="white"/>
				<circle class="favorite__halo-inner" cx="50" cy="50" r="0" fill="black"></circle>
				</mask>
			</defs>
			<circle class="favorite__halo-outer" cx="50" cy="50" r="48" fill="#feb53c" mask="url(#favorite__halo-mask)"></circle>
			<path class="favorite__inactive" d="M50.214 10.067c6.4.204 10.753 25.648 10.753 25.648s26.256-1.803 27.13 2.857c.874 4.66-20.04 16.642-20.04 16.642s9.537 24.303 5.523 26.817c-4.015 2.515-23.545-14.023-23.545-14.023S29.333 84.493 25.633 81.785c-3.7-2.71 6.657-26.472 6.657-26.472S11.234 43.94 12.383 39.108c1.15-4.832 26.55-3.393 26.55-3.393s4.88-25.853 11.28-25.648z" fill="#dbdedd" fill-rule="evenodd"/>
			<path class="favorite__active" d="M50.214 10.067c6.4.204 10.753 25.648 10.753 25.648s26.256-1.803 27.13 2.857c.874 4.66-20.04 16.642-20.04 16.642s9.537 24.303 5.523 26.817c-4.015 2.515-23.545-14.023-23.545-14.023S29.333 84.493 25.633 81.785c-3.7-2.71 6.657-26.472 6.657-26.472S11.234 43.94 12.383 39.108c1.15-4.832 26.55-3.393 26.55-3.393s4.88-25.853 11.28-25.648z" fill="#feb53c" fill-rule="evenodd"/>
		</svg>
		<div class="favorite__sprinkle"><div class="favorite__sprinkle-circle"></div></div>
		<div class="favorite__sprinkle"><div class="favorite__sprinkle-circle"></div></div>
		<div class="favorite__sprinkle"><div class="favorite__sprinkle-circle"></div></div>
		<div class="favorite__sprinkle"><div class="favorite__sprinkle-circle"></div></div>
		<div class="favorite__sprinkle"><div class="favorite__sprinkle-circle"></div></div>
	</div>
</div>
.favorite-align {
	text-align: center;
}
.favorite {
	position: relative;
	transform: scale(1);
	display: inline-block;
	transform-origin: 50% 0%;
}

.favorite__inactive {
	transform-origin: 50% 50%;
}

.favorite__active {
	transform-origin: 50% 50%;
	transform: scale(0);
	opacity: 1;
}

.favorite__halo-outer {
	transform-origin: 50% 50%;
	transform: scale(0);
}

.favorite__sprinkle {
	position: absolute;
	top: 50px;
	left: 52px;
	transform: rotate(36deg);
}

.favorite__sprinkle:nth-child(2) {
	transform: rotate(108deg);
}

.favorite__sprinkle:nth-child(3) {
	transform: rotate(180deg);
}

.favorite__sprinkle:nth-child(4) {
	transform: rotate(252deg);
}

.favorite__sprinkle:nth-child(5) {
	transform: rotate(324deg);
}

.favorite__sprinkle-circle {
	position: absolute;
	content: '';
	background: #F98247;
	border-radius: 50%;
	width: 5px;
	height: 5px;
	margin-top: -28px;
}
var timeline = anime.timeline({ autoplay: true, direction: 'normal', loop: true });

timeline
.add({
	targets: '.favorite__inactive',
	scale: {
		value: [1, 0],
		duration: 400,
		delay: 1000,
		easing: 'easeInQuad'
	}
})
.add({
	targets: '.favorite__halo-outer',
	scale: {
		value: [0, 1],
		duration: 400,
		delay: 1400,
		easing: 'easeOutQuad'
	},
	offset: 0
})
.add({
	targets: '.favorite__halo-inner',
	r: {
		value: [0, 49],
		duration: 300,
		delay: 1500,
		easing: 'easeOutQuad'
	},
	offset: 0
})
.add({
	targets: '.favorite__active',
	scale: {
		value: [0, 1],
		duration: 500,
		delay: 1600,
		easing: 'easeOutQuad'
	},
	opacity: {
		value: 1,
		duration: 1500,
		delay: 2500
	},
	offset: 0
})
.add({
	targets: '.favorite__sprinkle',
	opacity: {
		value: [0, 1],
		duration: 150,
		delay: 1500
	},
	offset: 0
})
.add({
	targets: '.favorite__sprinkle-circle',
	height: {
		value: [5, 12],
		duration: 100,
		delay: 1600,
		easing: 'easeOutQuad'
	},
	offset: 0
})
.add({
	targets: '.favorite__sprinkle-circle',
	height: {
		value: [12, 5],
		duration: 100,
		delay: 1700,
		easing: 'easeOutQuad'
	},
	offset: 0
})
.add({
	targets: '.favorite__sprinkle-circle',
	opacity: {
		value: [1, 0],
		duration: 500,
		delay: 1800,
		easing: 'easeOutQuad'
	},
	offset: 0
})
.add({
	targets: '.favorite__sprinkle-circle',
	translateY: {
		value: [0, -28],
		duration: 500,
		delay: 1600,
		easing: 'easeOutQuad'
	},
	offset: 0
});

Демонстрация

Нам будет приятно

Поделитесь

Комментарии

Загрузка комментариев...