Transition from CodePen
This commit is contained in:
parent
bbe767ba30
commit
bc535bf82e
|
@ -0,0 +1,116 @@
|
|||
"use strict";
|
||||
|
||||
/**
|
||||
* @author Arsen Mirzaev Tatyano-Muradovich <arsen@mirzaev.sexy>
|
||||
*/
|
||||
class hollow {
|
||||
// Размытие дальних слоёв
|
||||
blur = true;
|
||||
|
||||
// Затемнение дальних слоёв
|
||||
blackout = false;
|
||||
|
||||
// Увеличение размера дальнего слоя до краёв
|
||||
expand = false;
|
||||
|
||||
next() {
|
||||
// Инициализация идентификатора активного слоя
|
||||
const current = this.current();
|
||||
|
||||
// Генерация с защитой от выхода за предел масштабирования
|
||||
this.generate(
|
||||
current === document.getElementsByTagName("section").length - 1
|
||||
? current
|
||||
: current + 1
|
||||
);
|
||||
}
|
||||
|
||||
previous() {
|
||||
// Инициализация идентификатора активного слоя
|
||||
const current = this.current();
|
||||
|
||||
// Генерация с защитой от выхода за предел масштабирования
|
||||
this.generate(current === 0 ? current : current - 1);
|
||||
}
|
||||
|
||||
current() {
|
||||
// Инициализация номера слоя
|
||||
let id = 0;
|
||||
|
||||
for (const layer of document.getElementsByTagName("section")) {
|
||||
// Перебор слоёв
|
||||
|
||||
// Поиск активного слоя
|
||||
if (layer.style.scale === "1") return id;
|
||||
|
||||
// Запись идентификатора следующего слоя
|
||||
++id;
|
||||
}
|
||||
}
|
||||
|
||||
generate(zoom = 0) {
|
||||
// Инициализация номера слоя
|
||||
let id = 1;
|
||||
|
||||
for (const layer of document.getElementsByTagName("section")) {
|
||||
// Перебор слоёв
|
||||
|
||||
// Запись размера
|
||||
layer.style.scale = (zoom * 0.2 + 1 - 0.2 * (id - 1)).toFixed(1);
|
||||
|
||||
// Запись минимального размера
|
||||
if (+layer.style.scale < 0) layer.style.scale = 0;
|
||||
|
||||
// Запись максимального размера
|
||||
if (+layer.style.scale > 2) layer.style.scale = 2;
|
||||
|
||||
// Запись индекса
|
||||
layer.style.zIndex = zoom * 100 + 100 - id * 100;
|
||||
|
||||
if (this.expand && +layer.style.scale < 1) {
|
||||
// Расширение слоёв до границ
|
||||
|
||||
// Запись степени расширения
|
||||
const expand = +layer.style.scale <= 0.1 ? 0.1 : layer.style.scale;
|
||||
|
||||
layer.style.width = "calc(100% / " + expand + ")";
|
||||
layer.style.height = "calc(100% / " + expand + ")";
|
||||
layer.style.left = "calc((-100% / " + expand + " + 100%) / 2)";
|
||||
layer.style.top = "calc((-100% / " + expand + " + 100%) / 2)";
|
||||
}
|
||||
|
||||
if (+layer.style.scale <= 0 || +layer.style.scale > 1) {
|
||||
// Слой вышел за рамки отображаемых размеров
|
||||
|
||||
// Запись прозрачности
|
||||
layer.style.opacity = 0;
|
||||
} else if (+layer.style.scale === 1) {
|
||||
// Активный слой
|
||||
|
||||
// Запись эффектов
|
||||
layer.style.filter = null;
|
||||
|
||||
// Запись прозрачности
|
||||
layer.style.opacity = 1;
|
||||
} else {
|
||||
// Дальние слои
|
||||
|
||||
// Запись эффектов
|
||||
if (this.blur)
|
||||
layer.style.filter = "blur(" + (4 - layer.style.scale * 2) + "px)";
|
||||
if (this.blackout)
|
||||
layer.style.filter += "brightness(" + layer.style.scale * 100 + "%)";
|
||||
|
||||
// Запись прозрачности
|
||||
layer.style.opacity = layer.style.scale - 0.2;
|
||||
}
|
||||
|
||||
// Запись активности слушателей
|
||||
if (id === zoom + 1) layer.style.pointerEvents = "all";
|
||||
else layer.style.pointerEvents = "none";
|
||||
|
||||
// Запись идентификатора следующего слоя
|
||||
++id;
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue