Lots of fancy animations

- Tilt
- Parallax
- Animated Text
This commit is contained in:
Martin Prokoph
2025-01-04 19:14:05 +01:00
parent bee4d10f44
commit 7a0f88ee98
8 changed files with 104 additions and 12 deletions

23
package-lock.json generated
View File

@@ -10,7 +10,10 @@
"dependencies": { "dependencies": {
"@astrojs/alpinejs": "^0.4.1", "@astrojs/alpinejs": "^0.4.1",
"@types/alpinejs": "^3.13.10", "@types/alpinejs": "^3.13.10",
"alpinejs": "^3.14.1" "@types/rellax": "^1.7.7",
"alpinejs": "^3.14.1",
"rellax": "^1.12.1",
"vanilla-tilt": "^1.8.1"
}, },
"devDependencies": { "devDependencies": {
"@astrojs/mdx": "^4.0.3", "@astrojs/mdx": "^4.0.3",
@@ -2384,6 +2387,12 @@
"undici-types": "~5.26.4" "undici-types": "~5.26.4"
} }
}, },
"node_modules/@types/rellax": {
"version": "1.7.7",
"resolved": "https://registry.npmjs.org/@types/rellax/-/rellax-1.7.7.tgz",
"integrity": "sha512-I/gX5eNLEh7J7CkC10EbJnleOKqza47Zt7znVefU8M2+CvtD1L5TVNesFwC9HTzDhe4Rw8+82ykzJyf5R13UTw==",
"license": "MIT"
},
"node_modules/@types/tar": { "node_modules/@types/tar": {
"version": "6.1.13", "version": "6.1.13",
"resolved": "https://registry.npmjs.org/@types/tar/-/tar-6.1.13.tgz", "resolved": "https://registry.npmjs.org/@types/tar/-/tar-6.1.13.tgz",
@@ -10721,6 +10730,12 @@
"node": ">= 0.10" "node": ">= 0.10"
} }
}, },
"node_modules/rellax": {
"version": "1.12.1",
"resolved": "https://registry.npmjs.org/rellax/-/rellax-1.12.1.tgz",
"integrity": "sha512-XBIi0CDpW5FLTujYjYBn1CIbK2CJL6TsAg/w409KghP2LucjjzBjsujXDAjyBLWgsfupfUcL5WzdnIPcGfK7XA==",
"license": "MIT"
},
"node_modules/remark-gfm": { "node_modules/remark-gfm": {
"version": "4.0.0", "version": "4.0.0",
"resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.0.tgz", "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.0.tgz",
@@ -12549,6 +12564,12 @@
"dev": true, "dev": true,
"license": "MIT" "license": "MIT"
}, },
"node_modules/vanilla-tilt": {
"version": "1.8.1",
"resolved": "https://registry.npmjs.org/vanilla-tilt/-/vanilla-tilt-1.8.1.tgz",
"integrity": "sha512-hPB1XUsnh+SIeVSW2beb5RnuFxz4ZNgxjGD78o52F49gS4xaoLeEMh9qrQnJrnEn/vjjBI7IlxrrXmz4tGV0Kw==",
"license": "MIT"
},
"node_modules/vfile": { "node_modules/vfile": {
"version": "6.0.3", "version": "6.0.3",
"resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz",

View File

@@ -37,6 +37,9 @@
"dependencies": { "dependencies": {
"@astrojs/alpinejs": "^0.4.1", "@astrojs/alpinejs": "^0.4.1",
"@types/alpinejs": "^3.13.10", "@types/alpinejs": "^3.13.10",
"alpinejs": "^3.14.1" "@types/rellax": "^1.7.7",
"alpinejs": "^3.14.1",
"rellax": "^1.12.1",
"vanilla-tilt": "^1.8.1"
} }
} }

View File

@@ -3,7 +3,7 @@ const { text, url_gh, url_mr, url_cf, url_wiki = "", mod = "default" } = Astro.p
import { Icon } from 'astro-icon/components' import { Icon } from 'astro-icon/components'
--- ---
<div class="container"> <div class="container rellax" data-rellax-speed="-1.5">
<div class={"call-to-action mt-24 mb-32 flex flex-col items-center gap-12 rounded-xl p-12 md:p-24 " + mod}> <div class={"call-to-action mt-24 mb-32 flex flex-col items-center gap-12 rounded-xl p-12 md:p-24 " + mod}>
<h2 class="text-center text-3xl md:text-5xl">{text}</h2> <h2 class="text-center text-3xl md:text-5xl">{text}</h2>
<div class="flex flex-col gap-3 min-[800px]:flex-row"> <div class="flex flex-col gap-3 min-[800px]:flex-row">

View File

@@ -7,11 +7,11 @@ const { imgSrc, reverseImg = false } = Astro.props
<section class="my-32"> <section class="my-32">
<div class="container"> <div class="container">
<div class="grid grid-cols-1 gap-24 md:grid-cols-2"> <div class="grid grid-cols-1 gap-24 md:grid-cols-2">
{!reverseImg ? <Media class="rounded-lg" src={imgSrc} /> : ''} {!reverseImg ? <Media class="rounded-lg rellax -z-10" data-rellax-desktop-speed="-1" data-rellax-speed="-0.5" src={imgSrc} /> : ''}
<div class="space-content flex flex-col justify-center"> <div class="space-content flex flex-col justify-center">
<slot /> <slot />
</div> </div>
{reverseImg ? <Media class="rounded-lg" src={imgSrc} /> : ''} {reverseImg ? <Media class="rounded-lg rellax -z-10" data-rellax-desktop-speed="1" data-rellax-speed="0.5" src={imgSrc} /> : ''}
</div> </div>
</div> </div>
</section> </section>

