sdelat-slayd-po-postupleniya/index.html

135 lines
14 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!doctype html>
<html lang="ru">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Алматы — достопримечательности</title>
<script src="https://cdn.jsdelivr.net/npm/pptxgenjs@3.12.0/dist/pptxgen.bundle.js"></script>
<style>
* { margin: 0; box-sizing: border-box; }
:root { --bg:#0f1218; --card:#171a21; --fg:#f4f4f5; --muted:#a1a1aa; --acc:#00b8cc; --acc2:#f4b942; }
body { font-family: -apple-system, "Segoe UI", Roboto, "Helvetica Neue", sans-serif; background: var(--bg); color: var(--fg); }
.slide { display: none; min-height: 100vh; padding: 7vh 9vw; flex-direction: column; justify-content: center; }
.slide.on { display: flex; }
.slide.odd { background: linear-gradient(160deg, #0f1218 0%, #151b26 100%); }
.eyebrow { color: var(--acc2); font-size: clamp(12px, 1.4vw, 15px); font-weight: 700; text-transform: uppercase; letter-spacing: .18em; margin-bottom: 14px; }
.slide h1 { font-size: clamp(30px, 5.2vw, 58px); line-height: 1.15; font-weight: 800; letter-spacing: -.01em; margin-bottom: 24px; }
.title-slide h1 { font-size: clamp(40px, 8vw, 84px); }
.subtitle { color: var(--muted); font-size: clamp(16px, 2.2vw, 24px); line-height: 1.5; max-width: 22em; margin-bottom: 30px; }
.meta { margin-top: auto; padding-top: 40px; color: var(--muted); font-size: clamp(13px, 1.6vw, 17px); letter-spacing: .04em; line-height: 1.7; }
.split { display: grid; grid-template-columns: 1fr 1fr; gap: clamp(24px, 5vw, 64px); align-items: center; flex: 1; }
@media (max-width: 900px) { .split { grid-template-columns: 1fr; } .photo img { height: 300px; } }
.split .text { order: 1; display: flex; flex-direction: column; justify-content: center; }
.photo-wrap { order: 2; display: flex; align-items: center; }
.slide.odd .photo-wrap { order: 1; }
.photo { position: relative; width: 100%; border-radius: 20px; overflow: hidden; box-shadow: 0 24px 60px rgba(0,0,0,.5); background: linear-gradient(135deg, #1e2530, #131a24); }
.photo img { display: block; width: 100%; height: clamp(260px, 44vh, 480px); object-fit: cover; }
.photo .ph-cap { position: absolute; left: 0; right: 0; bottom: 0; padding: 14px 18px; font-size: 14px; color: #e4e4e7; background: linear-gradient(transparent, rgba(10,12,16,.85)); }
.photo .ph-ic { position: absolute; inset: 0; display: flex; align-items: center; justify-content: center; color: rgba(0,184,204,.25); font-size: 70px; font-weight: 800; letter-spacing: .08em; text-align: center; }
ul.facts { list-style: none; }
.facts li { font-size: clamp(15px, 1.9vw, 20px); line-height: 1.5; margin-bottom: 12px; padding-left: 30px; position: relative; color: #d4d4d8; }
.facts li::before { content: ""; position: absolute; left: 0; top: .45em; width: 13px; height: 13px; border-radius: 4px; background: var(--acc); }
.num { position: fixed; bottom: 16px; right: 22px; color: #8a8a92; font-size: 14px; letter-spacing: .05em; }
.nav { position: fixed; bottom: 12px; left: 20px; display: flex; gap: 8px; z-index: 10; }
.nav button { border: 1px solid #333; background: #171719; color: #f4f4f5; border-radius: 9px; padding: 9px 15px; cursor: pointer; font-size: 14px; font-family: inherit; }
.nav button:hover { border-color: var(--acc); }
.nav .pptx { border-color: var(--acc); color: #9beeff; }
@media (max-width: 700px) { .nav button { padding: 8px 10px; font-size: 12px; } .num { display: none; } }
@media print {
.nav, .num { display: none; }
.slide { display: flex; page-break-after: always; min-height: 100vh; padding: 10vh 10vw; }
}
</style>
</head>
<body>
<div id="deck"></div>
<div class="nav">
<button onclick="go(-1)">&larr; Назад</button>
<button onclick="go(1)">Вперёд &rarr;</button>
<button class="pptx" onclick="downloadPptx()">Скачать .pptx</button>
<button onclick="window.print()">Печать / PDF</button>
</div>
<div class="num" id="num"></div>
<script>
var SLIDES = [
{ title: "Алматы — горный город", bullets: ["Седьмая столица Казахстана и самый южный крупный город страны, в двух шагах от горного хребта Заилийский Алатау", "Где горы встречаются с небоскрёбами: современный мегаполис, окружённый снежными пиками"] },
{ title: "Кен Аса", bullets: ["Смотровая площадка на высоте 2 265 м — самая высокая точка города", "Туда ведёт канатная дорога прямо из центра, второй канат поднимает ещё выше, к подножию ледников", "Отсюда вид на весь Алматы: от многоэтажек мегаполиса до снежных вершин Алатау", "Летом — тропы, велосипед и чистый горный воздух, зимой — горнолыжный склон"] },
{ title: "Денежный мост", bullets: ["Мост через реку Алматы, соединяющий центр города с микрорайоном Бостандык", "Длиной 1 462 м — один из самых длинных мостов в Казахстане", "Вечером мост подсвечивают: отражение фонарей в воде — классика фотосессий в Алматы", "Рядом спускается канатная дорога на Кен Асу — удобно начать вечернюю прогулку"] },
{ title: "Мемориальный комплекс «Астанай-Бел»", bullets: ["Парк памяти жертвам массовых репрессий и воинам, погибшим в локальных войнах", "В центре — 43-метровый шпиль из стекла: днём светится, ночью подсветка меняется по цветам", "Ухоженная территория: сквер, фонтан и мемориальная стена с именами", "Место для спокойного вечера без суеты центра"] },
{ title: "Оперный театр имени Абай", bullets: ["Главная сцена страны: здание построено в 2016 году в современном стиле", "Рядом — площадь Абая и фонтаны, одна из старейших площадей города", "Опера, балет, драматические спектакли и концерты симфонического оркестра", "Ночью facade здания эффектно подсвечивается — красиво видно с площади"] },
{ title: "Центральный рынок", bullets: ["Крупнейший продуктовый рынок Алматы — один из крупнейших в Центральной Азии", "Тысячи торговых мест: фермерские продукты, орехи, сухофрукты, специи и мёд", "Отдельные дворы посвящены юфти, шубам и платкам — здесь берут сувениры", "Приезжайте на голодный желудок: тут же чай, шашлык и наливки"] },
{ title: "Алматинский зоопарк", bullets: ["Один из крупнейших зоопарков СНГ: более 300 видов животных на 24 гектарах", "Белые тигры, снежные барсы, львы, жирафы и пингвины", "Рядом — Ботанический сад и аттракционы для детей", "Идеально на полдня: животные, растения и прогулка в одном месте"] },
{ title: "Фонтаны Алматы", bullets: ["Фонтаны — один из главных символов города: десятки в разных районах, несколько — главных", "Главные — Алма-Атинские фонтаны у Оперного театра, фонтан «Шанырақ» в парке 28 гвардейской и фонтанные композиции на площади Абая", "Вечером фонтаны подсвечиваются: у главного — 3 000 ламп, в летние месяцы — световые шоу", "Как распределить прогулку по фонтанам — на слайдах"] },
{ title: "Алма-Атинские фонтаны", bullets: ["Один из крупнейших фонтанных комплексов Центральной Азии: шесть лучей, поднятых вверх, подающих воду на высоту более 20 метров", "В вечерней подсветке работают 3 000 ламп; летом — световые шоу на фоне гор", "Комплекс находится у Оперного театра имени Абай — удобно совместить с прогулкой по площади Абая", "Днём — тихое место для прогулок; вечером — очередь на селфи"] },
{ title: "Фонтан «Шанырақ»", bullets: ["Главный фонтан в Центральном парке 28 гвардейской; имя — «Шанырақ» (юрта) — по форме купола", "Световые струи и подсветка; летом вечером играет музыка", "Лучшее время — закат: силуэт фонтана и горы на фоне", "Три минуты пешком от станции метро «Алматинский зоопарк»"] },
{ title: "Площадь Абая и Оперный театр", bullets: ["Площадь с фонтанами у Оперного театра имени Абай — классика вечерней прогулки", "Ночью фасад театра и фонтаны подсвечиваются — красиво видеть с площади", "Рядом — фуд-корты с видом на фонтаны, уличные кафе и сувенирные лавки", "Здание театра построено в 2016 году, рядом — памятник Абаю"] },
{ title: "Итоги: прогулка по фонтанам", bullets: ["Утро — Центральный фонтан у Оперного театра, пока никого", "День — фонтан «Шанырақ» в Центральном парке, обед в фуд-корте рядом", "Вечер — площадь Абая, световое шоу и фуд-корты с видом на фасад театра", "Скачать .pptx или Ctrl+P → PDF, чтобы взять распечатку с собой"] }
];
var PHOTOS = {
0: { seed: "fountains-main", cap: "Алма-Атинские фонтаны у Оперного театра" },
1: { seed: "fountains-main", cap: "Шесть лучей · 3 000 ламп · горный хребет на фоне" },
2: { seed: "shanyrak-fountain", cap: "Фонтан «Шанырақ» в Центральном парке" },
3: { seed: "abay-square", cap: "Площадь Абая: фонтаны и Оперный театр" },
4: { seed: "fountain-night", cap: "Алматы ночью: фонтаны и огни" }
};
var cur = 0;
function render() {
var deck = document.getElementById("deck");
deck.innerHTML = SLIDES.map(function (s, i) {
var ph = PHOTOS[i];
if (i === 0) {
return '<section class="slide title-slide' + (i === cur ? " on" : "") + '">' +
'<div class="eyebrow">Презентация · Казахстан</div>' +
'<h1>' + s.title + '</h1>' +
'<div class="subtitle">' + s.bullets[0] + '</div>' +
'<div class="meta">' + s.bullets.slice(1).join(" · ") + '</div>' +
'</section>';
}
var photo = '<div class="photo"><div class="ph-ic">' + s.title.split(" ")[0].substring(0, 2).toUpperCase() + '</div><img src="img/' + ph.seed + '.jpg" onerror="this.style.display=\'none\'" alt="' + s.title + '" loading="lazy"><span class="ph-cap">' + ph.cap + '</span></div>';
var cls = "slide" + (i % 2 === 1 ? " odd" : "") + (i === cur ? " on" : "");
return '<section class="' + cls + '">' +
'<div class="split"><div class="text">' +
'<div class="eyebrow">Алматы · место ' + i + ' из ' + (SLIDES.length - 1) + '</div>' +
'<h1>' + s.title + '</h1>' +
'<ul class="facts">' + s.bullets.map(function (b) { return "<li>" + b + "</li>"; }).join("") + '</ul>' +
'</div><div class="photo-wrap">' + photo + '</div></div>' +
'</section>';
}).join("");
document.getElementById("num").textContent = (cur + 1) + " / " + SLIDES.length;
}
function go(d) { cur = Math.min(SLIDES.length - 1, Math.max(0, cur + d)); render(); }
document.addEventListener("keydown", function (e) {
if (e.key === "ArrowRight" || e.key === " " || e.key === "PageDown") go(1);
if (e.key === "ArrowLeft" || e.key === "PageUp") go(-1);
});
function downloadPptx() {
var p = new PptxGenJS();
p.defineLayout({ name: "W", width: 13.33, height: 7.5 });
p.layout = "W";
SLIDES.forEach(function (s, i) {
var sl = p.addSlide();
sl.background = { color: "0F1218" };
if (i === 0) {
sl.addText("Презентация · Казахстан", { x: 0.7, y: 0.9, w: 12, h: 0.4, fontSize: 13, color: "F4B942", charSpacing: 3 });
sl.addText(s.title, { x: 0.7, y: 1.5, w: 12, h: 2.2, fontSize: 44, bold: true, color: "F4F4F5" });
sl.addText(s.bullets.join("\n"), { x: 0.7, y: 4.0, w: 12, h: 2.6, fontSize: 18, color: "A1A1AA", lineSpacingMultiple: 1.4 });
return;
}
var ph = PHOTOS[i];
sl.addText("Алматы · место " + i + " из " + (SLIDES.length - 1), { x: 0.7, y: 0.5, w: 12, h: 0.4, fontSize: 11, color: "F4B942", charSpacing: 2 });
try {
sl.addImage({ path: "img/" + ph.seed + ".jpg", x: 7.3, y: 0.5, w: 5.5, h: 6.5, sizing: { type: "cover", w: 5.5, h: 6.5 } });
} catch (e) {}
sl.addText(s.title, { x: 0.7, y: 1.0, w: 6.3, h: 1.4, fontSize: 30, bold: true, color: "F4F4F5" });
sl.addText(s.bullets.map(function (b) { return { text: b, options: { bullet: true, breakLine: true } }; }),
{ x: 0.7, y: 2.6, w: 6.3, h: 4.4, fontSize: 15, color: "E4E4E7", lineSpacingMultiple: 1.35, paraSpaceAfter: 8 });
});
p.writeFile({ fileName: "almaty-dostoprimechatelnosti.pptx" });
}
render();
</script>
</body>
</html>