Files
xsl-validator/html/script.js
T

276 lines
9.2 KiB
JavaScript
Raw Normal View History

// Smooth Scrolling für Navigation
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
anchor.addEventListener('click', function (e) {
e.preventDefault();
const target = document.querySelector(this.getAttribute('href'));
if (target) {
const navHeight = document.querySelector('.navbar').offsetHeight;
const targetPosition = target.getBoundingClientRect().top + window.pageYOffset - navHeight;
window.scrollTo({
top: targetPosition,
behavior: 'smooth'
});
}
});
});
// Intersection Observer für Fade-In Animationen
const observerOptions = {
threshold: 0.1,
rootMargin: '0px 0px -50px 0px'
};
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
entry.target.classList.add('visible');
}
});
}, observerOptions);
// Füge Fade-In Klassen zu Elementen hinzu
document.addEventListener('DOMContentLoaded', () => {
const animatedElements = document.querySelectorAll(
'.feature-card, .workflow-step, .tech-item, .benefit-item, .download-card'
);
animatedElements.forEach((el, index) => {
el.classList.add('fade-in');
el.style.transitionDelay = `${index * 0.1}s`;
observer.observe(el);
});
});
// Navbar Scroll-Effekt
let lastScroll = 0;
const navbar = document.querySelector('.navbar');
window.addEventListener('scroll', () => {
const currentScroll = window.pageYOffset;
if (currentScroll <= 0) {
navbar.style.boxShadow = 'none';
} else {
navbar.style.boxShadow = '0 2px 10px rgba(0, 0, 0, 0.3)';
}
lastScroll = currentScroll;
});
// Feature-Card Parallax-Effekt
document.querySelectorAll('.feature-card').forEach(card => {
card.addEventListener('mousemove', (e) => {
const rect = card.getBoundingClientRect();
const x = e.clientX - rect.left;
const y = e.clientY - rect.top;
const centerX = rect.width / 2;
const centerY = rect.height / 2;
const deltaX = (x - centerX) / centerX;
const deltaY = (y - centerY) / centerY;
card.style.transform = `perspective(1000px) rotateY(${deltaX * 5}deg) rotateX(${-deltaY * 5}deg) translateY(-5px)`;
});
card.addEventListener('mouseleave', () => {
card.style.transform = 'perspective(1000px) rotateY(0deg) rotateX(0deg) translateY(0)';
});
});
// Download-Button Analytics (Placeholder)
document.querySelectorAll('.btn-download').forEach(button => {
button.addEventListener('click', (e) => {
e.preventDefault();
const platform = e.target.closest('.download-card').querySelector('h3').textContent;
console.log(`Download initiated for: ${platform}`);
// Hier könnte eine echte Download-Logik oder Analytics-Tracking erfolgen
alert(`Download für ${platform} würde hier starten.\nBitte konfigurieren Sie die Download-Links in der index.html.`);
});
});
// Mobile Navigation Toggle (für zukünftige Erweiterung)
const createMobileMenu = () => {
const navMenu = document.querySelector('.nav-menu');
const navbar = document.querySelector('.navbar .container');
// Erstelle Hamburger-Button nur auf mobilen Geräten
if (window.innerWidth <= 768) {
const existingToggle = document.querySelector('.nav-toggle');
if (existingToggle) return;
const toggle = document.createElement('button');
toggle.className = 'nav-toggle';
toggle.innerHTML = '☰';
toggle.style.cssText = `
background: none;
border: none;
color: var(--text-primary);
font-size: 1.5rem;
cursor: pointer;
padding: 0.5rem;
`;
toggle.addEventListener('click', () => {
navMenu.style.display = navMenu.style.display === 'flex' ? 'none' : 'flex';
if (navMenu.style.display === 'flex') {
navMenu.style.cssText = `
display: flex;
flex-direction: column;
position: absolute;
top: 100%;
left: 0;
right: 0;
background: var(--surface);
padding: 1rem;
border-top: 1px solid var(--surface-light);
`;
}
});
navbar.appendChild(toggle);
}
};
// Responsive Handling
window.addEventListener('resize', createMobileMenu);
createMobileMenu();
// Particle Background Animation (optional, dezent)
const createParticles = () => {
const hero = document.querySelector('.hero');
const particlesContainer = document.createElement('div');
particlesContainer.className = 'particles';
particlesContainer.style.cssText = `
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
overflow: hidden;
pointer-events: none;
opacity: 0.3;
`;
for (let i = 0; i < 20; i++) {
const particle = document.createElement('div');
particle.style.cssText = `
position: absolute;
width: 4px;
height: 4px;
background: var(--primary-color);
border-radius: 50%;
left: ${Math.random() * 100}%;
top: ${Math.random() * 100}%;
animation: float-particle ${5 + Math.random() * 10}s infinite ease-in-out;
animation-delay: ${Math.random() * 5}s;
`;
particlesContainer.appendChild(particle);
}
// Füge Animation hinzu
if (!document.querySelector('#particle-animation')) {
const style = document.createElement('style');
style.id = 'particle-animation';
style.textContent = `
@keyframes float-particle {
0%, 100% {
transform: translate(0, 0);
}
25% {
transform: translate(20px, -20px);
}
50% {
transform: translate(-20px, -40px);
}
75% {
transform: translate(20px, -60px);
}
}
`;
document.head.appendChild(style);
}
hero.style.position = 'relative';
hero.insertBefore(particlesContainer, hero.firstChild);
};
// Initialisiere Partikel nur auf Desktop
if (window.innerWidth > 768) {
createParticles();
}
// Counter Animation für Benefits
const animateCounters = () => {
const counters = document.querySelectorAll('.benefit-number');
counters.forEach(counter => {
const target = counter.textContent;
// Prüfe ob es eine Zahl ist
if (!isNaN(parseInt(target))) {
const targetNum = parseInt(target);
const duration = 2000;
const increment = targetNum / (duration / 16);
let current = 0;
const updateCounter = () => {
current += increment;
if (current < targetNum) {
counter.textContent = Math.floor(current) + 'x';
requestAnimationFrame(updateCounter);
} else {
counter.textContent = target;
}
};
// Starte Animation wenn Element sichtbar wird
const counterObserver = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
updateCounter();
counterObserver.unobserve(entry.target);
}
});
});
counterObserver.observe(counter);
}
});
};
animateCounters();
// Easter Egg: Konami Code
let konamiCode = [];
const konamiSequence = ['ArrowUp', 'ArrowUp', 'ArrowDown', 'ArrowDown', 'ArrowLeft', 'ArrowRight', 'ArrowLeft', 'ArrowRight', 'b', 'a'];
document.addEventListener('keydown', (e) => {
konamiCode.push(e.key);
konamiCode = konamiCode.slice(-10);
if (konamiCode.join(',') === konamiSequence.join(',')) {
document.body.style.animation = 'rainbow 2s infinite';
if (!document.querySelector('#rainbow-animation')) {
const style = document.createElement('style');
style.id = 'rainbow-animation';
style.textContent = `
@keyframes rainbow {
0% { filter: hue-rotate(0deg); }
100% { filter: hue-rotate(360deg); }
}
`;
document.head.appendChild(style);
}
setTimeout(() => {
document.body.style.animation = '';
}, 5000);
}
});
console.log('%c🚀 DocuMentor', 'font-size: 24px; font-weight: bold; background: linear-gradient(135deg, #3b82f6 0%, #8b5cf6 100%); -webkit-background-clip: text; color: transparent;');
console.log('%cProfessionelle XSL-Transformations-Verwaltung', 'font-size: 14px; color: #94a3b8;');