-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathscripts.js
More file actions
96 lines (68 loc) · 3.11 KB
/
scripts.js
File metadata and controls
96 lines (68 loc) · 3.11 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
(function () {
"use strict";
var chet, top, morph, aRGBStart, aRGBFinish, elemHeight, wh, maxBlockOffset, dh, maxDocOffset, step,
elem = document.getElementById('block'),
wrapper = document.getElementById('wrapper'),
sFadeStartColor = '#72cc35'; //стартовый цвет
chet = 0;
morph = true; // флаг трансформации
// парсим цвета
aRGBStart = sFadeStartColor.replace("#", "").match(/.{2}/g);
// диагональ ромба для вращения
elemHeight = elem.clientHeight * Math.sqrt(2);
// отступ от края с учетом диагонали при вращении
top = (elemHeight - elem.clientHeight) / 2;
wh = window.innerHeight;
// максимальный отступ блока
maxBlockOffset = wh - elemHeight;
// высота документа
dh = Math.max(
document.body.scrollHeight, document.documentElement.scrollHeight,
document.body.offsetHeight, document.documentElement.offsetHeight,
document.body.clientHeight, document.documentElement.clientHeight
);
// максимальнй отступ документа
maxDocOffset = dh - wh;
// шаг прокрутки
step = dh / 20;
document.addEventListener('scroll', onScroll);
// клик на фигуре останавливает трансформацию
elem.addEventListener('click', function () { morph = !morph; });
function onScroll(ev) {
// текущий отступ края экрана
var offset = window.pageYOffset;
var rate = offset / maxDocOffset;
// прокрутка до середины
if (rate * 100 < 50) setPostition(rate);
// трансформаируем да/нет
if (morph) setView(rate);
}
// промежуточный цвет
function getFadeMiddleColor() {
var R, G, B;
R = Math.floor(Math.random() * (256));
G = Math.floor(Math.random() * (256));
B = Math.floor(Math.random() * (256));
return 'rgb(' + R + ',' + G + ',' + B + ')';
}
// установка позиции
function setPostition(rate) {
var elem_offset = maxBlockOffset * rate + top;
elem.style.top = elem_offset + 'px';
}
// установка стилей и угла вращения
function setView(rate) {
elem.style.transform = 'rotate(' + Math.floor(45 * (1 + rate)) + 'deg)';
elem.style.backgroundColor = getFadeMiddleColor();
elem.style.borderRadius = Math.floor(rate * 100 / 2) + '%';
}
$(document).on('mousewheel DOMMouseScroll', function (e) {
e.preventDefault();
$("body").scrollTop(getDelta(e) < 0 ? chet += step : chet -= step);
});
function getDelta(e) {
var evt = e || window.event;
evt = evt.originalEvent ? evt.originalEvent : evt;
return evt.detail ? evt.detail * (-40) : evt.wheelDelta;
}
})();