342 lines
9.3 KiB
CSS
342 lines
9.3 KiB
CSS
/* SVG Animation Package - Dependency-free standalone package
|
|
* Based on svg-animation-particle-circle.css
|
|
* Theme color integration with CSS variables
|
|
*/
|
|
|
|
/* Theme-based color variables for particles */
|
|
:root {
|
|
--particle-color-1: #f40; /* theme-color base */
|
|
--particle-color-2: #f50; /* theme-color +0.1 brightness */
|
|
--particle-color-3: #f60; /* theme-color +0.2 brightness */
|
|
--particle-color-4: #f70; /* theme-color +0.3 brightness */
|
|
--particle-color-5: #f80; /* theme-color +0.4 brightness */
|
|
--explosion-color: #f30; /* theme-color -0.1 brightness */
|
|
--syui-color: #f40; /* main theme color */
|
|
}
|
|
|
|
/* Core SVG button setup */
|
|
.likeButton {
|
|
cursor: pointer;
|
|
display: inline-block;
|
|
}
|
|
|
|
/* Remove debug animation and restore hover functionality */
|
|
|
|
.likeButton .border {
|
|
fill: white;
|
|
}
|
|
|
|
/* Explosion circle - initially hidden */
|
|
.likeButton .explosion {
|
|
transform-origin: center center;
|
|
transform: scale(1);
|
|
stroke: var(--explosion-color);
|
|
fill: none;
|
|
opacity: 0;
|
|
stroke-width: 1;
|
|
}
|
|
|
|
/* Particle layer - initially hidden */
|
|
.likeButton .particleLayer {
|
|
opacity: 0;
|
|
transform: scale(0); /* Ensure particles start hidden */
|
|
}
|
|
|
|
.likeButton .particleLayer circle {
|
|
opacity: 0;
|
|
transform-origin: center center; /* Fixed from 250px 250px */
|
|
transform: scale(0);
|
|
}
|
|
|
|
/* Syui logo - main animation target */
|
|
.likeButton .syui {
|
|
fill: var(--syui-color);
|
|
transform: scale(1);
|
|
transform-origin: center center;
|
|
}
|
|
|
|
/* Hover trigger - replaces jQuery */
|
|
.likeButton:hover .explosion {
|
|
animation: explosionAnime 800ms forwards;
|
|
}
|
|
|
|
.likeButton:hover .particleLayer {
|
|
animation: particleLayerAnime 800ms forwards;
|
|
}
|
|
|
|
.likeButton:hover .syui,
|
|
.likeButton:hover path.syui {
|
|
animation: syuiDeluxeAnime 400ms forwards;
|
|
}
|
|
|
|
/* Individual particle animations */
|
|
.likeButton:hover .particleLayer circle:nth-child(1) {
|
|
animation: particleAnimate1 800ms;
|
|
animation-fill-mode: forwards;
|
|
}
|
|
|
|
.likeButton:hover .particleLayer circle:nth-child(2) {
|
|
animation: particleAnimate2 800ms;
|
|
animation-fill-mode: forwards;
|
|
}
|
|
|
|
.likeButton:hover .particleLayer circle:nth-child(3) {
|
|
animation: particleAnimate3 800ms;
|
|
animation-fill-mode: forwards;
|
|
}
|
|
|
|
.likeButton:hover .particleLayer circle:nth-child(4) {
|
|
animation: particleAnimate4 800ms;
|
|
animation-fill-mode: forwards;
|
|
}
|
|
|
|
.likeButton:hover .particleLayer circle:nth-child(5) {
|
|
animation: particleAnimate5 800ms;
|
|
animation-fill-mode: forwards;
|
|
}
|
|
|
|
.likeButton:hover .particleLayer circle:nth-child(6) {
|
|
animation: particleAnimate6 800ms;
|
|
animation-fill-mode: forwards;
|
|
}
|
|
|
|
.likeButton:hover .particleLayer circle:nth-child(7) {
|
|
animation: particleAnimate7 800ms;
|
|
animation-fill-mode: forwards;
|
|
}
|
|
|
|
.likeButton:hover .particleLayer circle:nth-child(8) {
|
|
animation: particleAnimate8 800ms;
|
|
animation-fill-mode: forwards;
|
|
}
|
|
|
|
.likeButton:hover .particleLayer circle:nth-child(9) {
|
|
animation: particleAnimate9 800ms;
|
|
animation-fill-mode: forwards;
|
|
}
|
|
|
|
.likeButton:hover .particleLayer circle:nth-child(10) {
|
|
animation: particleAnimate10 800ms;
|
|
animation-fill-mode: forwards;
|
|
}
|
|
|
|
.likeButton:hover .particleLayer circle:nth-child(11) {
|
|
animation: particleAnimate11 800ms;
|
|
animation-fill-mode: forwards;
|
|
}
|
|
|
|
.likeButton:hover .particleLayer circle:nth-child(12) {
|
|
animation: particleAnimate12 800ms;
|
|
animation-fill-mode: forwards;
|
|
}
|
|
|
|
.likeButton:hover .particleLayer circle:nth-child(13) {
|
|
animation: particleAnimate13 800ms;
|
|
animation-fill-mode: forwards;
|
|
}
|
|
|
|
.likeButton:hover .particleLayer circle:nth-child(14) {
|
|
animation: particleAnimate14 800ms;
|
|
animation-fill-mode: forwards;
|
|
}
|
|
|
|
/* Keyframe animations */
|
|
@keyframes explosionAnime {
|
|
0% {
|
|
opacity: 0;
|
|
transform: scale(0.01);
|
|
}
|
|
1% {
|
|
opacity: 1;
|
|
transform: scale(0.01);
|
|
}
|
|
5% {
|
|
stroke-width: 200;
|
|
}
|
|
20% {
|
|
stroke-width: 300;
|
|
}
|
|
50% {
|
|
stroke: var(--particle-color-3);
|
|
transform: scale(1.1);
|
|
stroke-width: 1;
|
|
}
|
|
50.1% {
|
|
stroke-width: 0;
|
|
}
|
|
100% {
|
|
stroke: var(--particle-color-3);
|
|
transform: scale(1.1);
|
|
stroke-width: 0;
|
|
}
|
|
}
|
|
|
|
@keyframes particleLayerAnime {
|
|
0% {
|
|
transform: translate(0, 0);
|
|
opacity: 0;
|
|
}
|
|
30% {
|
|
opacity: 0;
|
|
}
|
|
31% {
|
|
opacity: 1;
|
|
}
|
|
60% {
|
|
transform: translate(0, 0);
|
|
}
|
|
70% {
|
|
opacity: 1;
|
|
}
|
|
100% {
|
|
opacity: 0;
|
|
transform: translate(0, -20px);
|
|
}
|
|
}
|
|
|
|
/* Syui Deluxe Animation - Based on 2019 blog post */
|
|
@keyframes syuiDeluxeAnime {
|
|
0% {
|
|
fill: var(--syui-color);
|
|
transform: scale(1) translate(0%, 0%);
|
|
}
|
|
40% {
|
|
fill: color-mix(in srgb, var(--syui-color) 40%, transparent);
|
|
transform: scale(1, 0.9) translate(-9%, 9%);
|
|
}
|
|
50% {
|
|
fill: color-mix(in srgb, var(--syui-color) 70%, transparent);
|
|
transform: scale(1, 0.9) translate(-7%, 7%);
|
|
}
|
|
60% {
|
|
transform: scale(1) translate(-7%, 7%);
|
|
}
|
|
70% {
|
|
transform: scale(1.04) translate(-5%, 5%);
|
|
}
|
|
80% {
|
|
fill: color-mix(in srgb, var(--syui-color) 60%, transparent);
|
|
transform: scale(1.04) translate(-5%, 5%);
|
|
}
|
|
90% {
|
|
fill: var(--particle-color-5); /* 爆発の閃光 */
|
|
transform: scale(1) translate(0%);
|
|
}
|
|
100% {
|
|
fill: var(--syui-color);
|
|
transform: scale(1, 1) translate(0%, 0%);
|
|
}
|
|
}
|
|
|
|
/* Individual particle animations */
|
|
@keyframes particleAnimate1 {
|
|
0% { transform: translate(0, 0); }
|
|
30% { opacity: 1; transform: translate(0, 0); }
|
|
80% { transform: translate(-16px, -59px); }
|
|
90% { transform: translate(-16px, -59px); }
|
|
100% { opacity: 1; transform: translate(-16px, -59px); }
|
|
}
|
|
|
|
@keyframes particleAnimate2 {
|
|
0% { transform: translate(0, 0); }
|
|
30% { opacity: 1; transform: translate(0, 0); }
|
|
80% { transform: translate(41px, 43px); }
|
|
90% { transform: translate(41px, 43px); }
|
|
100% { opacity: 1; transform: translate(41px, 43px); }
|
|
}
|
|
|
|
@keyframes particleAnimate3 {
|
|
0% { transform: translate(0, 0); }
|
|
30% { opacity: 1; transform: translate(0, 0); }
|
|
80% { transform: translate(50px, -48px); }
|
|
90% { transform: translate(50px, -48px); }
|
|
100% { opacity: 1; transform: translate(50px, -48px); }
|
|
}
|
|
|
|
@keyframes particleAnimate4 {
|
|
0% { transform: translate(0, 0); }
|
|
30% { opacity: 1; transform: translate(0, 0); }
|
|
80% { transform: translate(-39px, 36px); }
|
|
90% { transform: translate(-39px, 36px); }
|
|
100% { opacity: 1; transform: translate(-39px, 36px); }
|
|
}
|
|
|
|
@keyframes particleAnimate5 {
|
|
0% { transform: translate(0, 0); }
|
|
30% { opacity: 1; transform: translate(0, 0); }
|
|
80% { transform: translate(-39px, 32px); }
|
|
90% { transform: translate(-39px, 32px); }
|
|
100% { opacity: 1; transform: translate(-39px, 32px); }
|
|
}
|
|
|
|
@keyframes particleAnimate6 {
|
|
0% { transform: translate(0, 0); }
|
|
30% { opacity: 1; transform: translate(0, 0); }
|
|
80% { transform: translate(48px, 6px); }
|
|
90% { transform: translate(48px, 6px); }
|
|
100% { opacity: 1; transform: translate(48px, 6px); }
|
|
}
|
|
|
|
@keyframes particleAnimate7 {
|
|
0% { transform: translate(0, 0); }
|
|
30% { opacity: 1; transform: translate(0, 0); }
|
|
80% { transform: translate(-69px, -36px); }
|
|
90% { transform: translate(-69px, -36px); }
|
|
100% { opacity: 1; transform: translate(-69px, -36px); }
|
|
}
|
|
|
|
@keyframes particleAnimate8 {
|
|
0% { transform: translate(0, 0); }
|
|
30% { opacity: 1; transform: translate(0, 0); }
|
|
80% { transform: translate(-12px, -52px); }
|
|
90% { transform: translate(-12px, -52px); }
|
|
100% { opacity: 1; transform: translate(-12px, -52px); }
|
|
}
|
|
|
|
@keyframes particleAnimate9 {
|
|
0% { transform: translate(0, 0); }
|
|
30% { opacity: 1; transform: translate(0, 0); }
|
|
80% { transform: translate(-43px, -21px); }
|
|
90% { transform: translate(-43px, -21px); }
|
|
100% { opacity: 1; transform: translate(-43px, -21px); }
|
|
}
|
|
|
|
@keyframes particleAnimate10 {
|
|
0% { transform: translate(0, 0); }
|
|
30% { opacity: 1; transform: translate(0, 0); }
|
|
80% { transform: translate(-10px, 47px); }
|
|
90% { transform: translate(-10px, 47px); }
|
|
100% { opacity: 1; transform: translate(-10px, 47px); }
|
|
}
|
|
|
|
@keyframes particleAnimate11 {
|
|
0% { transform: translate(0, 0); }
|
|
30% { opacity: 1; transform: translate(0, 0); }
|
|
80% { transform: translate(66px, -9px); }
|
|
90% { transform: translate(66px, -9px); }
|
|
100% { opacity: 1; transform: translate(66px, -9px); }
|
|
}
|
|
|
|
@keyframes particleAnimate12 {
|
|
0% { transform: translate(0, 0); }
|
|
30% { opacity: 1; transform: translate(0, 0); }
|
|
80% { transform: translate(40px, -45px); }
|
|
90% { transform: translate(40px, -45px); }
|
|
100% { opacity: 1; transform: translate(40px, -45px); }
|
|
}
|
|
|
|
@keyframes particleAnimate13 {
|
|
0% { transform: translate(0, 0); }
|
|
30% { opacity: 1; transform: translate(0, 0); }
|
|
80% { transform: translate(29px, 24px); }
|
|
90% { transform: translate(29px, 24px); }
|
|
100% { opacity: 1; transform: translate(29px, 24px); }
|
|
}
|
|
|
|
@keyframes particleAnimate14 {
|
|
0% { transform: translate(0, 0); }
|
|
30% { opacity: 1; transform: translate(0, 0); }
|
|
80% { transform: translate(-10px, 50px); }
|
|
90% { transform: translate(-10px, 50px); }
|
|
100% { opacity: 1; transform: translate(-10px, 50px); }
|
|
} |