update:新版本
BIN
.tools/ossutil-2.3.0-windows-amd64.zip
Normal file
BIN
.tools/ossutil-2.3.0-windows-amd64/ossutil.exe
Normal file
@ -0,0 +1 @@
|
||||
# C:\Project\官网\YD-WEB\.tools\ossutil-2.3.0-windows-amd64\ossutil.exe cp .\dist\ oss://yuedong-wechatapplet/static/wwwweb/20260722-092437/ -r --exclude index.html --dry-run -f
|
||||
@ -6,6 +6,7 @@
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
"build": "vite build",
|
||||
"rewrite:oss": "node scripts/rewrite-oss-paths.mjs",
|
||||
"preview": "vite preview"
|
||||
},
|
||||
"dependencies": {
|
||||
|
||||
BIN
public/materials/跃动健康/ppt/01.webp
Normal file
|
After Width: | Height: | Size: 177 KiB |
BIN
public/materials/跃动健康/ppt/02.webp
Normal file
|
After Width: | Height: | Size: 43 KiB |
BIN
public/materials/跃动健康/ppt/03.webp
Normal file
|
After Width: | Height: | Size: 152 KiB |
BIN
public/materials/跃动健康/ppt/04.webp
Normal file
|
After Width: | Height: | Size: 170 KiB |
BIN
public/materials/跃动健康/ppt/05.webp
Normal file
|
After Width: | Height: | Size: 98 KiB |
BIN
public/materials/跃动健康/ppt/06.webp
Normal file
|
After Width: | Height: | Size: 28 KiB |
BIN
public/materials/跃动健康/ppt/07.webp
Normal file
|
After Width: | Height: | Size: 20 KiB |
BIN
public/materials/跃动健康/ppt/08.webp
Normal file
|
After Width: | Height: | Size: 29 KiB |
BIN
public/materials/跃动健康/ppt/09.webp
Normal file
|
After Width: | Height: | Size: 45 KiB |
BIN
public/materials/跃动健康/ppt/10.webp
Normal file
|
After Width: | Height: | Size: 248 KiB |
BIN
public/materials/跃动健康/ppt/11.webp
Normal file
|
After Width: | Height: | Size: 84 KiB |
BIN
public/materials/跃动健康/ppt/12.webp
Normal file
|
After Width: | Height: | Size: 157 KiB |
BIN
public/materials/跃动健康/ppt/13.webp
Normal file
|
After Width: | Height: | Size: 118 KiB |
BIN
public/materials/跃动健康/ppt/14.webp
Normal file
|
After Width: | Height: | Size: 117 KiB |
BIN
public/materials/跃动健康/ppt/15.webp
Normal file
|
After Width: | Height: | Size: 115 KiB |
BIN
public/materials/跃动健康/ppt/16.webp
Normal file
|
After Width: | Height: | Size: 70 KiB |
BIN
public/materials/跃动健康/ppt/17.webp
Normal file
|
After Width: | Height: | Size: 60 KiB |
BIN
public/materials/跃动健康/ppt/18.webp
Normal file
|
After Width: | Height: | Size: 130 KiB |
BIN
public/materials/跃动健康/ppt/19.webp
Normal file
|
After Width: | Height: | Size: 134 KiB |
BIN
public/materials/跃动健康/ppt/20.webp
Normal file
|
After Width: | Height: | Size: 155 KiB |
BIN
public/materials/跃动健康/ppt/21.webp
Normal file
|
After Width: | Height: | Size: 169 KiB |
BIN
public/materials/跃动健康/ppt/22.webp
Normal file
|
After Width: | Height: | Size: 32 KiB |
BIN
public/materials/跃动健康/ppt/23.webp
Normal file
|
After Width: | Height: | Size: 113 KiB |
BIN
public/materials/跃动健康/ppt/24.webp
Normal file
|
After Width: | Height: | Size: 183 KiB |
BIN
public/materials/跃动健康/ppt/25.webp
Normal file
|
After Width: | Height: | Size: 173 KiB |
BIN
public/materials/跃动健康/ppt/26.webp
Normal file
|
After Width: | Height: | Size: 149 KiB |
BIN
public/materials/跃动健康/ppt/27.webp
Normal file
|
After Width: | Height: | Size: 205 KiB |
BIN
public/materials/跃动健康/ppt/28.webp
Normal file
|
After Width: | Height: | Size: 104 KiB |
BIN
public/materials/跃动健康/ppt/29.webp
Normal file
|
After Width: | Height: | Size: 158 KiB |
BIN
public/materials/跃动健康/ppt/30.webp
Normal file
|
After Width: | Height: | Size: 142 KiB |
BIN
public/materials/跃动健康/ppt/31.webp
Normal file
|
After Width: | Height: | Size: 198 KiB |
BIN
public/materials/跃动健康/ppt/32.webp
Normal file
|
After Width: | Height: | Size: 127 KiB |
BIN
public/materials/跃动健康/ppt/33.webp
Normal file
|
After Width: | Height: | Size: 120 KiB |
BIN
public/materials/跃动健康/ppt/34.webp
Normal file
|
After Width: | Height: | Size: 153 KiB |
BIN
public/materials/跃动健康/ppt/35.webp
Normal file
|
After Width: | Height: | Size: 62 KiB |
BIN
public/materials/跃动健康/ppt/36.webp
Normal file
|
After Width: | Height: | Size: 78 KiB |
BIN
public/sports-hall/brand-banner.png
Normal file
|
After Width: | Height: | Size: 47 KiB |
BIN
public/sports-hall/child-jumping.png
Normal file
|
After Width: | Height: | Size: 393 KiB |
BIN
public/sports-hall/city-network.png
Normal file
|
After Width: | Height: | Size: 250 KiB |
BIN
public/sports-hall/competition-collage.png
Normal file
|
After Width: | Height: | Size: 1.1 MiB |
66
scripts/rewrite-oss-paths.mjs
Normal file
@ -0,0 +1,66 @@
|
||||
import { readFileSync, readdirSync, writeFileSync } from 'node:fs';
|
||||
import { extname, join, resolve } from 'node:path';
|
||||
|
||||
const rawBase = process.argv[2];
|
||||
|
||||
if (!rawBase || !/^https:\/\//.test(rawBase)) {
|
||||
throw new Error('Usage: npm run rewrite:oss -- https://bucket.example/path/');
|
||||
}
|
||||
|
||||
const base = rawBase.endsWith('/') ? rawBase : `${rawBase}/`;
|
||||
const distDir = resolve('dist');
|
||||
const textExtensions = new Set(['.html', '.js', '.css']);
|
||||
const files = [];
|
||||
|
||||
const collectFiles = (directory) => {
|
||||
for (const entry of readdirSync(directory, { withFileTypes: true })) {
|
||||
const fullPath = join(directory, entry.name);
|
||||
if (entry.isDirectory()) collectFiles(fullPath);
|
||||
else if (textExtensions.has(extname(entry.name))) files.push(fullPath);
|
||||
}
|
||||
};
|
||||
|
||||
collectFiles(distDir);
|
||||
|
||||
// Vite has already rewritten static template/CSS URLs. Only rewrite root asset
|
||||
// paths that still begin immediately after a JavaScript quote or template tick.
|
||||
const rootAssetPattern = /(["'`])\/(site|materials|sports-hall)\//g;
|
||||
let changedFiles = 0;
|
||||
|
||||
for (const file of files.filter((item) => extname(item) === '.js')) {
|
||||
const source = readFileSync(file, 'utf8');
|
||||
const rewritten = source.replace(
|
||||
rootAssetPattern,
|
||||
(_match, quote, folder) => `${quote}${base}${folder}/`,
|
||||
);
|
||||
|
||||
if (rewritten !== source) {
|
||||
writeFileSync(file, rewritten, 'utf8');
|
||||
changedFiles += 1;
|
||||
}
|
||||
}
|
||||
|
||||
const duplicatePrefix = `${base.slice(0, -1)}${base}`;
|
||||
const unresolved = [];
|
||||
const duplicated = [];
|
||||
|
||||
for (const file of files) {
|
||||
const content = readFileSync(file, 'utf8');
|
||||
if (content.includes(duplicatePrefix) || /https:\/\/[^\s"'`]+https:\/\//.test(content)) {
|
||||
duplicated.push(file);
|
||||
}
|
||||
if (extname(file) === '.js' && rootAssetPattern.test(content)) {
|
||||
unresolved.push(file);
|
||||
}
|
||||
rootAssetPattern.lastIndex = 0;
|
||||
}
|
||||
|
||||
if (duplicated.length) {
|
||||
throw new Error(`Duplicated OSS prefix found in: ${duplicated.join(', ')}`);
|
||||
}
|
||||
|
||||
if (unresolved.length) {
|
||||
throw new Error(`Root asset paths remain in: ${unresolved.join(', ')}`);
|
||||
}
|
||||
|
||||
console.log(`OSS paths verified. Rewritten files: ${changedFiles}`);
|
||||
224
src/components/HealthSection.vue
Normal file
@ -0,0 +1,224 @@
|
||||
<template>
|
||||
<div ref="root" class="health-experience">
|
||||
<section class="health-panel health-policy health-motion">
|
||||
<div class="health-section-head">
|
||||
<div><small>01 · POLICY BACKGROUND</small><h3>政策赋能青少年体育</h3></div>
|
||||
<p>国家级及市级政策均大力推动青少儿体育发展,聚焦体教融合、健康干预、场地建设,明确推广跳绳等传统体育项目。</p>
|
||||
</div>
|
||||
<div class="health-policy-window">
|
||||
<div class="health-policy-track">
|
||||
<div v-for="copy in 2" :key="copy" class="health-policy-set" :aria-hidden="copy === 2">
|
||||
<article v-for="(policy, index) in policies" :key="`${copy}-${policy.title}`">
|
||||
<img :src="policy.image" :alt="copy === 1 ? policy.title : ''" loading="lazy" />
|
||||
<div><span>0{{ index + 1 }}</span><h4>{{ policy.title }}</h4></div>
|
||||
</article>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="health-panel health-issues health-motion">
|
||||
<div class="health-section-head light">
|
||||
<div><small>02 · HEALTH ISSUES</small><h3>四大健康问题,正在威胁孩子们的成长</h3></div>
|
||||
<p>国家从战略高度重视青少儿健康,持续推动体教融合,并将近视、肥胖、心理健康和脊柱侧弯列为重点干预方向。</p>
|
||||
</div>
|
||||
<div class="health-issue-grid">
|
||||
<article v-for="(issue, index) in issues" :key="issue.title" class="health-motion" :style="{ '--health-delay': `${index * 90}ms` }">
|
||||
<img :src="issue.image" :alt="issue.title" loading="lazy" />
|
||||
<div><span>0{{ index + 1 }}</span><h4>{{ issue.title }}</h4><p>{{ issue.description }}</p></div>
|
||||
</article>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="health-panel health-collaboration health-motion">
|
||||
<div class="health-section-head">
|
||||
<div><small>03 · PAIN POINTS & BREAKTHROUGH</small><h3>多方协同,形成运动健康管理闭环</h3></div>
|
||||
<p>以体医融合为方向,打通政策、学校、医疗机构与社会专业力量,让健康评估、运动干预与持续运营真正落地。</p>
|
||||
</div>
|
||||
<div class="health-collab-stage">
|
||||
<div class="health-collab-rings" aria-hidden="true"><i></i><i></i><i></i></div>
|
||||
<div class="health-collab-core"><b>多方协同闭环</b><span>运动测评 · 运动干预<br />运动体验 · 运动康复</span></div>
|
||||
<article v-for="(party, index) in collaborators" :key="party.title" :class="`party-${index + 1}`" class="health-motion" :style="{ '--health-delay': `${index * 100}ms` }">
|
||||
<span>0{{ index + 1 }}</span><h4>{{ party.title }}</h4><p>{{ party.description }}</p>
|
||||
</article>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="health-panel health-smart health-motion">
|
||||
<div class="health-smart-copy">
|
||||
<small>04 · SMART VENUE</small><h3>智慧青少年健康促进中心</h3>
|
||||
<p>专为青少年设计的智能化健康管理与运动促进平台,利用物联网、人工智能和大数据技术,为青少年体质健康提供全面、科学的支持。</p>
|
||||
<p>中心实时采集心率、体脂率、运动强度等指标,通过数据分析生成个性化运动方案与健康建议,并结合虚拟现实和互动游戏增强运动乐趣。</p>
|
||||
<div class="health-tech-tags"><span v-for="tag in techTags" :key="tag">{{ tag }}</span></div>
|
||||
</div>
|
||||
<div class="health-smart-media">
|
||||
<img :src="imageAt(9)" alt="智慧青少年健康促进中心" loading="lazy" />
|
||||
<img :src="imageAt(10)" alt="智慧场馆四位一体服务体系" loading="lazy" />
|
||||
<i aria-hidden="true"></i>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="health-panel health-center health-motion">
|
||||
<div class="health-center-gallery">
|
||||
<img v-for="(image, index) in centerImages" :key="image" :src="image" :alt="`跃动青少儿运动健康促进中心 ${index + 1}`" loading="lazy" />
|
||||
</div>
|
||||
<div class="health-center-copy">
|
||||
<small>05 · CENTER INTRODUCTION</small><h3>跃动青少儿运动健康促进中心</h3>
|
||||
<div class="health-center-beliefs">
|
||||
<article><span>愿景</span><p>以运动蕴养“上善”品格,以健康筑基未来之城,成为长三角一体化示范区青少儿运动健康创新枢纽。</p></article>
|
||||
<article><span>使命</span><p>以体育运动强健一代人的身体,锻造一代人的品格,赋能一座城的未来。</p></article>
|
||||
<article><span>经营模式</span><p>以实体基地为专业度塑造的核心引擎,构建标准化服务、装备及科技产品,向社区网点和合作校园辐射拓展,形成“一体两翼”运营模式。</p></article>
|
||||
</div>
|
||||
<div class="health-values"><b>客户为中心</b><b>开放合作</b><b>长期艰苦奋斗</b><b>永不言败</b></div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="health-panel health-services health-motion">
|
||||
<div class="health-section-head light">
|
||||
<div><small>06 · BASE INTRODUCTION</small><h3>从运动技能,到全周期健康促进</h3></div>
|
||||
<p>中心融合智慧体育教育、科学健康促进与多元专项课程,为不同成长阶段提供可测评、可干预、可持续的服务。</p>
|
||||
</div>
|
||||
<div class="health-service-grid">
|
||||
<article v-for="(service, index) in services" :key="service.title" class="health-motion" :style="{ '--health-delay': `${(index % 4) * 80}ms` }">
|
||||
<img :src="service.image" :alt="service.title" loading="lazy" />
|
||||
<div><span>{{ String(index + 1).padStart(2, '0') }}</span><h4>{{ service.title }}</h4><p>{{ service.subtitle }}</p></div>
|
||||
</article>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="health-panel health-standard health-motion">
|
||||
<div class="health-standard-copy">
|
||||
<small>07 · GOVERNMENT–ENTERPRISE COLLABORATION</small>
|
||||
<h3>政企联动,打造青少年运动健康促进服务新标杆</h3>
|
||||
<p>中心构建“周课+月活动+季考核+半年表演+年赛”五位一体场景体系。从掌握跳绳、体适能、跑酷等运动技能起步,到享受运动乐趣、塑造健康习惯,最终将运动基因深植终身。</p>
|
||||
<div class="health-cadence"><span v-for="(item, index) in cadence" :key="item"><b>0{{ index + 1 }}</b>{{ item }}</span></div>
|
||||
<strong>运动能力 · 健康行为 · 体育品德</strong>
|
||||
</div>
|
||||
<div class="health-scene-window">
|
||||
<div class="health-scene-track">
|
||||
<div v-for="copy in 2" :key="copy" class="health-scene-set" :aria-hidden="copy === 2">
|
||||
<img v-for="(image, index) in sceneImages" :key="`${copy}-${index}`" :src="image" :alt="copy === 1 ? `青少年运动健康促进活动现场 ${index + 1}` : ''" loading="lazy" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { computed, onBeforeUnmount, onMounted, ref } from 'vue';
|
||||
|
||||
const props = defineProps({ slides: { type: Array, default: () => [] } });
|
||||
const root = ref(null);
|
||||
const imageAt = (index) => props.slides[index]?.src || '';
|
||||
|
||||
const policies = computed(() => [
|
||||
{ title: '2025年全国青少年体育工作会议精神', image: imageAt(0) },
|
||||
{ title: '《“健康中国2030”规划纲要》', image: imageAt(1) },
|
||||
{ title: '《家校社协同育人“教联体”工作方案》', image: imageAt(2) },
|
||||
{ title: '上海市运动促进健康三年行动计划', image: imageAt(3) },
|
||||
{ title: '深化新时代中小学体育工作高质量发展', image: imageAt(4) }
|
||||
]);
|
||||
const issues = computed(() => [
|
||||
{ title: '心理健康问题不容忽视', description: '聚焦青少儿心理行为问题干预,建立更及时、更温暖的支持体系。', image: imageAt(5) },
|
||||
{ title: '脊柱侧弯发病率上升', description: '以全生命周期健康管理理念,推动筛查、评估与运动干预协同开展。', image: imageAt(6) },
|
||||
{ title: '近视低龄化与高发化', description: '将儿童青少儿近视列为健康优先干预问题,以运动促进主动防控。', image: imageAt(7) },
|
||||
{ title: '肥胖问题日趋严峻', description: '把青少儿肥胖防控纳入健康促进重点任务,以科学运动改善体重与体质。', image: imageAt(8) }
|
||||
]);
|
||||
const collaborators = [
|
||||
{ title: '教育局 & 体育局', description: '提供顶层设计与政策支持,统筹教育、体育及医疗资源。' },
|
||||
{ title: '学校', description: '作为服务实施主阵地,将健康促进融入日常体育与健康教育。' },
|
||||
{ title: '医院 / 医疗机构', description: '提供医学评估、疾病诊断和运动医学技术支持,保障干预科学安全。' },
|
||||
{ title: '社会专业力量', description: '提供数字化技术、体系化课程与标准化运营,推动项目持续优化。' }
|
||||
];
|
||||
const techTags = ['IoT 物联网', 'AI 人工智能', '大数据分析', 'VR 互动体验'];
|
||||
const centerImages = computed(() => props.slides.slice(11, 15).map((item) => item.src));
|
||||
const serviceNames = [
|
||||
['探界跑酷', '动作探索与身体控制'], ['青训跳绳', '专项技能与竞技成长'],
|
||||
['基石体适能', '身体素质与运动基础'], ['智慧体育教育中心', '数字化教学与科学训练'],
|
||||
['科学健康促进中心', '测评、干预与运动康复'], ['AI心灵乐园', '心理健康与积极成长'],
|
||||
['体重运动管理', '科学运动与体重改善'], ['体态运动管理', '体态评估与功能训练']
|
||||
];
|
||||
const services = computed(() => serviceNames.map(([title, subtitle], index) => ({ title, subtitle, image: imageAt(index + 15) })));
|
||||
const cadence = ['周课', '月活动', '季考核', '半年表演', '年赛'];
|
||||
const sceneImages = computed(() => props.slides.slice(23).map((item) => item.src));
|
||||
|
||||
let observer;
|
||||
onMounted(() => {
|
||||
document.documentElement.classList.add('health-page-active');
|
||||
const elements = [...(root.value?.querySelectorAll('.health-motion') || [])];
|
||||
if (!('IntersectionObserver' in window) || window.matchMedia('(prefers-reduced-motion: reduce)').matches) {
|
||||
elements.forEach((element) => element.classList.add('is-visible'));
|
||||
return;
|
||||
}
|
||||
root.value?.classList.add('motion-ready');
|
||||
observer = new IntersectionObserver((entries) => {
|
||||
entries.forEach((entry) => {
|
||||
if (entry.isIntersecting) {
|
||||
entry.target.classList.add('is-visible');
|
||||
observer.unobserve(entry.target);
|
||||
}
|
||||
});
|
||||
}, { threshold: 0.04, rootMargin: '0px 0px 96px' });
|
||||
elements.forEach((element) => observer.observe(element));
|
||||
});
|
||||
onBeforeUnmount(() => {
|
||||
observer?.disconnect();
|
||||
document.documentElement.classList.remove('health-page-active');
|
||||
});
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
:global(html.health-page-active) { overflow-x: clip; }
|
||||
.health-experience { display: grid; grid-template-columns: minmax(0,1fr); gap: 88px; width: 100%; min-width: 0; }
|
||||
.health-panel { position: relative; }
|
||||
.motion-ready .health-motion { opacity: 0; transform: translateY(34px); transition: opacity .75s ease var(--health-delay,0ms), transform .9s cubic-bezier(.2,.8,.2,1) var(--health-delay,0ms); }
|
||||
.motion-ready .health-motion.is-visible { opacity: 1; transform: none; }
|
||||
.health-section-head { display: grid; grid-template-columns: minmax(0,1fr) minmax(0,1fr); gap: 56px; align-items: end; margin-bottom: 38px; }
|
||||
.health-section-head small,.health-smart-copy > small,.health-center-copy > small,.health-standard-copy > small { color: var(--blue-600); font-size: 10px; font-weight: 900; letter-spacing: 3px; }
|
||||
.health-section-head h3,.health-smart-copy h3,.health-center-copy h3,.health-standard-copy h3 { margin: 12px 0 0; color: var(--ink); font-size: clamp(34px,4vw,52px); line-height: 1.14; letter-spacing: -2px; }
|
||||
.health-section-head > p,.health-smart-copy > p,.health-standard-copy > p { margin: 0; color: #536b83; font-size: 15px; line-height: 1.95; }
|
||||
.health-section-head.light small { color: #b9e6ff; }.health-section-head.light h3 { color: #fff; }.health-section-head.light > p { color: rgba(255,255,255,.76); }
|
||||
.health-policy-window { contain: layout paint; overflow: hidden; margin-right: 0; margin-left: 0; padding: 12px 0 30px; }
|
||||
.health-policy-track { display: flex; width: max-content; will-change: transform; animation: healthPolicyFlow 34s linear infinite; }
|
||||
.health-policy-set { display: flex; gap: 18px; padding-right: 18px; }
|
||||
.health-policy article { width: clamp(260px,27vw,370px); overflow: hidden; border: 1px solid rgba(8,120,232,.12); border-radius: 22px 5px 22px 5px; background: #fff; box-shadow: 0 16px 42px rgba(3,58,112,.09); }
|
||||
.health-policy article img { width: 100%; height: 230px; object-fit: contain; background: #f1f8ff; transition: transform .55s ease; }
|
||||
.health-policy article:hover img { transform: scale(1.035); }
|
||||
.health-policy article > div { display: grid; grid-template-columns: 42px 1fr; gap: 14px; align-items: center; min-height: 105px; padding: 20px 22px; }
|
||||
.health-policy article span { color: var(--blue-500); font-size: 18px; font-weight: 900; }.health-policy article h4 { margin: 0; color: var(--ink); font-size: 16px; line-height: 1.55; }
|
||||
@keyframes healthPolicyFlow { to { transform: translateX(-50%); } }
|
||||
.health-issues,.health-services { margin-right: 0; margin-left: 0; padding: 82px clamp(42px,5vw,72px); overflow: hidden; border-radius: 30px 7px 30px 7px; background: linear-gradient(135deg,#006fc9,#0090ff 64%,#35b0ff); }
|
||||
.health-issue-grid { display: grid; grid-template-columns: repeat(2,minmax(0,1fr)); gap: 18px; }
|
||||
.health-issue-grid article { position: relative; min-height: 390px; overflow: hidden; border: 1px solid rgba(255,255,255,.22); border-radius: 24px 6px 24px 6px; background: #063f78; }
|
||||
.health-issue-grid img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; opacity: .68; transition: transform .8s cubic-bezier(.2,.8,.2,1), opacity .5s; }
|
||||
.health-issue-grid article:hover img { transform: scale(1.075); opacity: .82; }
|
||||
.health-issue-grid article > div { position: absolute; inset: 0; display: flex; flex-direction: column; justify-content: flex-end; padding: 40px; color: #fff; background: linear-gradient(transparent 12%,rgba(0,37,75,.92)); }
|
||||
.health-issue-grid span { color: #ffe500; font-size: 12px; font-weight: 900; letter-spacing: 2px; }.health-issue-grid h4 { margin: 12px 0 11px; font-size: 27px; }.health-issue-grid p { max-width: 520px; margin: 0; color: rgba(255,255,255,.76); line-height: 1.8; }
|
||||
.health-collab-stage { position: relative; min-height: 700px; overflow: hidden; border-radius: 32px 7px 32px 7px; background: radial-gradient(circle at center,#e9f7ff 0,#f8fcff 50%,#fff 72%); box-shadow: inset 0 0 0 1px rgba(8,120,232,.1),0 26px 65px rgba(2,62,119,.09); }
|
||||
.health-collab-rings,.health-collab-rings i { position: absolute; inset: 50% auto auto 50%; border: 1px solid rgba(0,144,255,.22); border-radius: 50%; transform: translate(-50%,-50%); }
|
||||
.health-collab-rings { width: 520px; height: 520px; animation: healthOrbit 28s linear infinite; }.health-collab-rings i:nth-child(1) { width: 390px; height: 390px; }.health-collab-rings i:nth-child(2) { width: 240px; height: 240px; }.health-collab-rings i:nth-child(3) { width: 10px; height: 10px; border: 0; background: #ffe500; box-shadow: 0 -260px 0 #0090ff,0 260px 0 #0090ff; }
|
||||
@keyframes healthOrbit { to { transform: translate(-50%,-50%) rotate(360deg); } }
|
||||
.health-collab-core { position: absolute; left: 50%; top: 50%; z-index: 2; display: grid; place-items: center; width: 240px; height: 240px; padding: 30px; color: #fff; border-radius: 50%; background: linear-gradient(145deg,#006fc9,#0090ff); box-shadow: 0 24px 60px rgba(0,116,211,.28); text-align: center; transform: translate(-50%,-50%); }.health-collab-core b { font-size: 25px; }.health-collab-core span { color: rgba(255,255,255,.72); font-size: 12px; line-height: 1.8; }
|
||||
.health-collab-stage article { position: absolute; z-index: 3; width: 270px; padding: 25px; border: 1px solid rgba(8,120,232,.12); border-radius: 18px 4px 18px 4px; background: rgba(255,255,255,.94); box-shadow: 0 17px 45px rgba(2,62,119,.1); }.health-collab-stage article span { color: var(--blue-500); font-size: 11px; font-weight: 900; }.health-collab-stage article h4 { margin: 10px 0; color: var(--ink); font-size: 18px; }.health-collab-stage article p { margin: 0; color: #63778c; font-size: 12px; line-height: 1.75; }
|
||||
.party-1 { left: 5%; top: 8%; }.party-2 { right: 5%; top: 8%; }.party-3 { left: 5%; bottom: 8%; }.party-4 { right: 5%; bottom: 8%; }
|
||||
.health-smart { display: grid; grid-template-columns: minmax(0,.83fr) minmax(440px,1.17fr); gap: 78px; align-items: center; padding: 68px; overflow: hidden; border-radius: 32px 7px 32px 7px; background: #fff; box-shadow: 0 25px 65px rgba(2,62,119,.1); }
|
||||
.health-smart-copy > p { margin-top: 22px; }.health-tech-tags { display: flex; flex-wrap: wrap; gap: 9px; margin-top: 30px; }.health-tech-tags span { padding: 9px 13px; color: var(--blue-700); border-radius: 999px; background: var(--blue-50); font-size: 11px; font-weight: 800; }
|
||||
.health-smart-media { position: relative; min-height: 570px; }.health-smart-media img { position: absolute; object-fit: contain; background: #eff8ff; box-shadow: 0 18px 46px rgba(2,62,119,.13); }.health-smart-media img:first-child { inset: 0 10% 18% 0; width: 90%; height: 82%; border-radius: 24px 5px 24px 5px; }.health-smart-media img:nth-child(2) { right: 0; bottom: 0; z-index: 2; width: 65%; height: 46%; border: 10px solid #fff; border-radius: 18px 4px 18px 4px; animation: healthFloat 5s ease-in-out infinite; }.health-smart-media i { position: absolute; right: 3%; top: 2%; width: 90px; height: 90px; border: 12px solid #ffe500; border-radius: 50%; opacity: .75; }
|
||||
@keyframes healthFloat { 50% { transform: translateY(-12px); } }
|
||||
.health-center { display: grid; grid-template-columns: minmax(0,1.05fr) minmax(380px,.95fr); gap: 70px; align-items: center; }
|
||||
.health-center-gallery { display: grid; grid-template-columns: repeat(2,1fr); gap: 12px; transform: rotate(-2deg); }.health-center-gallery img { width: 100%; height: 245px; object-fit: cover; border-radius: 18px 4px 18px 4px; box-shadow: 0 13px 32px rgba(2,62,119,.1); transition: transform .45s ease; }.health-center-gallery img:nth-child(even) { transform: translateY(24px); }.health-center-gallery img:hover { z-index: 2; transform: scale(1.04) rotate(2deg); }
|
||||
.health-center-beliefs { display: grid; gap: 12px; margin-top: 30px; }.health-center-beliefs article { display: grid; grid-template-columns: 78px 1fr; gap: 17px; padding: 18px 0; border-top: 1px solid var(--line); }.health-center-beliefs span { color: var(--blue-600); font-size: 12px; font-weight: 900; }.health-center-beliefs p { margin: 0; color: #536b83; font-size: 13px; line-height: 1.75; }.health-values { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 20px; }.health-values b { padding: 8px 11px; color: #fff; border-radius: 7px; background: var(--blue-600); font-size: 10px; }
|
||||
.health-service-grid { display: grid; grid-template-columns: repeat(4,minmax(0,1fr)); gap: 16px; }.health-service-grid article { position: relative; min-height: 370px; overflow: hidden; border-radius: 20px 5px 20px 5px; background: #075497; }.health-service-grid img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; opacity: .83; transition: transform .7s ease; }.health-service-grid article:hover img { transform: scale(1.08); }.health-service-grid article > div { position: absolute; inset: 0; display: flex; flex-direction: column; justify-content: flex-end; padding: 26px; color: #fff; background: linear-gradient(transparent 25%,rgba(0,40,82,.94)); }.health-service-grid span { color: #ffe500; font-size: 11px; font-weight: 900; }.health-service-grid h4 { margin: 10px 0 7px; font-size: 21px; }.health-service-grid p { margin: 0; color: rgba(255,255,255,.7); font-size: 12px; }
|
||||
.health-standard { contain: paint; overflow: hidden; padding: 78px 0 0; color: #fff; border-radius: 32px 7px 32px 7px; background: linear-gradient(135deg,#005daa,#0090ff 68%,#43baff); box-shadow: 0 28px 70px rgba(0,93,177,.2); }.health-standard-copy { padding: 0 70px 58px; }.health-standard-copy > small { color: #b9e6ff; }.health-standard-copy h3 { max-width: 850px; color: #fff; }.health-standard-copy > p { max-width: 930px; margin-top: 22px; color: rgba(255,255,255,.78); }.health-standard-copy > strong { display: block; margin-top: 30px; color: #ffe500; font-size: 22px; letter-spacing: 2px; }
|
||||
.health-cadence { display: flex; flex-wrap: wrap; gap: 10px; margin-top: 28px; }.health-cadence span { display: flex; align-items: center; gap: 9px; padding: 10px 14px; border: 1px solid rgba(255,255,255,.25); border-radius: 999px; background: rgba(255,255,255,.08); font-size: 12px; }.health-cadence b { color: #ffe500; }
|
||||
.health-scene-window { contain: layout paint; overflow: hidden; border-top: 1px solid rgba(255,255,255,.16); }.health-scene-track { display: flex; width: max-content; padding: 18px 0; will-change: transform; animation: healthSceneFlow 42s linear infinite reverse; }.health-scene-set { display: flex; gap: 12px; padding-right: 12px; }.health-scene-set img { width: 310px; height: 220px; object-fit: cover; border-radius: 14px 3px 14px 3px; }
|
||||
@keyframes healthSceneFlow { to { transform: translateX(-50%); } }
|
||||
@media (max-width: 980px) {
|
||||
.health-section-head,.health-smart,.health-center { grid-template-columns: 1fr; gap: 34px; }.health-collab-stage { min-height: 850px; }.health-collab-stage article { width: 42%; }.party-1,.party-3 { left: 4%; }.party-2,.party-4 { right: 4%; }.health-smart { padding: 42px; }.health-smart-media { min-height: 500px; }.health-service-grid { grid-template-columns: repeat(2,1fr); }
|
||||
}
|
||||
@media (max-width: 620px) {
|
||||
.health-experience { gap: 52px; }.health-section-head { display: block; }.health-section-head > p { margin-top: 18px; }.health-section-head h3,.health-smart-copy h3,.health-center-copy h3,.health-standard-copy h3 { font-size: 34px; letter-spacing: -1.5px; }.health-policy article { width: 275px; }.health-policy article img { height: 185px; }.health-issues,.health-services { padding: 52px 18px; border-radius: 22px 5px 22px 5px; }.health-issue-grid,.health-service-grid { grid-template-columns: 1fr; gap: 14px; }.health-issue-grid article { min-height: 300px; }.health-issue-grid article > div { padding: 26px; }.health-collab-stage { min-height: auto; padding: 250px 18px 22px; }.health-collab-rings { top: 145px; width: 280px; height: 280px; }.health-collab-rings i:nth-child(1) { width: 210px; height: 210px; }.health-collab-rings i:nth-child(2) { width: 130px; height: 130px; }.health-collab-core { top: 145px; width: 155px; height: 155px; padding: 18px; }.health-collab-core b { font-size: 18px; }.health-collab-stage article { position: static; width: 100%; margin-top: 10px; }.health-smart { padding: 30px 22px; }.health-smart-media { min-height: 340px; }.health-smart-media img:first-child { right: 0; width: 100%; }.health-smart-media img:nth-child(2) { width: 74%; }.health-center-gallery img { height: 150px; }.health-center-beliefs article { grid-template-columns: 1fr; gap: 7px; }.health-service-grid article { min-height: 270px; }.health-standard { padding-top: 55px; }.health-standard-copy { padding: 0 24px 45px; }.health-standard-copy > strong { font-size: 16px; }.health-scene-set img { width: 250px; height: 180px; }
|
||||
}
|
||||
@media (prefers-reduced-motion: reduce) { .health-policy-track,.health-scene-track,.health-collab-rings,.health-smart-media img:nth-child(2) { animation: none !important; }.health-policy-window,.health-scene-window { overflow-x: auto; }.motion-ready .health-motion { opacity: 1; transform: none; } }
|
||||
</style>
|
||||
163
src/components/SportsHallSection.vue
Normal file
@ -0,0 +1,163 @@
|
||||
<template>
|
||||
<div class="sports-hall-page">
|
||||
<section v-reveal class="hall-intro">
|
||||
<div class="hall-intro-copy">
|
||||
<span class="hall-kicker">YUEDONG JUMPING HOME</span>
|
||||
<h3>从一根绳开始,<em>爱上运动</em></h3>
|
||||
<p>跃动运动馆成立于2016年,是面向青少年的线下运动培训平台。课程以跳绳为核心,融合体适能与幼儿体育,通过体质体征测评、运动能力评估、运动指导与科学干预,为孩子提供完整的体育运动解决方案。</p>
|
||||
<div class="hall-goals">
|
||||
<span>提升运动能力</span><span>培养健康行为</span><span>塑造体育品德</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="hall-intro-visual">
|
||||
<img src="/sports-hall/child-jumping.png" alt="跃动运动馆学员正在进行跳绳训练" />
|
||||
</div>
|
||||
<div class="hall-stats">
|
||||
<div><strong>2016</strong><span>品牌成立</span></div>
|
||||
<div><strong>近20</strong><span>覆盖城市</span></div>
|
||||
<div><strong>30+</strong><span>全国门店</span></div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section v-reveal class="hall-science">
|
||||
<div class="hall-section-copy">
|
||||
<span class="hall-kicker">SCIENTIFIC TRAINING</span>
|
||||
<h3>运动能帮助孩子解决什么?</h3>
|
||||
<p>4—10岁是儿童运动神经发展的重要窗口期。跃动以科学测评识别孩子的运动基础,将平衡、协调、力量、耐力与节奏训练融入课程,帮助孩子建立长期运动习惯。</p>
|
||||
<div class="hall-concerns">
|
||||
<span v-for="item in concerns" :key="item">{{ item }}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="hall-assessment">
|
||||
<small>ASSESSMENT PATH</small>
|
||||
<ol>
|
||||
<li><b>01</b><div><strong>体质体征测评</strong><span>了解身体发育与基础状态</span></div></li>
|
||||
<li><b>02</b><div><strong>运动能力评估</strong><span>识别协调、体能与动作表现</span></div></li>
|
||||
<li><b>03</b><div><strong>运动指导干预</strong><span>形成适龄、分层的训练方案</span></div></li>
|
||||
<li><b>04</b><div><strong>阶段反馈追踪</strong><span>课评、规划、评估与成绩闭环</span></div></li>
|
||||
</ol>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section v-reveal class="hall-philosophy">
|
||||
<div class="hall-section-title">
|
||||
<span class="hall-kicker">COURSE PHILOSOPHY</span>
|
||||
<h3>四性四品,让成长不止于技能</h3>
|
||||
<p>JUMP带来“四性”,ROPE锤炼“四品”,在运动中同步发展能力、习惯与品格。</p>
|
||||
</div>
|
||||
<div class="hall-values-grid">
|
||||
<article v-for="(value, index) in values" :key="value.en" :style="{ '--value-color': value.color, '--delay': `${index * 45}ms` }">
|
||||
<div><b>{{ value.en.slice(0, 1) }}</b><small>{{ value.en }}</small></div>
|
||||
<h4>{{ value.title }}</h4>
|
||||
<p>{{ value.description }}</p>
|
||||
</article>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section v-reveal class="hall-curriculum">
|
||||
<div class="hall-section-title light">
|
||||
<span class="hall-kicker">GROWTH CURRICULUM</span>
|
||||
<h3>从启蒙到校队的长期成长路径</h3>
|
||||
<p>以阶段目标、技能标准与赛事体验连接每一次进步,让孩子循序渐进地建立能力与自信。</p>
|
||||
</div>
|
||||
<div class="hall-levels">
|
||||
<article v-for="(level, index) in levels" :key="level.name">
|
||||
<span>0{{ index + 1 }}</span>
|
||||
<small>{{ level.duration }}</small>
|
||||
<h4>{{ level.name }}</h4>
|
||||
<strong>{{ level.subtitle }}</strong>
|
||||
<p>{{ level.description }}</p>
|
||||
<ul><li v-for="item in level.targets" :key="item">{{ item }}</li></ul>
|
||||
</article>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section v-reveal class="hall-growth-loop">
|
||||
<div class="hall-section-title">
|
||||
<span class="hall-kicker">COMPLETE PARTICIPATION</span>
|
||||
<h3>完整参与一项运动</h3>
|
||||
<p>课程之外,孩子还能通过活动、考级、表演和赛事建立目标感,并在真实场景中持续成长。</p>
|
||||
</div>
|
||||
<div class="hall-loop-steps">
|
||||
<article v-for="(step, index) in growthSteps" :key="step.title">
|
||||
<b>{{ String(index + 1).padStart(2, '0') }}</b><h4>{{ step.title }}</h4><p>{{ step.description }}</p>
|
||||
</article>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section v-reveal class="hall-coaches">
|
||||
<div class="hall-coach-copy">
|
||||
<span class="hall-kicker">COACH TRAINING MECHANISM</span>
|
||||
<h3>培养优质可靠的教练</h3>
|
||||
<p>以持续教研、定期课评、阶段评赛和年度考核构建教练成长机制,确保课程标准与教学质量稳定落地。</p>
|
||||
<div class="hall-coach-rhythm">
|
||||
<span><b>每周</b>教研</span><span><b>每月</b>课评</span><span><b>每季度</b>评赛</span><span><b>每年</b>考核</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="hall-coach-numbers">
|
||||
<div><strong>100%</strong><span>资质证书持有率</span></div>
|
||||
<div><strong>100%</strong><span>具备赛事经验</span></div>
|
||||
<div><strong>10年</strong><span>专业教学积累</span></div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section v-reveal class="hall-footprint">
|
||||
<div class="hall-network-card">
|
||||
<div><span class="hall-kicker">NATIONAL NETWORK</span><h3>全国场馆服务网络</h3><p>跃动运动馆已在全国近20个城市布局30余家门店,为更多家庭提供专业、科学、有温度的青少年运动服务。</p></div>
|
||||
<img src="/sports-hall/city-network.png" alt="跃动运动馆全国服务城市分布图" loading="lazy" />
|
||||
</div>
|
||||
<div class="hall-gallery-card">
|
||||
<img src="/sports-hall/competition-collage.png" alt="跃动运动馆学员训练、表演与比赛精彩瞬间" loading="lazy" />
|
||||
<div><small>FROM TRAINING TO COMPETITION</small><h3>从训练场走向赛场</h3><p>让孩子在一次次公开展示与竞赛中积累经验、学会尊重、勇于挑战。</p></div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<div v-reveal class="hall-quote">
|
||||
<p>“让孩子们在一根绳的起落间,触摸跳绳文化的肌理、理解规则的重量、经历成长的蜕变,真正领会体育精神的内核。”</p>
|
||||
<RouterLink to="/detail/education/venues">了解跃动运动馆详情 <span>→</span></RouterLink>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
const concerns = ['协调性差', '体能不足', '身高发育', '容易生病', '挑食', '体重管理', '容易摔倒', '胆小', '情绪管理'];
|
||||
|
||||
const values = [
|
||||
{ en: 'Joyful', title: '趣味性 · 欢乐的运动场', description: '享受运动乐趣,在愉悦的环境中健康成长。', color: '#38b878' },
|
||||
{ en: 'Respect', title: '学会尊重 · 做有品德的人', description: '遵守规则、尊重对手,在公平竞争中成长。', color: '#38b878' },
|
||||
{ en: 'Useful', title: '实用性 · 知识的试验场', description: '在知识的使用与迁移中,让思用贯通、知行统一。', color: '#18a1db' },
|
||||
{ en: 'Open', title: '自信开放 · 做有品位的人', description: '心胸宽广、雍容大度,以开放姿态面对世界。', color: '#18a1db' },
|
||||
{ en: 'Magic', title: '进阶性 · 技能的竞技场', description: '用清晰指标呈现进步,保持持续学习动力。', color: '#ff9455' },
|
||||
{ en: 'Power', title: '刚强有力 · 做有品格的人', description: '刚健有为、顽强拼搏,在挑战中自强不息。', color: '#ff9455' },
|
||||
{ en: 'Potent', title: '激发性 · 潜能的开发场', description: '在有难度的挑战中超越自我,挖掘更多潜力。', color: '#8d79c5' },
|
||||
{ en: 'Excellent', title: '追求卓越 · 做有品质的人', description: '志向远大、精益求精,在创新中不断超越。', color: '#8d79c5' }
|
||||
];
|
||||
|
||||
const levels = [
|
||||
{ name: 'JUMP A', subtitle: '启蒙课程', duration: '约3个月 · 24次课', description: '从认识跳绳和基础动作开始,建立兴趣与规则意识。', targets: ['学会跳绳', '一级标准', '亲子赛体验'] },
|
||||
{ name: 'JUMP B', subtitle: '入门与新锐', duration: '约1年 · 48次课', description: '发展节奏、协调和连续跳跃能力,进入系统训练。', targets: ['二至四级标准', '轮换跳40—80次', '普及性赛事'] },
|
||||
{ name: 'JUMP C', subtitle: '进阶与精英', duration: '约3年 · 48次课', description: '强化速度、耐力与花样组合,建立专项竞技能力。', targets: ['五至六级标准', '轮换跳100—120次', '大师赛与锦标赛'] },
|
||||
{ name: '大师班', subtitle: '校区校队', duration: '长期培养 · 约6年路径', description: '采用专业校队训练模式,面向更高水平赛事与展示。', targets: ['七至十级', '专项技术提升', '高水平赛事'] }
|
||||
];
|
||||
|
||||
const growthSteps = [
|
||||
{ title: '上课', description: '每周有课程,稳定积累动作与体能。' },
|
||||
{ title: '活动', description: '每月有活动,在同伴互动中提升兴趣。' },
|
||||
{ title: '考级', description: '每季度有考核,让进步清晰可见。' },
|
||||
{ title: '表演', description: '每半年有表演,建立表达与自信。' },
|
||||
{ title: '比赛', description: '每年有比赛,用真实目标驱动成长。' }
|
||||
];
|
||||
|
||||
const vReveal = {
|
||||
mounted(el) {
|
||||
el.classList.add('reveal');
|
||||
const observer = new IntersectionObserver(([entry]) => {
|
||||
if (entry.isIntersecting) {
|
||||
el.classList.add('is-visible');
|
||||
observer.disconnect();
|
||||
}
|
||||
}, { threshold: 0.1 });
|
||||
observer.observe(el);
|
||||
}
|
||||
};
|
||||
</script>
|
||||
@ -543,7 +543,7 @@
|
||||
"type": "image",
|
||||
"name": "成长规划",
|
||||
"group": "①-跃动运动馆",
|
||||
"url": "/materials/教育培训/001-成长规划.webp"
|
||||
"url": "/sports-hall/brand-banner.png"
|
||||
},
|
||||
{
|
||||
"type": "document",
|
||||
@ -583,7 +583,7 @@
|
||||
"type": "image",
|
||||
"name": "2026青浦青促中心 (1)",
|
||||
"group": ".",
|
||||
"url": "/materials/跃动健康/001-青浦青促中心-1.webp"
|
||||
"url": "/materials/跃动健康/003-青浦青促中心-4.webp"
|
||||
},
|
||||
{
|
||||
"type": "image",
|
||||
|
||||
@ -11,6 +11,39 @@ const doc = (match) => {
|
||||
};
|
||||
const paragraphs = (lines, max = 12) => lines.filter((line) => line.length > 12).slice(0, max);
|
||||
|
||||
const healthPresentationImages = [
|
||||
'国家体育总局 2025 年全国青少年体育工作会议',
|
||||
'《“健康中国2030”规划纲要》',
|
||||
'《家校社协同育人“教联体”工作方案》',
|
||||
'《上海市运动促进健康计划(2024—2026)》',
|
||||
'《深化新时代中小学体育工作高质量发展的若干措施》',
|
||||
'儿童心理健康',
|
||||
'儿童脊柱侧弯',
|
||||
'儿童近视',
|
||||
'儿童肥胖',
|
||||
'青少年运动促进中心',
|
||||
'智慧场馆四位一体服务体系',
|
||||
'青浦区青少年运动健康促进中心',
|
||||
'青浦区青少年运动健康促进中心活动现场',
|
||||
'青浦区青少年运动健康促进中心训练现场',
|
||||
'青浦区青少年运动健康促进中心服务现场',
|
||||
'青少年跑酷课程',
|
||||
'青少年健康促进课程',
|
||||
'幼儿体适能课程',
|
||||
'跃动运动馆课程现场',
|
||||
'青浦区青少年运动健康促进中心课程',
|
||||
'AI 心灵教室',
|
||||
'体重运动管理',
|
||||
'体态运动管理',
|
||||
...Array.from({ length: 11 }, (_, index) => `青浦区青少年运动健康促进中心活动纪实 ${index + 1}`),
|
||||
'合作办训基地',
|
||||
'长三角一体化示范区跳绳研究发展中心'
|
||||
].map((alt, index) => ({
|
||||
src: `/materials/跃动健康/ppt/${String(index + 1).padStart(2, '0')}.webp`,
|
||||
alt,
|
||||
title: alt
|
||||
}));
|
||||
|
||||
const aboutDocument = doc('1-关于跃动');
|
||||
const historyHeadingIndex = aboutDocument.findIndex((line) => line.includes('跃动历程'));
|
||||
const brandIntroduction = paragraphs(historyHeadingIndex > -1 ? aboutDocument.slice(0, historyHeadingIndex) : aboutDocument.slice(0, 4), 8);
|
||||
@ -91,7 +124,7 @@ export const pages = {
|
||||
},
|
||||
health: {
|
||||
eyebrow: 'YUEDONG HEALTH', title: '跃动健康', summary: '连接体适能、运动管理与青少年健康促进服务。', hero: images('跃动健康')[0],
|
||||
sections: { default: { title: '运动促进健康', body: paragraphs(doc('6-跃动健康'), 22), gallery: images('跃动健康').slice(0, 16) } }
|
||||
sections: { default: { title: '运动促进健康', body: paragraphs(doc('6-跃动健康'), 22), gallery: images('跃动健康').slice(0, 16), slides: healthPresentationImages } }
|
||||
},
|
||||
ygjrc: {
|
||||
eyebrow: 'GLOBAL JUMP ROPE CLUB', title: 'YGJRC', summary: '跃动全球跳绳俱乐部,连接全球运动员、教练与跳绳推广者。',
|
||||
@ -114,3 +147,27 @@ pages.about.sections['brand-story'].body = brandIntroduction;
|
||||
pages.about.sections['brand-story'].timeline = aboutTimeline;
|
||||
pages.about.sections.history.body = [];
|
||||
pages.about.sections.history.timeline = aboutTimeline;
|
||||
|
||||
Object.assign(pages.education, {
|
||||
eyebrow: 'EDUCATION & TRAINING',
|
||||
title: '教育培训',
|
||||
summary: '以专业课程、科学训练和成长陪伴,构建青少年跳绳教育体系。',
|
||||
tabs: [
|
||||
{ key: 'venues', label: '跃动运动馆' },
|
||||
{ key: 'camps', label: '寒暑营' },
|
||||
{ key: 'training', label: '训练营' }
|
||||
]
|
||||
});
|
||||
Object.assign(pages.education.sections.venues, {
|
||||
title: '跃动运动馆',
|
||||
body: [
|
||||
'跃动运动馆成立于2016年,目前已在全国近20个城市开设30余家门店,是面向青少年以跳绳为核心、融合体适能与幼儿体育的线下培训平台。',
|
||||
'通过体质体征测评、运动能力评估、运动指导及干预等科学方法形成体育运动整套解决方案,实现提升运动能力、培养健康行为、塑造体育品德的三大目标。'
|
||||
],
|
||||
gallery: [
|
||||
{ src: '/sports-hall/brand-banner.png', alt: '跃动运动馆品牌介绍' },
|
||||
{ src: '/sports-hall/child-jumping.png', alt: '跃动运动馆学员训练' },
|
||||
{ src: '/sports-hall/city-network.png', alt: '全国场馆服务城市分布' },
|
||||
{ src: '/sports-hall/competition-collage.png', alt: '学员训练与比赛精彩瞬间' }
|
||||
]
|
||||
});
|
||||
|
||||
182
src/style.css
@ -80,30 +80,45 @@ main { min-height: 72vh; }
|
||||
.reveal.is-visible { opacity: 1; transform: translateY(0); }
|
||||
|
||||
/* Vue-native homepage */
|
||||
.new-home { overflow: hidden; background: #fff; }
|
||||
.home-hero { position: relative; min-height: 860px; padding-top: 78px; isolation: isolate; overflow: hidden; color: #fff; background: #0090ff; }
|
||||
.home-hero-media { position: absolute; inset: 0; z-index: -3; background: url('/site/assets/images/banners/banner.png') center/cover no-repeat; transform: scale(1.03); animation: heroBreath 12s ease-in-out infinite alternate; }
|
||||
.new-home { overflow: hidden; background: #fff; padding-top: 78px;}
|
||||
.home-hero { position: relative; min-height: 800px; isolation: isolate; overflow: hidden; color: #fff; background: #0090ff; }
|
||||
.home-hero-media { position: absolute; inset: 0; z-index: -4; width: 100%; background: url('/site/assets/images/banners/banner.png') 68% center/cover no-repeat; transform: scale(1.015); transform-origin: right center; animation: heroBreath 14s ease-in-out infinite alternate; }
|
||||
@keyframes heroBreath { to { transform: scale(1.09); } }
|
||||
.home-hero-shade { position: absolute; inset: 0; z-index: -2; background: linear-gradient(90deg,rgba(0,100,184,.91) 0%,rgba(0,144,255,.69) 46%,rgba(0,144,255,.16) 82%),linear-gradient(0deg,rgba(0,111,201,.66),transparent 62%); }
|
||||
.home-hero-grid { position: absolute; inset: 0; z-index: -1; opacity: .14; background-image: linear-gradient(rgba(255,255,255,.2) 1px,transparent 1px),linear-gradient(90deg,rgba(255,255,255,.2) 1px,transparent 1px); background-size: 72px 72px; mask-image: linear-gradient(90deg,#000,transparent 72%); }
|
||||
.home-hero-ring { position: absolute; z-index: -1; border: 1px solid rgba(130,202,255,.24); border-radius: 50%; animation: orbit 18s linear infinite; }
|
||||
.home-hero-shade { position: absolute; inset: 0; z-index: -3; width: 100%; background: linear-gradient(90deg,transparent 45%,rgba(0,43,82,.04) 70%,rgba(0,20,42,.18) 100%); }
|
||||
.home-hero-solid { position: absolute; inset: 0; z-index: -2; width: 100%; background: linear-gradient(90deg,#006fc9 0%,#0086ec 30%,#0090ff 45%,rgba(0,144,255,.98) 50%,rgba(0,144,255,.86) 55%,rgba(0,144,255,.56) 61%,rgba(0,144,255,.22) 68%,rgba(0,144,255,0) 76%); }
|
||||
.home-hero-grid { display: none; }
|
||||
.home-hero-ring { display: none; }
|
||||
.home-hero-ring::after { content: ""; position: absolute; left: 12%; top: 12%; width: 9px; height: 9px; border-radius: 50%; background: #fff; box-shadow: 0 0 22px var(--blue-300); }
|
||||
.ring-one { width: 570px; height: 570px; right: -160px; top: 120px; }.ring-two { width: 280px; height: 280px; right: 115px; top: 260px; animation-direction: reverse; animation-duration: 12s; }
|
||||
.home-hero-content { min-height: 780px; display: flex; flex-direction: column; justify-content: center; align-items: flex-start; }
|
||||
.home-hero-content { min-height: 720px; display: flex; flex-direction: column; justify-content: center; align-items: flex-start; }
|
||||
.home-eyebrow { display: flex; align-items: center; gap: 14px; color: var(--blue-300); font-size: 11px; font-weight: 800; letter-spacing: 4px; }
|
||||
.home-eyebrow::before { content: ""; width: 42px; height: 2px; background: var(--blue-600); }
|
||||
.home-hero h1 { margin: 22px 0 24px; font-size: clamp(68px,8.3vw,122px); line-height: .94; letter-spacing: -7px; text-shadow: 0 18px 55px rgba(0,0,0,.26); }
|
||||
.home-hero h1 { margin: 22px 0 24px; max-width: 650px; font-size: clamp(66px,7.3vw,108px); line-height: .96; letter-spacing: -6px; text-shadow: 0 18px 45px rgba(0,69,132,.2); }
|
||||
.home-hero h1 em { color: var(--blue-600); font-style: normal; }
|
||||
.home-hero-content > p { max-width: 670px; margin: 0; color: rgba(235,247,255,.75); font-size: 17px; line-height: 1.9; }
|
||||
.home-hero-content > p { max-width: 720px; margin: 0; color: rgba(255,255,255,.92); font-size: clamp(19px,1.45vw,23px); font-weight: 500; line-height: 1.75; text-align: center; text-wrap: balance; text-shadow: 0 5px 20px rgba(0,61,118,.16); }
|
||||
.home-hero-actions { display: flex; align-items: center; gap: 16px; margin-top: 36px; }
|
||||
.home-primary-button,.home-ghost-button { display: inline-flex; align-items: center; justify-content: center; min-height: 52px; padding: 0 24px; border-radius: 11px; font-size: 13px; font-weight: 700; transition: .3s; }
|
||||
.home-primary-button { gap: 30px; color: #fff; background: var(--blue-600); box-shadow: 0 16px 35px rgba(0,144,255,.3); }.home-primary-button span { transition: transform .25s; }.home-primary-button:hover { transform: translateY(-4px); box-shadow: 0 22px 42px rgba(0,144,255,.4); }.home-primary-button:hover span { transform: translateX(6px); }
|
||||
.home-ghost-button { color: #fff; border: 1px solid rgba(255,255,255,.35); background: rgba(255,255,255,.06); backdrop-filter: blur(10px); }.home-ghost-button:hover { border-color: var(--blue-300); background: rgba(0,144,255,.16); }
|
||||
.home-stats { position: absolute; left: 5%; bottom: 36px; display: grid; grid-template-columns: repeat(4,auto); gap: 0; }
|
||||
.home-stats { position: absolute; left: 50%; transform: translateX(-50%); bottom: 36px; display: grid; grid-template-columns: repeat(4,auto); gap: 0; }
|
||||
.home-stats > div { min-width: 150px; padding: 0 30px; border-left: 1px solid rgba(255,255,255,.2); }.home-stats > div:first-child { padding-left: 0; border-left: 0; }
|
||||
.home-stats strong,.home-stats span { display: block; }.home-stats strong { font-size: 22px; }.home-stats span { margin-top: 6px; color: rgba(235,247,255,.5); font-size: 10px; letter-spacing: 1px; }
|
||||
.home-scroll { position: absolute; right: 34px; bottom: 36px; display: flex; align-items: center; gap: 13px; color: rgba(255,255,255,.48); font-size: 8px; letter-spacing: 2px; writing-mode: vertical-rl; }.home-scroll i { position: relative; display: block; width: 1px; height: 55px; overflow: hidden; background: rgba(255,255,255,.2); }.home-scroll i::after { content: ""; position: absolute; inset: -100% 0 auto; height: 100%; background: #fff; animation: scrollLine 2s ease-in-out infinite; }
|
||||
.home-about { display: grid; grid-template-columns: minmax(360px,.9fr) minmax(0,1.1fr); gap: 95px; align-items: center; padding-top: 120px; padding-bottom: 130px; }
|
||||
.home-honor-carousel { position: relative; min-height: 540px; overflow: hidden; border: 1px solid rgba(0,144,255,.14); border-radius: 30px 6px 30px 6px; background: linear-gradient(145deg,#fff,var(--blue-50)); box-shadow: var(--shadow); isolation: isolate; }
|
||||
.home-honor-carousel::after { content: ""; position: absolute; inset: 0; z-index: 1; border: 1px solid rgba(255,255,255,.58); border-radius: inherit; pointer-events: none; }
|
||||
.home-honor-slide { position: absolute; inset: 0; z-index: 0; opacity: 0; visibility: hidden; transform: scale(1.035); transition: opacity .75s ease, visibility .75s ease, transform 1.1s cubic-bezier(.2,.8,.2,1); pointer-events: none; }
|
||||
.home-honor-slide.active { z-index: 1; opacity: 1; visibility: visible; transform: scale(1); pointer-events: auto; }
|
||||
.home-honor-slide img { width: 100%; height: 100%; padding: 26px; object-fit: contain; background: radial-gradient(circle at 50% 42%,#fff 0%,#f4faff 72%,#e2f3ff 100%); }
|
||||
.home-honor-slide > div { position: absolute; inset: auto 0 0; display: flex; flex-direction: column; gap: 8px; padding: 80px 32px 70px; color: #fff; background: linear-gradient(transparent,rgba(0,75,139,.92)); }
|
||||
.home-honor-slide small { color: rgba(255,255,255,.7); font-size: 9px; font-weight: 800; letter-spacing: 2px; }
|
||||
.home-honor-slide strong { max-width: 82%; font-size: clamp(22px,2.2vw,32px); line-height: 1.3; }
|
||||
.home-honor-controls { position: absolute; right: 22px; bottom: 20px; left: 22px; z-index: 3; display: flex; align-items: center; justify-content: space-between; pointer-events: none; }
|
||||
.home-honor-controls > button { width: 38px; height: 38px; padding: 0; color: #fff; border: 1px solid rgba(255,255,255,.42); border-radius: 50%; background: rgba(0,107,201,.45); backdrop-filter: blur(10px); cursor: pointer; pointer-events: auto; transition: transform .25s ease, background .25s ease; }
|
||||
.home-honor-controls > button:hover { background: var(--blue-600); transform: translateY(-2px); }
|
||||
.home-honor-controls > div { display: flex; align-items: center; gap: 7px; pointer-events: auto; }
|
||||
.home-honor-controls > div button { width: 8px; height: 8px; padding: 0; border: 0; border-radius: 999px; background: rgba(255,255,255,.45); cursor: pointer; transition: width .3s ease, background .3s ease; }
|
||||
.home-honor-controls > div button.active { width: 28px; background: #fff; }
|
||||
.home-about-image { position: relative; }.home-about-image::before { content: ""; position: absolute; left: -22px; bottom: -22px; width: 72%; height: 70%; background: var(--blue-100); border-radius: 28px 5px 28px 5px; }.home-about-image img { position: relative; z-index: 1; width: 100%; min-height: 540px; object-fit: cover; border-radius: 30px 6px 30px 6px; box-shadow: var(--shadow); }.home-about-image > span { position: absolute; right: -28px; bottom: 55px; z-index: 2; padding: 18px 22px; color: #fff; border-radius: 12px 3px 12px 3px; background: var(--blue-600); box-shadow: 0 15px 36px rgba(0,144,255,.3); font-size: 10px; font-weight: 800; letter-spacing: 2px; }
|
||||
.home-section-label { color: var(--blue-600); font-size: 10px; font-weight: 800; letter-spacing: 4px; }
|
||||
.home-about-copy h2 { margin: 14px 0 28px; color: var(--ink); font-size: clamp(38px,4.4vw,59px); line-height: 1.22; letter-spacing: -3px; }.home-about-copy > p { max-width: 690px; margin: 0; color: #536b83; font-size: 15px; line-height: 2; }
|
||||
@ -133,6 +148,135 @@ main { min-height: 72vh; }
|
||||
}
|
||||
@keyframes homeReveal { from { opacity: .25; transform: translateY(26px); } to { opacity: 1; transform: translateY(0); } }
|
||||
|
||||
/* Yuedong Jumping Home */
|
||||
.sports-hall-page { display: grid; gap: 92px; }
|
||||
.hall-kicker { color: var(--blue-600); font-size: 10px; font-weight: 900; letter-spacing: 3px; }
|
||||
.sports-hall-page h3 { color: var(--ink); font-size: clamp(32px,4vw,52px); line-height: 1.18; letter-spacing: -2px; }
|
||||
.hall-intro { position: relative; display: grid; grid-template-columns: minmax(0,1.05fr) minmax(380px,.95fr); min-height: 590px; overflow: hidden; border-radius: 32px 7px 32px 7px; background: linear-gradient(125deg,#006fc9 0%,#0090ff 66%,#39b3ff 100%); box-shadow: 0 28px 70px rgba(0,92,175,.2); }
|
||||
.hall-intro::before { content: ""; position: absolute; right: -160px; bottom: -330px; width: 760px; height: 760px; border: 2px solid rgba(255,225,0,.65); border-radius: 50%; box-shadow: 0 0 0 80px rgba(255,225,0,.08),0 0 0 160px rgba(255,225,0,.05); }
|
||||
.hall-intro-copy { position: relative; z-index: 2; align-self: center; padding: 76px 20px 120px 70px; color: #fff; }
|
||||
.hall-intro-copy .hall-kicker { color: #ffe500; }
|
||||
.hall-intro-copy h3 { max-width: 650px; margin: 16px 0 26px; color: #fff; font-size: clamp(46px,5.4vw,76px); }
|
||||
.hall-intro-copy h3 em { color: #ffe500; font-style: normal; }
|
||||
.hall-intro-copy > p { max-width: 680px; margin: 0; color: rgba(255,255,255,.86); font-size: 16px; line-height: 2; }
|
||||
.hall-goals { display: flex; flex-wrap: wrap; gap: 9px; margin-top: 30px; }
|
||||
.hall-goals span { padding: 10px 14px; border: 1px solid rgba(255,255,255,.28); border-radius: 999px; background: rgba(255,255,255,.09); font-size: 12px; font-weight: 700; backdrop-filter: blur(8px); }
|
||||
.hall-intro-visual { position: relative; z-index: 1; display: flex; align-items: flex-end; justify-content: center; padding: 55px 25px 65px 0; }
|
||||
.hall-intro-visual img { width: min(100%,610px); max-height: 510px; object-fit: contain; filter: drop-shadow(0 28px 35px rgba(0,47,91,.2)); animation: hallFloat 5s ease-in-out infinite; }
|
||||
@keyframes hallFloat { 50% { transform: translateY(-12px); } }
|
||||
.hall-stats { position: absolute; left: 70px; bottom: 38px; z-index: 3; display: flex; gap: 0; }
|
||||
.hall-stats > div { min-width: 130px; padding: 0 24px; border-left: 1px solid rgba(255,255,255,.25); }
|
||||
.hall-stats > div:first-child { padding-left: 0; border-left: 0; }
|
||||
.hall-stats strong,.hall-stats span { display: block; }
|
||||
.hall-stats strong { color: #fff; font-size: 26px; }
|
||||
.hall-stats span { margin-top: 5px; color: rgba(255,255,255,.62); font-size: 10px; letter-spacing: 1px; }
|
||||
.hall-science { display: grid; grid-template-columns: minmax(0,.88fr) minmax(420px,1.12fr); gap: 70px; align-items: center; }
|
||||
.hall-section-copy h3,.hall-section-title h3,.hall-coach-copy h3,.hall-network-card h3,.hall-gallery-card h3 { margin: 13px 0 20px; }
|
||||
.hall-section-copy > p,.hall-section-title > p,.hall-coach-copy > p,.hall-network-card p,.hall-gallery-card p { color: var(--muted); line-height: 1.9; }
|
||||
.hall-concerns { display: flex; flex-wrap: wrap; gap: 10px; margin-top: 30px; }
|
||||
.hall-concerns span { padding: 10px 15px; color: #4b6178; border: 1px solid var(--line); border-radius: 10px; background: #fff; box-shadow: 0 8px 20px rgba(0,72,135,.05); font-size: 12px; }
|
||||
.hall-assessment { padding: 38px; border: 1px solid rgba(0,144,255,.12); border-radius: 27px 6px 27px 6px; background: linear-gradient(145deg,#fff,#eef8ff); box-shadow: var(--shadow); }
|
||||
.hall-assessment > small { color: var(--blue-600); font-size: 9px; font-weight: 900; letter-spacing: 3px; }
|
||||
.hall-assessment ol { display: grid; gap: 12px; margin: 22px 0 0; padding: 0; list-style: none; }
|
||||
.hall-assessment li { display: grid; grid-template-columns: 55px 1fr; gap: 18px; align-items: center; padding: 18px; border-radius: 14px; background: #fff; box-shadow: 0 8px 22px rgba(0,72,135,.06); transition: transform .3s ease; }
|
||||
.hall-assessment li:hover { transform: translateX(7px); }
|
||||
.hall-assessment li > b { color: rgba(0,144,255,.25); font-size: 25px; }
|
||||
.hall-assessment strong,.hall-assessment span { display: block; }
|
||||
.hall-assessment strong { color: var(--ink); font-size: 16px; }
|
||||
.hall-assessment span { margin-top: 5px; color: var(--muted); font-size: 12px; }
|
||||
.hall-section-title { max-width: 780px; margin: 0 auto 44px; text-align: center; }
|
||||
.hall-values-grid { display: grid; grid-template-columns: repeat(4,1fr); gap: 16px; }
|
||||
.hall-values-grid article { position: relative; min-height: 240px; overflow: hidden; padding: 27px 24px; border: 1px solid color-mix(in srgb,var(--value-color) 30%,#fff); border-radius: 20px 5px 20px 5px; background: #fff; box-shadow: 0 12px 34px rgba(0,72,135,.07); transition: transform .35s ease,box-shadow .35s ease; }
|
||||
.hall-values-grid article::after { content: ""; position: absolute; right: -55px; bottom: -70px; width: 150px; height: 150px; border-radius: 50%; background: color-mix(in srgb,var(--value-color) 10%,transparent); }
|
||||
.hall-values-grid article:hover { transform: translateY(-8px); box-shadow: 0 24px 48px rgba(0,72,135,.13); }
|
||||
.hall-values-grid article > div { display: flex; align-items: baseline; gap: 7px; color: var(--value-color); }
|
||||
.hall-values-grid article b { font-size: 42px; line-height: 1; }
|
||||
.hall-values-grid article small { font-size: 11px; font-weight: 900; text-transform: uppercase; letter-spacing: 1px; }
|
||||
.hall-values-grid h4 { margin: 24px 0 12px; color: var(--value-color); font-size: 17px; }
|
||||
.hall-values-grid p { position: relative; z-index: 1; margin: 0; color: var(--muted); font-size: 13px; line-height: 1.75; }
|
||||
.hall-curriculum { margin-right: calc((100vw - 100%)/-2); margin-left: calc((100vw - 100%)/-2); padding: 90px max(5vw,calc((100vw - 1200px)/2)); color: #fff; background: linear-gradient(135deg,#006fc9,#0090ff 62%,#42b5ff); }
|
||||
.hall-section-title.light h3 { color: #fff; }
|
||||
.hall-section-title.light .hall-kicker { color: #b9e4ff; }
|
||||
.hall-section-title.light p { color: rgba(255,255,255,.72); }
|
||||
.hall-levels { display: grid; grid-template-columns: repeat(4,1fr); gap: 16px; }
|
||||
.hall-levels article { position: relative; min-height: 390px; padding: 28px 24px; border: 1px solid rgba(255,255,255,.17); border-radius: 22px 5px 22px 5px; background: rgba(255,255,255,.09); backdrop-filter: blur(10px); transition: transform .35s ease,background .35s ease; }
|
||||
.hall-levels article:hover { transform: translateY(-8px); background: rgba(255,255,255,.15); }
|
||||
.hall-levels article > span { position: absolute; right: 22px; top: 18px; color: rgba(255,255,255,.18); font-size: 38px; font-weight: 900; }
|
||||
.hall-levels small { color: #bce6ff; font-size: 10px; font-weight: 800; letter-spacing: 1px; }
|
||||
.hall-levels h4 { margin: 30px 0 8px; font-size: 30px; }
|
||||
.hall-levels strong { color: #ffe500; font-size: 15px; }
|
||||
.hall-levels p { min-height: 78px; color: rgba(255,255,255,.72); font-size: 13px; line-height: 1.75; }
|
||||
.hall-levels ul { display: grid; gap: 9px; margin: 22px 0 0; padding: 0; list-style: none; }
|
||||
.hall-levels li { padding-top: 9px; border-top: 1px solid rgba(255,255,255,.15); color: rgba(255,255,255,.86); font-size: 12px; }
|
||||
.hall-loop-steps { position: relative; display: grid; grid-template-columns: repeat(5,1fr); gap: 14px; }
|
||||
.hall-loop-steps::before { content: ""; position: absolute; top: 36px; right: 8%; left: 8%; height: 2px; background: linear-gradient(90deg,#a9ddff,#0090ff,#ffe500); }
|
||||
.hall-loop-steps article { position: relative; padding: 78px 18px 24px; text-align: center; border: 1px solid var(--line); border-radius: 18px 4px 18px 4px; background: #fff; box-shadow: 0 12px 28px rgba(0,72,135,.07); }
|
||||
.hall-loop-steps b { position: absolute; top: 15px; left: 50%; width: 43px; height: 43px; display: grid; place-items: center; color: #fff; border: 5px solid #fff; border-radius: 50%; background: var(--blue-600); box-shadow: 0 0 0 1px var(--line); transform: translateX(-50%); }
|
||||
.hall-loop-steps h4 { margin: 0 0 10px; color: var(--ink); font-size: 18px; }
|
||||
.hall-loop-steps p { margin: 0; color: var(--muted); font-size: 12px; line-height: 1.7; }
|
||||
.hall-coaches { display: grid; grid-template-columns: minmax(0,1fr) minmax(430px,.86fr); gap: 70px; align-items: center; padding: 54px; border-radius: 28px 6px 28px 6px; background: linear-gradient(145deg,#f2faff,#fff); box-shadow: var(--shadow); }
|
||||
.hall-coach-rhythm { display: grid; grid-template-columns: repeat(2,1fr); gap: 10px; margin-top: 28px; }
|
||||
.hall-coach-rhythm span { padding: 13px 15px; color: var(--muted); border-radius: 10px; background: #fff; font-size: 12px; }
|
||||
.hall-coach-rhythm b { margin-right: 7px; color: var(--blue-600); }
|
||||
.hall-coach-numbers { display: grid; gap: 12px; }
|
||||
.hall-coach-numbers > div { display: grid; grid-template-columns: 130px 1fr; align-items: center; gap: 20px; padding: 20px 24px; border: 1px solid rgba(0,144,255,.12); border-radius: 14px; background: #fff; }
|
||||
.hall-coach-numbers strong { color: var(--blue-600); font-size: 30px; }
|
||||
.hall-coach-numbers span { color: #3f5870; font-size: 14px; }
|
||||
.hall-footprint { display: grid; grid-template-columns: repeat(2,1fr); gap: 22px; }
|
||||
.hall-network-card,.hall-gallery-card { overflow: hidden; border: 1px solid var(--line); border-radius: 25px 5px 25px 5px; background: #fff; box-shadow: var(--shadow); }
|
||||
.hall-network-card > div,.hall-gallery-card > div { padding: 34px 36px; }
|
||||
.hall-network-card h3,.hall-gallery-card h3 { font-size: 30px; }
|
||||
.hall-network-card img { display: block; width: 100%; height: 360px; padding: 16px 28px 30px; object-fit: contain; }
|
||||
.hall-gallery-card { display: flex; flex-direction: column; background: #007cd9; }
|
||||
.hall-gallery-card > img { order: 2; width: 100%; height: 410px; padding: 0 16px 18px; object-fit: contain; }
|
||||
.hall-gallery-card > div { color: #fff; }
|
||||
.hall-gallery-card small { color: #a8ddff; font-size: 9px; font-weight: 900; letter-spacing: 2px; }
|
||||
.hall-gallery-card h3 { color: #fff; }
|
||||
.hall-gallery-card p { color: rgba(255,255,255,.72); }
|
||||
.hall-quote { max-width: 950px; margin: -20px auto 0; text-align: center; }
|
||||
.hall-quote p { margin: 0; color: var(--ink); font-size: clamp(24px,3vw,36px); font-weight: 700; line-height: 1.65; letter-spacing: -1px; }
|
||||
.hall-quote a { display: inline-flex; align-items: center; gap: 22px; margin-top: 28px; padding: 14px 20px; color: #fff; border-radius: 10px; background: var(--blue-600); box-shadow: 0 14px 30px rgba(0,144,255,.25); font-size: 13px; font-weight: 800; transition: transform .3s ease; }
|
||||
.hall-quote a:hover { transform: translateY(-4px); }
|
||||
|
||||
@media (max-width: 1050px) {
|
||||
.hall-intro { grid-template-columns: 1fr; }
|
||||
.hall-intro-copy { padding-right: 60px; }
|
||||
.hall-intro-visual { position: absolute; right: -80px; bottom: 0; width: 52%; opacity: .28; }
|
||||
.hall-science,.hall-coaches { grid-template-columns: 1fr; }
|
||||
.hall-values-grid,.hall-levels { grid-template-columns: repeat(2,1fr); }
|
||||
.hall-footprint { grid-template-columns: 1fr; }
|
||||
}
|
||||
|
||||
@media (max-width: 700px) {
|
||||
.sports-hall-page { gap: 64px; }
|
||||
.hall-intro { min-height: 700px; border-radius: 22px 5px 22px 5px; }
|
||||
.hall-intro-copy { align-self: start; padding: 55px 24px 185px; }
|
||||
.hall-intro-copy h3 { font-size: 46px; }
|
||||
.hall-intro-copy > p { font-size: 14px; }
|
||||
.hall-intro-visual { right: -20px; bottom: 20px; width: 78%; padding: 0; opacity: .24; }
|
||||
.hall-stats { right: 22px; bottom: 28px; left: 22px; justify-content: space-between; }
|
||||
.hall-stats > div { min-width: 0; padding: 0 12px; }
|
||||
.hall-stats strong { font-size: 21px; }
|
||||
.hall-science { gap: 32px; }
|
||||
.hall-assessment { padding: 22px 17px; }
|
||||
.hall-assessment li { grid-template-columns: 42px 1fr; gap: 10px; padding: 15px 12px; }
|
||||
.hall-values-grid,.hall-levels { grid-template-columns: 1fr; }
|
||||
.hall-values-grid article { min-height: 205px; }
|
||||
.hall-curriculum { padding-top: 70px; padding-bottom: 70px; }
|
||||
.hall-levels article { min-height: 0; }
|
||||
.hall-levels p { min-height: 0; }
|
||||
.hall-loop-steps { grid-template-columns: 1fr; }
|
||||
.hall-loop-steps::before { top: 25px; bottom: 25px; left: 31px; width: 2px; height: auto; }
|
||||
.hall-loop-steps article { padding: 21px 20px 21px 78px; text-align: left; }
|
||||
.hall-loop-steps b { top: 50%; left: 31px; transform: translate(-50%,-50%); }
|
||||
.hall-coaches { gap: 35px; padding: 30px 22px; }
|
||||
.hall-coach-numbers > div { grid-template-columns: 105px 1fr; padding: 17px; }
|
||||
.hall-coach-numbers strong { font-size: 25px; }
|
||||
.hall-network-card > div,.hall-gallery-card > div { padding: 28px 24px; }
|
||||
.hall-network-card img { height: 270px; padding: 8px 12px 22px; }
|
||||
.hall-gallery-card > img { height: 310px; }
|
||||
}
|
||||
|
||||
/* Inner page hero */
|
||||
.page-hero { position: relative; height: clamp(350px, 38vw, 460px); padding-top: 78px; isolation: isolate; overflow: hidden; background: #0090ff center/cover no-repeat; }
|
||||
.page-hero::after { content: ""; position: absolute; inset: auto 0 0; z-index: 2; height: 48px; background: linear-gradient(transparent, rgba(3,26,61,.24)); }
|
||||
@ -164,7 +308,7 @@ main { min-height: 72vh; }
|
||||
.subnav a.active { color: #fff; background: linear-gradient(135deg,var(--blue-600),var(--blue-800)); box-shadow: 0 10px 24px rgba(8,120,232,.25); }
|
||||
|
||||
/* Inner content */
|
||||
.content-page { background: linear-gradient(180deg,#fff 0,var(--blue-50) 100%); }
|
||||
.content-page { background: linear-gradient(180deg,#fff 0,var(--blue-50) 100%); padding-top: 76px; }
|
||||
.content { padding: 96px 0 128px; }
|
||||
.section-heading { display: grid; grid-template-columns: 62px auto 1fr; align-items: center; gap: 20px; margin-bottom: 52px; }
|
||||
.section-heading > span { width: 62px; height: 62px; display: grid; place-items: center; color: #fff; border-radius: 18px 4px 18px 4px; background: linear-gradient(145deg,var(--blue-500),var(--blue-800)); box-shadow: 0 12px 28px rgba(8,120,232,.23); font-size: 18px; font-weight: 900; }
|
||||
@ -545,14 +689,20 @@ main { min-height: 72vh; }
|
||||
.members > div { grid-template-columns: repeat(2,1fr); }
|
||||
.footer-inner { grid-template-columns: 1.6fr 1fr 1fr; }
|
||||
.footer-inner > div:last-child { grid-column: 2; }
|
||||
.home-hero { min-height: 790px; padding-top: 70px; }
|
||||
.home-hero-content { min-height: 720px; }
|
||||
.home-hero { min-height: 760px; padding-top: 70px; }
|
||||
.home-hero-media { width: 100%; background-position: 68% center; }
|
||||
.home-hero-shade { width: 100%; }
|
||||
.home-hero-solid { width: 100%; background: linear-gradient(90deg,#006fc9 0%,#0090ff 56%,rgba(0,144,255,.96) 62%,rgba(0,144,255,.68) 70%,rgba(0,144,255,.28) 80%,rgba(0,144,255,0) 90%); }
|
||||
.home-hero-grid { display: none; }
|
||||
.home-hero-content { min-height: 690px; }
|
||||
.home-hero h1 { font-size: 78px; }
|
||||
.home-hero-content > p { max-width: 600px; }
|
||||
.home-stats { grid-template-columns: repeat(2,1fr); gap: 18px 0; bottom: 28px; }
|
||||
.home-stats > div:nth-child(3) { padding-left: 0; border-left: 0; }
|
||||
.home-scroll { display: none; }
|
||||
.home-about { grid-template-columns: 1fr; gap: 70px; }
|
||||
.home-about-image { width: min(650px,92%); }
|
||||
.home-honor-carousel { width: min(650px,92%); }
|
||||
.ecosystem-card:nth-child(n) { grid-column: span 6; }
|
||||
.home-innovation { grid-template-columns: 1fr; }
|
||||
.home-news-grid { grid-template-columns: repeat(2,1fr); }
|
||||
@ -609,12 +759,13 @@ main { min-height: 72vh; }
|
||||
.copyright { width: calc(100% - 36px); display: block; line-height: 2; }
|
||||
.copyright span { display: block; }
|
||||
.home-hero { min-height: 760px; }
|
||||
.home-hero-media { background-position: 64% center; }
|
||||
.home-hero-media,.home-hero-shade,.home-hero-grid { display: none; }
|
||||
.home-hero-shade { background: linear-gradient(90deg,rgba(0,99,183,.92),rgba(0,144,255,.7)),linear-gradient(0deg,rgba(0,111,201,.68),transparent 60%); }
|
||||
.home-hero-solid { width: 100%; clip-path: none; background: linear-gradient(145deg,#006fc9 0%,#0090ff 78%,#35a9ff 100%); }
|
||||
.home-hero-grid { background-size: 44px 44px; }
|
||||
.home-hero-content { min-height: 690px; justify-content: flex-start; padding-top: 105px; }
|
||||
.home-hero h1 { margin-top: 18px; font-size: 58px; line-height: 1; letter-spacing: -4px; }
|
||||
.home-hero-content > p { font-size: 14px; }
|
||||
.home-hero-content > p { max-width: 100%; font-size: 17px; line-height: 1.7; text-align: center; }
|
||||
.home-hero-actions { width: 100%; align-items: stretch; flex-direction: column; }
|
||||
.home-primary-button,.home-ghost-button { width: 100%; }
|
||||
.home-stats { left: 15px; right: 15px; grid-template-columns: repeat(2,1fr); }
|
||||
@ -622,6 +773,7 @@ main { min-height: 72vh; }
|
||||
.ring-one { width: 330px; height: 330px; right: -190px; top: 160px; }.ring-two { display: none; }
|
||||
.home-about { padding-top: 80px; padding-bottom: 90px; }
|
||||
.home-about-image { width: calc(100% - 14px); }.home-about-image img { min-height: 370px; }.home-about-image > span { right: -14px; bottom: 34px; }
|
||||
.home-honor-carousel { width: 100%; min-height: 410px; }
|
||||
.home-about-copy h2 { font-size: 36px; letter-spacing: -2px; }.home-about-points { grid-template-columns: 1fr; }
|
||||
.home-ecosystem,.home-products,.home-news { padding-top: 78px; padding-bottom: 85px; }
|
||||
.home-section-head { align-items: flex-start; flex-direction: column; gap: 20px; margin-bottom: 34px; }.home-section-head h2 { font-size: 40px; }.home-section-head > p { font-size: 14px; }
|
||||
|
||||
@ -41,6 +41,8 @@
|
||||
</RouterLink>
|
||||
</div>
|
||||
|
||||
<SportsHallSection v-else-if="pageKey === 'education' && activeKey === 'venues'" />
|
||||
|
||||
<div v-else-if="content.timeline?.length" class="timeline-page">
|
||||
<div v-if="content.body?.length" v-reveal class="story-layout timeline-intro">
|
||||
<div class="prose"><p v-for="line in content.body" :key="line">{{ line }}</p></div>
|
||||
@ -80,6 +82,8 @@
|
||||
</section>
|
||||
</div>
|
||||
|
||||
<HealthSection v-else-if="pageKey === 'health'" :slides="content.slides || []" />
|
||||
|
||||
<div v-else v-reveal class="story-layout">
|
||||
<div class="prose"><p v-for="line in content.body" :key="line">{{ line }}</p><RouterLink class="content-detail-link" :to="detailPath()">查看详情 <span>→</span></RouterLink></div>
|
||||
<img v-if="content.gallery?.[0]" :src="content.gallery[0].src" :alt="content.gallery[0].alt" loading="lazy" />
|
||||
@ -89,7 +93,7 @@
|
||||
<RouterLink v-for="(card, i) in content.cards" :key="card.title || card.alt" v-reveal :to="detailPath(i)" :style="{ '--delay': `${i * 80}ms` }"><span>0{{ i + 1 }}</span><h3>{{ card.title || card.alt }}</h3><p v-if="card.body">{{ card.body[0] }}</p><b>查看详情 →</b></RouterLink>
|
||||
</div>
|
||||
|
||||
<div v-if="content.gallery?.length > 1 && pageKey !== 'ygjrc'" class="gallery">
|
||||
<div v-if="content.gallery?.length > 1 && pageKey !== 'ygjrc' && pageKey !== 'health'" class="gallery">
|
||||
<figure v-for="(image, index) in content.gallery.slice(1, 13)" :key="image.src" v-reveal :style="{ '--delay': `${(index % 3) * 80}ms` }"><img :src="image.src" :alt="imageLabel(image)" loading="lazy" /><figcaption v-if="imageLabel(image)"><span>{{ String(index + 1).padStart(2, '0') }}</span>{{ imageLabel(image) }}</figcaption></figure>
|
||||
</div>
|
||||
|
||||
@ -106,6 +110,8 @@ import { computed, ref, watch } from 'vue';
|
||||
import { useRoute } from 'vue-router';
|
||||
import { pages } from '../data/page-content.js';
|
||||
import { ambassadorsImage, productAmbassadors, ygjrcMembers } from '../data/ygjrc-members.js';
|
||||
import SportsHallSection from '../components/SportsHallSection.vue';
|
||||
import HealthSection from '../components/HealthSection.vue';
|
||||
|
||||
const route = useRoute();
|
||||
const pageKey = computed(() => route.meta.page);
|
||||
|
||||
@ -1,8 +1,11 @@
|
||||
<template>
|
||||
<div class="new-home">
|
||||
<section class="home-hero">
|
||||
<div class="home-hero-media"></div><div class="home-hero-shade"></div><div class="home-hero-grid"></div>
|
||||
<div class="home-hero-ring ring-one"></div><div class="home-hero-ring ring-two"></div>
|
||||
<div class="home-hero-media"></div>
|
||||
<!-- <div class="home-hero-shade"></div> -->
|
||||
<div class="home-hero-solid"></div>
|
||||
<div class="home-hero-grid"></div>
|
||||
<!-- <div class="home-hero-ring ring-one"></div><div class="home-hero-ring ring-two"></div> -->
|
||||
<div class="container home-hero-content">
|
||||
<div class="home-eyebrow">YUEDONG · SINCE 2009</div>
|
||||
<h1>让世界<br /><em>爱上跳绳</em></h1>
|
||||
@ -19,7 +22,34 @@
|
||||
</section>
|
||||
|
||||
<section v-reveal class="home-about container">
|
||||
<div class="home-about-image"><img src="/site/assets/images/about/about.webp" alt="跃动品牌" /><span>15+ YEARS OF PASSION</span></div>
|
||||
<div class="home-honor-carousel" @mouseenter="stopHonorRotation" @mouseleave="startHonorRotation">
|
||||
<RouterLink
|
||||
v-for="(honor,index) in honors"
|
||||
:key="honor.title"
|
||||
to="/about/brand-story"
|
||||
class="home-honor-slide"
|
||||
:class="{ active: index === activeHonor }"
|
||||
:aria-hidden="index !== activeHonor"
|
||||
:tabindex="index === activeHonor ? 0 : -1"
|
||||
>
|
||||
<img :src="honor.image" :alt="honor.title" />
|
||||
<div><small>{{ honor.year }} · YUEDONG HONOR</small><strong>{{ honor.title }}</strong></div>
|
||||
</RouterLink>
|
||||
<div class="home-honor-controls">
|
||||
<button type="button" aria-label="上一项荣誉" @click="previousHonor">←</button>
|
||||
<div>
|
||||
<button
|
||||
v-for="(honor,index) in honors"
|
||||
:key="`${honor.title}-dot`"
|
||||
type="button"
|
||||
:class="{ active: index === activeHonor }"
|
||||
:aria-label="`查看${honor.title}`"
|
||||
@click="selectHonor(index)"
|
||||
></button>
|
||||
</div>
|
||||
<button type="button" aria-label="下一项荣誉" @click="nextHonor">→</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="home-about-copy">
|
||||
<div class="home-section-label">ABOUT YUEDONG</div><h2>从一根跳绳开始,<br />创造运动的更多可能</h2>
|
||||
<p>跃动体育创立于上海体育大学,是一家提供青少年运动健康促进整体解决方案的企业。我们持续深耕跳绳装备、赛事运营、教育培训与智慧体育,让专业运动走进更多校园、社区与家庭。</p>
|
||||
@ -28,14 +58,6 @@
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="home-ecosystem">
|
||||
<div v-reveal class="container home-section-head"><div><span>YUEDONG ECOSYSTEM</span><h2>跃动生态</h2></div><p>围绕运动全生命周期,构建覆盖产品、赛事、教育、科技与健康的专业服务体系。</p></div>
|
||||
<div class="container ecosystem-grid">
|
||||
<RouterLink v-for="(item,index) in ecosystems" :key="item.title" v-reveal :to="item.to" class="ecosystem-card" :style="{ '--delay': `${index * 70}ms`, backgroundImage: `url('${item.image}')` }">
|
||||
<div class="ecosystem-overlay"></div><span>0{{ index + 1 }}</span><div><small>{{ item.en }}</small><h3>{{ item.title }}</h3><p>{{ item.description }}</p><b>探索模块 →</b></div>
|
||||
</RouterLink>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="home-products">
|
||||
<div v-reveal class="container home-section-head light"><div><span>FEATURED EQUIPMENT</span><h2>精选产品装备</h2></div><RouterLink to="/products/categories">查看全部 82 款产品 →</RouterLink></div>
|
||||
@ -47,10 +69,6 @@
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="home-innovation container">
|
||||
<RouterLink v-reveal to="/technology" class="innovation-card technology-card"><div><small>YUEDONG TECHNOLOGY</small><h2>跃动科技</h2><p>以“1+4+N”青少年智慧体育系统,连接智慧场馆、智慧校园、体考体测与竞技比赛。</p><b>进入科技板块 →</b></div><span>TECH</span></RouterLink>
|
||||
<RouterLink v-reveal to="/health" class="innovation-card health-card"><div><small>YUEDONG HEALTH</small><h2>跃动健康</h2><p>融合体适能评估、运动干预与健康管理,为青少年构建科学、持续的成长支持。</p><b>进入健康板块 →</b></div><span>HEALTH</span></RouterLink>
|
||||
</section>
|
||||
|
||||
<section class="home-news">
|
||||
<div v-reveal class="container home-section-head"><div><span>EVENTS & NEWS</span><h2>赛事资讯</h2></div><RouterLink to="/events/news">更多赛事动态 →</RouterLink></div>
|
||||
@ -69,18 +87,29 @@
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { onBeforeUnmount, onMounted, ref } from 'vue';
|
||||
import products from '../data/product-details.json';
|
||||
import { pages } from '../data/page-content.js';
|
||||
|
||||
const featuredProducts = [products[0], products[32], products[58], products[70]].filter((item) => item?.images?.[0]);
|
||||
const ecosystems = [
|
||||
{ title: '赛事资讯', en: 'EVENTS', to: '/events/news', image: pages.events.hero?.src || '/site/assets/images/news/sports-og.jpg', description: '专业赛事、青少年竞技与全球跳绳文化交流。' },
|
||||
{ title: '产品装备', en: 'EQUIPMENT', to: '/products/categories', image: products[0]?.images?.[0], description: '覆盖竞速、花样、健身与智能计数的专业装备。' },
|
||||
{ title: '教育培训', en: 'EDUCATION', to: '/education/venues', image: pages.education.hero?.src || '/site/assets/images/banners/banner2.png', description: '运动馆、寒暑营和训练营组成的成长体系。' },
|
||||
{ title: '跃动科技', en: 'TECHNOLOGY', to: '/technology', image: '/site/assets/images/news/home-og@2x.png', description: '数字化能力为训练、赛事与场馆持续赋能。' },
|
||||
{ title: '跃动健康', en: 'HEALTH', to: '/health', image: pages.health.hero?.src || '/site/assets/images/news/sports-og.jpg', description: '运动促进健康,构建青少年科学干预方案。' },
|
||||
{ title: 'YGJRC', en: 'GLOBAL CLUB', to: '/ygjrc', image: pages.ygjrc.hero?.src || '/site/assets/images/banners/banner4.png', description: '连接全球运动员、教练与跳绳推广者。' }
|
||||
const honors = [
|
||||
{ year: '2019', title: '国家体育产业示范项目', image: '/site/assets/images/about/about.webp' },
|
||||
{ year: '2025', title: '《跳绳》国家标准起草单位', image: '/materials/关于跃动/009-跳绳国家标准-第一起草单位.webp' },
|
||||
{ year: '2023', title: '国际跳绳联合会合作伙伴', image: '/materials/关于跃动/008-世界跳绳锦标赛官方合作伙伴.webp' }
|
||||
];
|
||||
const activeHonor = ref(0);
|
||||
let honorTimer;
|
||||
const stopHonorRotation = () => { if (honorTimer) window.clearInterval(honorTimer); honorTimer = undefined; };
|
||||
const startHonorRotation = () => {
|
||||
stopHonorRotation();
|
||||
if (window.matchMedia('(prefers-reduced-motion: reduce)').matches) return;
|
||||
honorTimer = window.setInterval(() => { activeHonor.value = (activeHonor.value + 1) % honors.length; }, 4500);
|
||||
};
|
||||
const selectHonor = (index) => { activeHonor.value = index; startHonorRotation(); };
|
||||
const previousHonor = () => { activeHonor.value = (activeHonor.value - 1 + honors.length) % honors.length; startHonorRotation(); };
|
||||
const nextHonor = () => { activeHonor.value = (activeHonor.value + 1) % honors.length; startHonorRotation(); };
|
||||
onMounted(startHonorRotation);
|
||||
onBeforeUnmount(stopHonorRotation);
|
||||
const eventArticles = pages.events.sections.news.articles.slice(0, 3).map((article, index) => ({ ...article, image: pages.events.sections.news.gallery[index]?.src || pages.events.hero?.src, to: `/detail/events/news/${index}` }));
|
||||
|
||||
const vReveal = {
|
||||
|
||||