181 lines
4.9 KiB
JavaScript
181 lines
4.9 KiB
JavaScript
// Pride and Prejudice - Interactive Features
|
|
|
|
document.addEventListener("DOMContentLoaded", () => {
|
|
// Navigation scroll effect
|
|
initNavigation();
|
|
|
|
// Quotes slider
|
|
initQuotesSlider();
|
|
|
|
// Scroll reveal animations
|
|
initScrollReveal();
|
|
|
|
// Smooth scroll for anchor links
|
|
initSmoothScroll();
|
|
});
|
|
|
|
// ============================================
|
|
// NAVIGATION SCROLL EFFECT
|
|
// ============================================
|
|
function initNavigation() {
|
|
const nav = document.querySelector(".nav");
|
|
let lastScroll = 0;
|
|
|
|
window.addEventListener("scroll", () => {
|
|
const currentScroll = window.pageYOffset;
|
|
|
|
// Add/remove scrolled class
|
|
if (currentScroll > 100) {
|
|
nav.classList.add("scrolled");
|
|
} else {
|
|
nav.classList.remove("scrolled");
|
|
}
|
|
|
|
lastScroll = currentScroll;
|
|
});
|
|
}
|
|
|
|
// ============================================
|
|
// QUOTES SLIDER
|
|
// ============================================
|
|
function initQuotesSlider() {
|
|
const quotes = document.querySelectorAll(".quote-card");
|
|
const dots = document.querySelectorAll(".quote-dot");
|
|
let currentIndex = 0;
|
|
let autoSlideInterval;
|
|
|
|
function showQuote(index) {
|
|
// Remove active class from all quotes and dots
|
|
quotes.forEach((quote) => quote.classList.remove("active"));
|
|
dots.forEach((dot) => dot.classList.remove("active"));
|
|
|
|
// Add active class to current quote and dot
|
|
quotes[index].classList.add("active");
|
|
dots[index].classList.add("active");
|
|
|
|
currentIndex = index;
|
|
}
|
|
|
|
function nextQuote() {
|
|
const nextIndex = (currentIndex + 1) % quotes.length;
|
|
showQuote(nextIndex);
|
|
}
|
|
|
|
// Dot click handlers
|
|
dots.forEach((dot, index) => {
|
|
dot.addEventListener("click", () => {
|
|
showQuote(index);
|
|
resetAutoSlide();
|
|
});
|
|
});
|
|
|
|
// Auto-slide functionality
|
|
function startAutoSlide() {
|
|
autoSlideInterval = setInterval(nextQuote, 6000);
|
|
}
|
|
|
|
function resetAutoSlide() {
|
|
clearInterval(autoSlideInterval);
|
|
startAutoSlide();
|
|
}
|
|
|
|
// Start auto-slide
|
|
startAutoSlide();
|
|
|
|
// Pause on hover
|
|
const slider = document.querySelector(".quotes-slider");
|
|
slider.addEventListener("mouseenter", () => clearInterval(autoSlideInterval));
|
|
slider.addEventListener("mouseleave", startAutoSlide);
|
|
}
|
|
|
|
// ============================================
|
|
// SCROLL REVEAL ANIMATIONS
|
|
// ============================================
|
|
function initScrollReveal() {
|
|
const revealElements = document.querySelectorAll(
|
|
".about-content, .character-card, .theme-item, .section-header",
|
|
);
|
|
|
|
const revealOptions = {
|
|
threshold: 0.15,
|
|
rootMargin: "0px 0px -50px 0px",
|
|
};
|
|
|
|
const revealObserver = new IntersectionObserver((entries) => {
|
|
entries.forEach((entry, index) => {
|
|
if (entry.isIntersecting) {
|
|
// Add staggered delay for grid items
|
|
const delay =
|
|
entry.target.classList.contains("character-card") ||
|
|
entry.target.classList.contains("theme-item")
|
|
? index * 100
|
|
: 0;
|
|
|
|
setTimeout(() => {
|
|
entry.target.classList.add("reveal");
|
|
entry.target.style.opacity = "1";
|
|
entry.target.style.transform = "translateY(0)";
|
|
}, delay);
|
|
|
|
revealObserver.unobserve(entry.target);
|
|
}
|
|
});
|
|
}, revealOptions);
|
|
|
|
revealElements.forEach((el) => {
|
|
el.style.opacity = "0";
|
|
el.style.transform = "translateY(30px)";
|
|
el.style.transition =
|
|
"opacity 0.8s cubic-bezier(0.16, 1, 0.3, 1), transform 0.8s cubic-bezier(0.16, 1, 0.3, 1)";
|
|
revealObserver.observe(el);
|
|
});
|
|
}
|
|
|
|
// ============================================
|
|
// SMOOTH SCROLL FOR ANCHOR LINKS
|
|
// ============================================
|
|
function initSmoothScroll() {
|
|
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(".nav").offsetHeight;
|
|
const targetPosition =
|
|
target.getBoundingClientRect().top + window.pageYOffset - navHeight;
|
|
|
|
window.scrollTo({
|
|
top: targetPosition,
|
|
behavior: "smooth",
|
|
});
|
|
}
|
|
});
|
|
});
|
|
}
|
|
|
|
// ============================================
|
|
// PARALLAX EFFECT FOR HERO
|
|
// ============================================
|
|
window.addEventListener("scroll", () => {
|
|
const scrolled = window.pageYOffset;
|
|
const heroPattern = document.querySelector(".hero-pattern");
|
|
|
|
if (heroPattern && scrolled < window.innerHeight) {
|
|
heroPattern.style.transform = `translateY(${scrolled * 0.3}px) rotate(${scrolled * 0.02}deg)`;
|
|
}
|
|
});
|
|
|
|
// ============================================
|
|
// CHARACTER CARD HOVER EFFECT
|
|
// ============================================
|
|
document.querySelectorAll(".character-card").forEach((card) => {
|
|
card.addEventListener("mouseenter", function () {
|
|
this.style.zIndex = "10";
|
|
});
|
|
|
|
card.addEventListener("mouseleave", function () {
|
|
this.style.zIndex = "1";
|
|
});
|
|
});
|