<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<title>Stacked Scroll Accordion + Popups</title>
<style>
/* Подключаем TT Hoves Trial Semibold */
@font-face {
font-family: 'TT Hoves Trial';
src: local('TT Hoves Trial Semibold');
font-weight: 600;
font-style: normal;
}
:root {
--accent-color: #F44336;
--text-color: #111;
--border-color: #37373c;
--bg-color: #fff;
--header-bg: #37373c;
--hover-bg: #f5f5f5;
}
*, *::before, *::after {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
overflow-x: hidden;
font-family: 'TT Hoves Trial', sans-serif;
font-weight: 600;
background: #EDEDED;
}
/* ====== Аккордеон ====== */
.accordion-wrapper {
position: sticky;
top: 0;
width: 100vw;
height: 100vh;
overflow: hidden;
background: var(--bg-color);
}
.accordion-header {
height: 25vh;
background: var(--header-bg);
display: flex;
align-items: center;
padding-left: 5vw;
}
.accordion-header h2 {
color: #fff;
font-size: 3em;
letter-spacing: .5em;
white-space: nowrap;
}
.accordion-container {
position: absolute;
top: 25vh;
left: 0;
width: 125vw;
height: 65vh;
}
.accordion-card {
position: absolute;
top: 0;
width: 30vw;
height: 100%;
background: var(--bg-color);
border-left: 1px solid var(--border-color);
border-bottom: 1px solid var(--border-color);
display: flex;
flex-direction: column;
padding: 2rem;
padding-bottom: calc(2rem + 5vh);
transition: background .2s;
cursor: pointer;
}
.accordion-card:hover { background: var(--hover-bg); }
.card-1 { left: 0; }
.card-2 { left: 30vw; }
.card-3 { left: 60vw; }
.card-4 { left: 80vw; }
.card-5 { left: 85vw; }
.card-6 { left: 90vw; }
.card-7 {
left: 95vw;
width: 70vw;
}
.card-title {
color: var(--accent-color);
font-size: 3em;
line-height: 1.1;
margin-bottom: 1rem;
}
.card-footer {
display: flex;
flex-direction: column;
align-items: flex-start;
margin-top: auto;
gap: 1rem;
}
.card-list {
list-style: none;
margin: 0;
padding: 0;
color: var(--text-color);
font-size: 1.2em;
line-height: 1.6;
}
.card-link {
display: flex;
align-items: center;
font-size: 1.2em;
color: var(--border-color);
font-weight: 600;
}
.card-link .arrow {
margin-right: .5em;
color: var(--accent-color);
font-size: 1.5em;
line-height: 1;
}
.scroll-spacer { /* высота задаётся в JS */ }
/* ====== Попапы ====== */
.popup-overlay {
position: fixed;
top: 0; left: 0;
width: 100vw; height: 100vh;
background: rgba(0,0,0,0.5);
opacity: 0;
visibility: hidden;
transition: opacity 0.3s ease;
z-index: 1000;
}
.popup-overlay.active {
opacity: 1;
visibility: visible;
}
.popup-panel {
position: fixed;
top: 0; right: 0;
width: 40vw; height: 100vh;
background: #f5f5f5;
transform: translateX(100%);
transition: transform 0.4s ease;
z-index: 1001;
padding: 2rem;
overflow-y: auto;
box-shadow: -4px 0 16px rgba(0,0,0,0.2);
}
.popup-panel.active {
transform: translateX(0);
}
.popup-close {
position: absolute;
top: 1rem; right: 1rem;
background: none;
border: none;
font-size: 2rem;
cursor: pointer;
}
.popup-title {
margin: 0 0 1rem;
font-size: 2.5rem;
color: var(--accent-color);
}
.popup-body {
font-size: 1.1rem;
line-height: 1.6;
}
</style>
</head>
<body>
<!-- ==== Аккордеон ==== -->
<div class="accordion-wrapper">
<div class="accordion-header">
<h2>II SERVICES</h2>
</div>
<div class="accordion-numbers-area">
<div class="accordion-number n1" style="left:0;">1</div>
<div class="accordion-number n2" style="left:30vw;">2</div>
<div class="accordion-number n3" style="left:60vw;">3</div>
<div class="accordion-number n4" style="left:80vw;">4</div>
<div class="accordion-number n5" style="left:85vw;">5</div>
<div class="accordion-number n6" style="left:90vw;">6</div>
<div class="accordion-number n7" style="left:95vw;">7</div>
</div>
<div class="accordion-container">
<div class="accordion-card card-1" data-popup="popup-1">
<div class="card-title">RESEARCH<br>& ADVISORY</div>
<div class="card-footer">
<ul class="card-list">
<li>Market research</li>
<li>Feasibility studies</li>
<li>Risk assessment</li>
<li>Advisory services</li>
</ul>
<div class="card-link"><span class="arrow">→</span>CLICK</div>
</div>
</div>
<div class="accordion-card card-2" data-popup="popup-2">
<div class="card-title">PROJECT<br>MANAGEMENT</div>
<div class="card-footer">
<ul class="card-list">
<li>Initial feasibility studies</li>
<li>Coordination & oversight</li>
<li>Scheduling</li>
</ul>
<div class="card-link"><span class="arrow">→</span>CLICK</div>
</div>
</div>
<div class="accordion-card card-3" data-popup="popup-3">
<div class="card-title">PLANNING<br>& DESIGN</div>
<div class="card-footer">
<ul class="card-list">
<li>Site analysis & land use planning</li>
<li>Architecture & design management</li>
<li>Permitting</li>
</ul>
<div class="card-link"><span class="arrow">→</span>CLICK</div>
</div>
</div>
<div class="accordion-card card-4" data-popup="popup-4">
<div class="card-title">FINANCING<br>& BUDGETING</div>
<div class="card-footer">
<ul class="card-list">
<li>Financial feasibility & analysis</li>
<li>Funding acquisition</li>
<li>Budget management</li>
</ul>
<div class="card-link"><span class="arrow">→</span>CLICK</div>
</div>
</div>
<div class="accordion-card card-5" data-popup="popup-5">
<div class="card-title">CONSTRUCTION<br>MANAGEMENT</div>
<div class="card-footer">
<ul class="card-list">
<li>Contractor selection & procurement</li>
<li>On-site supervision</li>
<li>Progress reporting</li>
</ul>
<div class="card-link"><span class="arrow">→</span>CLICK</div>
</div>
</div>
<div class="accordion-card card-6" data-popup="popup-6">
<div class="card-title">MARKETING<br>& LEASING</div>
<div class="card-footer">
<ul class="card-list">
<li>Market analysis</li>
<li>Marketing strategy</li>
<li>Leasing & sales management</li>
</ul>
<div class="card-link"><span class="arrow">→</span>CLICK</div>
</div>
</div>
<div class="accordion-card card-7" data-popup="popup-7">
<div class="card-title">POST-CONSTRUCTION<br>SERVICES</div>
<div class="card-footer">
<ul class="card-list">
<li>Project handover</li>
<li>Property management setup</li>
<li>Performance evaluation</li>
</ul>
<div class="card-link"><span class="arrow">→</span>CLICK</div>
</div>
</div>
</div>
</div>
<div class="scroll-spacer"></div>
<!-- GSAP + ScrollTrigger -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.12.2/gsap.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.12.2/ScrollTrigger.min.js"></script>
<script>
gsap.registerPlugin(ScrollTrigger);
window.addEventListener('load', () => {
const vh = window.innerHeight, vw = window.innerWidth;
const widthPrev = 30;
const cards = [
{ sel: '.card-2', from: 30, to: 5, dur: 1 },
{ sel: '.card-3', from: 60, to: 10, dur: 1 },
{ sel: '.card-4', from: 80, to: 15, dur: 1 },
{ sel: '.card-5', from: 85, to: 20, dur: 1 },
{ sel: '.card-6', from: 90, to: 25, dur: 1 },
{ sel: '.card-7', from: 95, to: 30, dur: 1 }
];
cards.forEach((card, i) => {
if (i === 0) card._start = 0;
else {
const prev = cards[i - 1];
const pLocal = (card.from - widthPrev - prev.from) / (prev.to - prev.from);
card._start = prev._start + prev.dur * pLocal;
}
});
const timelineScreens = Math.max(...cards.map(c => c._start + c.dur));
const scrollPx = timelineScreens * vh;
document.querySelector('.scroll-spacer').style.height = scrollPx + 'px';
const tl = gsap.timeline({
scrollTrigger: {
trigger: '.accordion-wrapper',
start: 'top top',
end: '+=' + scrollPx,
pin: true,
scrub: true,
invalidateOnRefresh: true
}
});
cards.forEach(card => {
tl.fromTo(
card.sel,
{ left: () => vw * card.from / 100 + 'px' },
{ left: () => vw * card.to / 100 + 'px', duration: card.dur, ease: 'none' },
card._start
);
});
ScrollTrigger.refresh();
});
</script>
<!-- ==== Оверлей и 7 попапов ==== -->
<div class="popup-overlay"></div>
<div id="popup-1" class="popup-panel">
<button class="popup-close">×</button>
<h3 class="popup-title">RESEARCH & ADVISORY</h3>
<div class="popup-body">
<p><strong>MARKET RESEARCH:</strong> Demand and competitive analysis. Demographic studies.</p>
<p><strong>FEASIBILITY STUDIES:</strong> Economic, technical, and regulatory feasibility assessments.</p>
<p><strong>RISK ASSESSMENT:</strong> Identifying and mitigating potential risks.</p>
<p><strong>ADVISORY SERVICES:</strong> Strategic planning and financial advisory. Regulatory compliance guidance.</p>
</div>
</div>
<div id="popup-2" class="popup-panel">
<button class="popup-close">×</button>
<h3 class="popup-title">PROJECT MANAGEMENT</h3>
<div class="popup-body">
<p><strong>INITIAL FEASIBILITY STUDIES:</strong> Assessing the viability of the project.</p>
<p><strong>COORDINATION AND OVERSIGHT:</strong> Managing the development team, including architects, engineers, contractors, and other consultants.</p>
<p><strong>SCHEDULING:</strong> Creating and maintaining project timelines to ensure timely completion.</p>
</div>
</div>
<div id="popup-3" class="popup-panel">
<button class="popup-close">×</button>
<h3 class="popup-title">PLANNING & DESIGN</h3>
<div class="popup-body">
<p><strong>SITE ANALYSIS & LAND USE PLANNING:</strong> Evaluating site conditions and obtaining necessary zoning & planning approvals.</p>
<p><strong>ARCHITECTURE & DESIGN MANAGEMENT:</strong> Collaborating with architects & designers to develop project plans that meet regulatory requirements & client specifications.</p>
<p><strong>PERMITTING:</strong> Securing all necessary permits and approvals from local authorities.</p>
</div>
</div>
<div id="popup-4" class="popup-panel">
<button class="popup-close">×</button>
<h3 class="popup-title">FINANCING & BUDGETING</h3>
<div class="popup-body">
<p><strong>FINANCIAL FEASIBILITY AND ANALYSIS:</strong> Preparing detailed financial models and cost estimates to ensure project viability.</p>
<p><strong>FUNDING ACQUISITION:</strong> Assisting clients in securing financing through loans, grants, or investor funding.</p>
<p><strong>BUDGET MANAGEMENT:</strong> Monitoring project expenses and ensuring adherence to the budget.</p>
</div>
</div>
<div id="popup-5" class="popup-panel">
<button class="popup-close">×</button>
<h3 class="popup-title">CONSTRUCTION MANAGEMENT</h3>
<div class="popup-body">
<p><strong>CONTRACTOR SELECTION AND PROCUREMENT:</strong> Managing the bidding process and selecting qualified contractors and suppliers.</p>
<p><strong>ON-SITE SUPERVISION:</strong> Overseeing construction activities to ensure quality control and adherence to project plans and specifications.</p>
<p><strong>PROGRESS REPORTING:</strong> Providing regular updates on construction progress and addressing any issues that arise.</p>
</div>
</div>
<div id="popup-6" class="popup-panel">
<button class="popup-close">×</button>
<h3 class="popup-title">MARKETING & LEASING</h3>
<div class="popup-body">
<p><strong>MARKET ANALYSIS:</strong> Conducting research to understand market conditions and identify target audiences.</p>
<p><strong>MARKETING STRATEGY:</strong> Developing and implementing marketing plans to promote the project.</p>
<p><strong>LEASING AND SALES MANAGEMENT:</strong> Coordinating with real estate agents and managing the leasing or sale of properties within the development.</p>
</div>
</div>
<div id="popup-7" class="popup-panel">
<button class="popup-close">×</button>
<h3 class="popup-title">POST-CONSTRUCTION SERVICES</h3>
<div class="popup-body">
<p><strong>PROJECT HANDOVER:</strong> Ensuring a smooth transition from construction to occupancy, including final inspections and punch list completion.</p>
<p><strong>PROPERTY MANAGEMENT SETUP:</strong> Assisting in the establishment of property management services if needed.</p>
<p><strong>PERFORMANCE EVALUATION:</strong> Reviewing project outcomes to ensure all objectives have been met and identifying areas for improvement in future projects.</p>
</div>
</div>
<!-- Logic для попапов -->
<script>
document.addEventListener('DOMContentLoaded', () => {
const overlay = document.querySelector('.popup-overlay');
document.querySelectorAll('.accordion-card').forEach(card => {
card.addEventListener('click', () => {
const id = card.dataset.popup;
const panel = document.getElementById(id);
if (!panel) return;
panel.classList.add('active');
overlay.classList.add('active');
});
});
document.querySelectorAll('.popup-close').forEach(btn => {
btn.addEventListener('click', e => {
e.stopPropagation();
btn.closest('.popup-panel').classList.remove('active');
overlay.classList.remove('active');
});
});
overlay.addEventListener('click', () => {
document.querySelectorAll('.popup-panel.active').forEach(p => p.classList.remove('active'));
overlay.classList.remove('active');
});
});
</script>
</body>
</html>