View File

@@ -4,7 +4,8 @@ import { SkipLinks } from 'accessible-astro-components'
import { Icon } from 'astro-icon/components' import { Icon } from 'astro-icon/components'
--- ---
<header class="sticky top-0 z-50 backdrop-blur-md"> <div class="mb-24"></div>
<header class="fixed w-full top-0 z-50 backdrop-blur-md">
<SkipLinks /> <SkipLinks />
<Navigation> <Navigation>
<li class="menu-item"> <li class="menu-item">

View File

@@ -7,9 +7,11 @@ const { src = '/motschensummer-cutout.png' } = Astro.props
<section class="hero my-12"> <section class="hero my-12">
<div class="container"> <div class="container">
<div class="grid grid-cols-1 items-center gap-24 lg:grid-cols-2"> <div class="grid grid-cols-1 items-center gap-24 lg:grid-cols-2">
<div class="flex flex-col items-center gap-8 md:items-start"> <div class="flex flex-col items-center gap-8 md:items-start rellax -z-10" data-rellax-desktop-speed="-5" data-rellax-speed="-4">
<h1 class="text-center text-6xl md:text-left lg:text-8xl"> <h1 class="text-center text-6xl md:text-left lg:text-8xl">
<slot><span class="text-gradient drop-shadow-xl">Modding</span> done with passion</slot> <slot>
<span id="modding-text" class="text-gradient">Modding</span>
<p>done with passion</p></slot>
</h1> </h1>
<div class="flex flex-col gap-3 min-[500px]:flex-row"> <div class="flex flex-col gap-3 min-[500px]:flex-row">
<a class="button has-icon" href="https://github.com/Motschen"> <a class="button has-icon" href="https://github.com/Motschen">
@@ -23,11 +25,64 @@ const { src = '/motschensummer-cutout.png' } = Astro.props
</a> </a>
</div> </div>
</div> </div>
<img class="hidden lg:block" src={src} alt="" decoding="async" /> <div class="rellax -z-10" data-rellax-speed="-7">
<img class="hidden lg:block" src={src} alt="" decoding="async" data-tilt data-tilt-full-page-listening />
</div>
</div> </div>
</div> </div>
</section> </section>
<script>
import VanillaTilt from 'vanilla-tilt'
function initTilt() {
VanillaTilt.init(document.querySelectorAll('[data-tilt]'), {
max: 25,
speed: 400,
})
}
function replaceModdingText() {
const moddingText = document.getElementById('modding-text');
let textIndex = 0;
function textLoop() {
if (!moddingText || !moddingText.textContent) return;
const texts = ['Community', 'Design', 'Coding', 'Modding'];
replaceText(texts[textIndex]);
textIndex = (textIndex + 1) % texts.length;
}
function replaceText(replacementText) {
if (!moddingText || !moddingText.textContent) return;
const delay = 90;
moddingText.textContent += "|";
let lastTimeout = (moddingText.textContent.length - 1) * delay;
for (let i = 0; i < moddingText.textContent.length; i++) {
setTimeout(() => {
moddingText.textContent = moddingText.textContent.slice(0, -2)+'|';
}, i*delay);
}
for (let i = 0; i < replacementText.length+2; i++) {
setTimeout(() => {
moddingText.textContent = replacementText.substring(0, i);
if (i < replacementText.length+1) moddingText.textContent += '|';
}, lastTimeout + i*delay);
}
}
if (moddingText) setInterval(textLoop, 5000);
}
initTilt();
replaceModdingText();
document.addEventListener('astro:after-swap', () => {
initTilt();
replaceModdingText();
})
</script>
<style> <style>
.text-gradient { .text-gradient {
background: linear-gradient(315deg, var(--secondary-300) 25%, var(--primary-300)); background: linear-gradient(315deg, var(--secondary-300) 25%, var(--primary-300));

View File

@@ -48,7 +48,6 @@ import { Icon } from 'astro-icon/components'
const buttons = this.querySelectorAll('.right-half'); const buttons = this.querySelectorAll('.right-half');
buttons.forEach((button) => { buttons.forEach((button) => {
console.log(button);
dragElement(button); dragElement(button);
}); });

View File

@@ -70,7 +70,6 @@ const {
// sticky footer on low content pages // sticky footer on low content pages
html, html,
body { body {
height: 100%;
overflow-x: hidden; overflow-x: hidden;
} }
@@ -110,3 +109,17 @@ const {
</style> </style>
</body> </body>
</html> </html>
<script>
import Rellax from 'rellax';
function initRellax() {
var rellax = new Rellax('.rellax', {
center: true
});
}
initRellax();
document.addEventListener('astro:after-swap', () => {
initRellax();
})
</script>