Fix #19: Remove jQuery dependency, replace with vanilla JS #21
@@ -13,7 +13,6 @@ module.exports = [
|
|||||||
sourceType: "script",
|
sourceType: "script",
|
||||||
globals: {
|
globals: {
|
||||||
...globals.browser,
|
...globals.browser,
|
||||||
...globals.jquery,
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
plugins: {
|
plugins: {
|
||||||
|
|||||||
@@ -182,7 +182,6 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<link rel="stylesheet" href="fonts/fonts.css" />
|
<link rel="stylesheet" href="fonts/fonts.css" />
|
||||||
<script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
|
|
||||||
<link rel="stylesheet" href="css/haus-schleusingen.css" />
|
<link rel="stylesheet" href="css/haus-schleusingen.css" />
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
|||||||
@@ -1,77 +1,144 @@
|
|||||||
$(function () {
|
document.addEventListener("DOMContentLoaded", function () {
|
||||||
// Navbar scroll
|
// Navbar scroll
|
||||||
$(window).on("scroll", function () {
|
var navbar = document.getElementById("navbar");
|
||||||
if ($(this).scrollTop() > 60) $("#navbar").addClass("scrolled");
|
window.addEventListener("scroll", function () {
|
||||||
else $("#navbar").removeClass("scrolled");
|
if (window.scrollY > 60) navbar.classList.add("scrolled");
|
||||||
|
else navbar.classList.remove("scrolled");
|
||||||
});
|
});
|
||||||
|
|
||||||
// Hero animation on load
|
// Hero animation on load
|
||||||
setTimeout(function () {
|
setTimeout(function () {
|
||||||
$("#heroContent").addClass("visible");
|
document.getElementById("heroContent").classList.add("visible");
|
||||||
$("#heroBg").addClass("loaded");
|
document.getElementById("heroBg").classList.add("loaded");
|
||||||
}, 200);
|
}, 200);
|
||||||
|
|
||||||
// Scroll animations
|
// Scroll animations via IntersectionObserver
|
||||||
function checkVisible() {
|
var animElements = document.querySelectorAll(".fact, [data-animate]");
|
||||||
$(".fact, [data-animate]").each(function () {
|
animElements.forEach(function (el) {
|
||||||
var el = $(this);
|
el.style.opacity = "0";
|
||||||
var top = el.offset().top;
|
el.style.transform = "translateY(30px)";
|
||||||
var windowBottom = $(window).scrollTop() + $(window).height();
|
el.style.transition = "opacity 0.8s ease, transform 0.8s ease";
|
||||||
if (windowBottom > top + 60) {
|
});
|
||||||
el.addClass("visible");
|
|
||||||
el.css({ opacity: 1, transform: "translateY(0)" });
|
if ("IntersectionObserver" in window) {
|
||||||
|
var observer = new IntersectionObserver(
|
||||||
|
function (entries) {
|
||||||
|
entries.forEach(function (entry) {
|
||||||
|
if (entry.isIntersecting) {
|
||||||
|
entry.target.classList.add("visible");
|
||||||
|
entry.target.style.opacity = "1";
|
||||||
|
entry.target.style.transform = "translateY(0)";
|
||||||
|
observer.unobserve(entry.target);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
},
|
||||||
$("[data-animate]").css({
|
{ rootMargin: "0px 0px -60px 0px" }
|
||||||
opacity: 0,
|
);
|
||||||
transform: "translateY(30px)",
|
animElements.forEach(function (el) {
|
||||||
transition: "opacity 0.8s ease, transform 0.8s ease",
|
observer.observe(el);
|
||||||
});
|
});
|
||||||
$(window).on("scroll", checkVisible);
|
} else {
|
||||||
checkVisible();
|
// Fallback: show all immediately
|
||||||
|
animElements.forEach(function (el) {
|
||||||
|
el.classList.add("visible");
|
||||||
|
el.style.opacity = "1";
|
||||||
|
el.style.transform = "translateY(0)";
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
// Floor accordion
|
// Floor accordion
|
||||||
$(".floor-header").on("click", function () {
|
document.querySelectorAll(".floor-header").forEach(function (header) {
|
||||||
var item = $(this).closest(".floor-item");
|
header.addEventListener("click", function () {
|
||||||
var isOpen = item.hasClass("open");
|
var item = this.closest(".floor-item");
|
||||||
$(".floor-item").removeClass("open");
|
var isOpen = item.classList.contains("open");
|
||||||
$(".floor-body").slideUp(300);
|
var allItems = document.querySelectorAll(".floor-item");
|
||||||
|
|
||||||
|
// Close all
|
||||||
|
allItems.forEach(function (fi) {
|
||||||
|
fi.classList.remove("open");
|
||||||
|
var body = fi.querySelector(".floor-body");
|
||||||
|
if (body) body.style.display = "none";
|
||||||
|
});
|
||||||
|
|
||||||
|
// Open clicked if it was closed
|
||||||
if (!isOpen) {
|
if (!isOpen) {
|
||||||
item.addClass("open");
|
item.classList.add("open");
|
||||||
item.find(".floor-body").slideDown(300);
|
var body = item.querySelector(".floor-body");
|
||||||
|
if (body) body.style.display = "block";
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
});
|
||||||
|
|
||||||
// Lightbox – gallery grid items
|
// Lightbox – gallery grid items
|
||||||
$(document).on("click", ".grid-item", function () {
|
document.querySelectorAll(".grid-item").forEach(function (item) {
|
||||||
var src = $(this).data("img") || $(this).find("img").attr("src");
|
item.addEventListener("click", function () {
|
||||||
$("#lightboxImg").attr("src", src);
|
var src = this.dataset.img || this.querySelector("img").getAttribute("src");
|
||||||
$("#lightbox").addClass("open");
|
openLightbox(src);
|
||||||
$("body").css("overflow", "hidden");
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
// Lightbox – floor plan images in Raumaufteilung
|
// Lightbox – floor plan images in Raumaufteilung
|
||||||
$(document).on("click", ".floor-plan img[data-img]", function () {
|
document.querySelectorAll(".floor-plan img[data-img]").forEach(function (img) {
|
||||||
var src = $(this).data("img");
|
img.addEventListener("click", function () {
|
||||||
$("#lightboxImg").attr("src", src);
|
openLightbox(this.dataset.img);
|
||||||
$("#lightbox").addClass("open");
|
|
||||||
$("body").css("overflow", "hidden");
|
|
||||||
});
|
});
|
||||||
$("#lightboxClose, #lightbox").on("click", function (e) {
|
|
||||||
if (e.target === this) {
|
|
||||||
$("#lightbox").removeClass("open");
|
|
||||||
$("body").css("overflow", "");
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
$(document).on("keydown", function (e) {
|
|
||||||
if (e.key === "Escape") {
|
function openLightbox(src) {
|
||||||
$("#lightbox").removeClass("open");
|
document.getElementById("lightboxImg").setAttribute("src", src);
|
||||||
$("body").css("overflow", "");
|
document.getElementById("lightbox").classList.add("open");
|
||||||
|
document.body.style.overflow = "hidden";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function closeLightbox() {
|
||||||
|
document.getElementById("lightbox").classList.remove("open");
|
||||||
|
document.body.style.overflow = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
document.getElementById("lightboxClose").addEventListener("click", closeLightbox);
|
||||||
|
document.getElementById("lightbox").addEventListener("click", function (e) {
|
||||||
|
if (e.target === this) closeLightbox();
|
||||||
|
});
|
||||||
|
document.addEventListener("keydown", function (e) {
|
||||||
|
if (e.key === "Escape") closeLightbox();
|
||||||
});
|
});
|
||||||
|
|
||||||
// Form submit is handled server-side by PHP – no JS intervention needed.
|
// Form submit is handled server-side by PHP – no JS intervention needed.
|
||||||
|
// Form submit – opens email client with pre-filled mailto: link
|
||||||
|
document.getElementById("contactForm").addEventListener("submit", function (e) {
|
||||||
|
e.preventDefault();
|
||||||
|
|
||||||
|
var fname = document.getElementById("fname").value.trim();
|
||||||
|
var lname = document.getElementById("lname").value.trim();
|
||||||
|
var email = document.getElementById("email").value.trim();
|
||||||
|
var phone = document.getElementById("phone").value.trim();
|
||||||
|
var interest = document.getElementById("interest").value;
|
||||||
|
var message = document.getElementById("message").value.trim();
|
||||||
|
|
||||||
|
var subject = "Kontaktanfrage: " + interest;
|
||||||
|
var body = "Von: " + fname + " " + lname + "\n";
|
||||||
|
body += "E-Mail: " + email + "\n";
|
||||||
|
if (phone) body += "Telefon: " + phone + "\n";
|
||||||
|
body += "Anliegen: " + interest + "\n\n";
|
||||||
|
body += message;
|
||||||
|
|
||||||
|
var mailto =
|
||||||
|
"mailto:mki@kies-media.de" +
|
||||||
|
"?subject=" + encodeURIComponent(subject) +
|
||||||
|
"&body=" + encodeURIComponent(body);
|
||||||
|
|
||||||
|
window.location.href = mailto;
|
||||||
|
|
||||||
|
// Show success message
|
||||||
|
this.style.display = "none";
|
||||||
|
var success = document.getElementById("formSuccess");
|
||||||
|
success.style.display = "block";
|
||||||
|
success.style.opacity = "0";
|
||||||
|
success.style.transition = "opacity 0.4s ease";
|
||||||
|
requestAnimationFrame(function () {
|
||||||
|
success.style.opacity = "1";
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
// Mobile hamburger menu (vanilla JS)
|
// Mobile hamburger menu (vanilla JS)
|
||||||
|
|||||||
9
js/masonry.pkgd.min.js
vendored
9
js/masonry.pkgd.min.js
vendored
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user