104 lines
3.7 KiB
JavaScript
104 lines
3.7 KiB
JavaScript
|
|
const navToggle = document.querySelector('.nav-toggle');
|
||
|
|
const mainNav = document.querySelector('.main-nav');
|
||
|
|
const dropdown = document.querySelector('.nav-dropdown');
|
||
|
|
const dropdownTrigger = document.querySelector('.dropdown-trigger');
|
||
|
|
|
||
|
|
navToggle?.addEventListener('click', () => {
|
||
|
|
const open = mainNav.classList.toggle('open');
|
||
|
|
document.body.classList.toggle('nav-open', open);
|
||
|
|
navToggle.setAttribute('aria-expanded', String(open));
|
||
|
|
});
|
||
|
|
|
||
|
|
dropdownTrigger?.addEventListener('click', () => {
|
||
|
|
const open = dropdown.classList.toggle('open');
|
||
|
|
dropdownTrigger.setAttribute('aria-expanded', String(open));
|
||
|
|
});
|
||
|
|
|
||
|
|
document.querySelectorAll('.flow-tab').forEach((tab, index) => {
|
||
|
|
tab.addEventListener('click', () => {
|
||
|
|
document.querySelectorAll('.flow-tab').forEach(item => item.classList.remove('active'));
|
||
|
|
document.querySelectorAll('.flow-list').forEach(item => item.classList.remove('active'));
|
||
|
|
tab.classList.add('active');
|
||
|
|
document.querySelectorAll('.flow-list')[index]?.classList.add('active');
|
||
|
|
});
|
||
|
|
});
|
||
|
|
|
||
|
|
document.querySelectorAll('.feature-tab').forEach((tab, index) => {
|
||
|
|
tab.setAttribute('role', 'tab');
|
||
|
|
tab.setAttribute('aria-selected', String(tab.classList.contains('active')));
|
||
|
|
tab.addEventListener('click', () => {
|
||
|
|
document.querySelectorAll('.feature-tab').forEach(item => {
|
||
|
|
item.classList.remove('active');
|
||
|
|
item.setAttribute('aria-selected', 'false');
|
||
|
|
});
|
||
|
|
document.querySelectorAll('.feature-detail').forEach(item => item.classList.remove('active'));
|
||
|
|
document.querySelectorAll('.device-state').forEach(item => {
|
||
|
|
item.classList.remove('active');
|
||
|
|
item.setAttribute('aria-hidden', 'true');
|
||
|
|
});
|
||
|
|
tab.classList.add('active');
|
||
|
|
tab.setAttribute('aria-selected', 'true');
|
||
|
|
document.querySelectorAll('.feature-detail')[index]?.classList.add('active');
|
||
|
|
const deviceState = document.querySelectorAll('.device-state')[index];
|
||
|
|
deviceState?.classList.add('active');
|
||
|
|
deviceState?.removeAttribute('aria-hidden');
|
||
|
|
});
|
||
|
|
tab.addEventListener('mouseenter', () => {
|
||
|
|
if (!tab.classList.contains('active')) tab.click();
|
||
|
|
});
|
||
|
|
});
|
||
|
|
|
||
|
|
const observer = new IntersectionObserver(entries => {
|
||
|
|
entries.forEach(entry => {
|
||
|
|
if (entry.isIntersecting) {
|
||
|
|
entry.target.classList.add('visible');
|
||
|
|
observer.unobserve(entry.target);
|
||
|
|
}
|
||
|
|
});
|
||
|
|
}, { threshold: 0.08 });
|
||
|
|
document.querySelectorAll('.reveal').forEach(item => observer.observe(item));
|
||
|
|
|
||
|
|
document.querySelector('.phone-form')?.addEventListener('submit', event => {
|
||
|
|
event.preventDefault();
|
||
|
|
const input = event.currentTarget.querySelector('input');
|
||
|
|
const button = event.currentTarget.querySelector('button');
|
||
|
|
if (!input.value.trim()) {
|
||
|
|
input.focus();
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
button.textContent = '提交成功';
|
||
|
|
button.disabled = true;
|
||
|
|
});
|
||
|
|
|
||
|
|
const qrModal = document.querySelector('#qr-modal');
|
||
|
|
const qrModalClose = qrModal?.querySelector('.qr-modal-close');
|
||
|
|
let qrModalLastFocus = null;
|
||
|
|
|
||
|
|
const openQrModal = event => {
|
||
|
|
event.preventDefault();
|
||
|
|
if (!qrModal) return;
|
||
|
|
qrModalLastFocus = event.currentTarget;
|
||
|
|
qrModal.hidden = false;
|
||
|
|
document.body.classList.add('modal-open');
|
||
|
|
qrModalClose?.focus();
|
||
|
|
};
|
||
|
|
|
||
|
|
const closeQrModal = () => {
|
||
|
|
if (!qrModal || qrModal.hidden) return;
|
||
|
|
qrModal.hidden = true;
|
||
|
|
document.body.classList.remove('modal-open');
|
||
|
|
qrModalLastFocus?.focus();
|
||
|
|
};
|
||
|
|
|
||
|
|
document.querySelectorAll('.qr-trigger').forEach(trigger => {
|
||
|
|
trigger.addEventListener('click', openQrModal);
|
||
|
|
});
|
||
|
|
qrModalClose?.addEventListener('click', closeQrModal);
|
||
|
|
qrModal?.querySelector('[data-modal-close]')?.addEventListener('click', closeQrModal);
|
||
|
|
document.addEventListener('keydown', event => {
|
||
|
|
if (event.key === 'Escape') closeQrModal();
|
||
|
|
});
|
||
|
|
document.querySelectorAll('[data-link-placeholder]').forEach(link => {
|
||
|
|
link.addEventListener('click', event => event.preventDefault());
|
||
|
|
});
|