Loading Image на JS
Создаём loading image средствами Javascript.
Демо на jsfiddle
<body></body>
<script>
(function () {
"use strict";
function _circle(top, left, size) {
var circle = document.createElement("DIV");
circle.style = "width: " + size + "px; height: " + size + "px; border-radius: " + (size * 10) + "px; position: fixed;" +
"background-color: #000000; top: " + top + "px; left: " + left + "px";
document.body.appendChild(circle);
return circle;
}
function _default(settings, defaultProps) {
if (!settings) settings = {};
for (var i in defaultProps) if ( !(i in settings) ) settings[i] = defaultProps[i];
return settings;
}
function _fx(circle, from, to, speed ) {
var start = +new Date();
fx();
function fx() {
var m = (+new Date() - start) / speed;
if (m > 1) m = 1; else setTimeout(fx, 17);
circle.style.width = circle.style.height = (from + (to - from) * m) + "px";
}
}
function _init(settings) {
settings = _default(settings, {
top : 100,
left : 100,
size : 10,
speed : 200,
circles : 8,
dispersion : 2,
by : 5
});
var circles = [];
var j = 0;
for (var i = 0; i < settings.circles; i++) {
circles.push(_circle( settings.top + Math.sin(i / settings.circles * 6.28) * settings.size * settings.dispersion,
settings.left + Math.cos(i / settings.circles * 6.28) * settings.size * settings.dispersion,
settings.size
));
}
var timer = setInterval(function () {
++j;
_fx( circles[j % settings.circles], settings.size, settings.size + settings.by, settings.speed );
_fx( circles[(j - 1) % settings.circles], settings.size + settings.by, settings.size, settings.speed );
}, settings.speed);
return {
remove : function () {
for (var i = 0; i < circles.length; i++) {
document.body.removeChild(circles[i]);
}
clearInterval(timer);
}
};
}
window.LoadingImage = _init;
})();
LoadingImage({ top : 50, left : 50 });
</script>
Функция возвращает метод remove(), который удаляет все кружки и интервал анимации. Также она принимает параметры (в скобках указаны параметры по умолчанию): Код:
top, left (100, 100) - координаты куда вставлять |
exec,
а почему бы не использовать requestAnimationFrame вместо setInterval? |
exec,
Прикольно, конечно, но сама идея в общем случае тупиковая - в любой момент дизайнер может придумать новую крутилку, которая не впишется в этот код. Так что лучше юзать старую добрую гифку, которую рисовальщик перерисует, если что :) Хотя если ты сам себе дизайнер (манагер), то вполне. |
Немного дописал код, главные изменения - теперь размер кружков меняется по цепочке (см. демо, параметр chain), а также можно менять opacity (параметр fade). Если fade больше нуля, у активных кружков opacity будет увеличиваться, если меньше нуля - то соответственно уменьшаться, в пример всё видно. Чтобы opacity не менялся вообще, fade следует поставить на 1.
<body></body>
<script>
(function () {
"use strict";
function _default(settings, defaultProps) {
if (!settings) settings = {};
for (var i in defaultProps) if ( !(i in settings) ) settings[i] = defaultProps[i];
return settings;
}
function _fx(circle, from, to, speed, opacityFrom, opacityTo ) {
var start = +new Date();
fx();
function fx() {
var m = (+new Date() - start) / speed;
if (m > 1) m = 1; else setTimeout(fx, 17);
circle.style.width = circle.style.height = (from + (to - from) * m) + "px";
if (opacityFrom) circle.style.opacity = opacityFrom + (opacityTo - opacityFrom) * m;
}
}
function _init(settings) {
settings = _default(settings, {
top : 100,
left : 100,
size : 10,
speed : 200,
circles : 8,
dispersion : 2,
by : 5,
color : "#000000",
chain : 1,
fade : -0.5
});
var reverse = false;
if (settings.fade < 0) {
settings.fade = -settings.fade;
reverse = true;
}
var x4 = reverse ? 1 : settings.fade;
var x3 = reverse ? -1 : 1;
var x2 = settings.size * settings.dispersion;
var x1 = 2 * x2 + settings.size - 1;
var circles = [];
var wrap = document.createElement("DIV");
wrap.style.cssText = "position: absolute; top: " + (settings.top - x2) + "px; left: " +
(settings.left - x2) + "px; width: " + x1 + "px; height:" + x1 + "px" ;
var j = -1;
for (var i = 0; i < settings.circles; i++) {
var circle = document.createElement("DIV");
circle.style.cssText = "width: " + settings.size + "px; height: " + settings.size + "px; position: fixed;" +
"background-color: " + settings.color + "; border-radius: " + (settings.size + settings.by) +
"px; top: " + (settings.top + Math.sin(i / settings.circles * 6.28) * x2) + "px; left: " +
(settings.left + Math.cos(i / settings.circles * 6.28) * x2) + "px; opacity: " +
(reverse ? 1 : settings.fade);
wrap.appendChild(circle);
circles.push(circle);
}
document.body.appendChild(wrap);
var timer = setInterval(function () {
++j;
_fx(
circles[j % settings.circles],
settings.size,
settings.size + settings.by,
settings.speed,
x4,
reverse ? settings.fade : 1 );
for (var i = 1; i <= settings.chain; i++) {
if ((j - i) % settings.circles < 0) continue;
_fx(
circles[(j - i) % settings.circles],
settings.size + settings.by * (settings.chain - i + 1) / settings.chain,
settings.size + settings.by * (settings.chain - i) / settings.chain,
settings.speed,
x4 + x3 * (1 - settings.fade) * (settings.chain - i + 1) / settings.chain,
x4 + x3 * (1 - settings.fade) * (settings.chain - i) / settings.chain
);
}
}, settings.speed);
return {
remove : function () {
document.body.removeChild(wrap);
clearInterval(timer);
},
image : wrap
};
}
window.LoadingImage = _init;
})();
LoadingImage({ top : 50, left : 50, speed : 100, by : 10, color : "#007fff", size : 20, chain : 5, fade: -0.5 });
LoadingImage({ top : 50, left : 200, speed : 100, by : 10, color : "#007fff", size : 20, chain : 5, fade: 0.5 });
LoadingImage({ top: 50, left : 350, speed : 100, by : 8, color : "#007fff", size : 10, chain : 10, fade: 1, circles : 16, dispersion : 4 });
</script>
|
Окончательная версия, убраны некоторые баги, добавлен chainEasing, призванный управлять поведением элементов в цепочке.
Демо |
Прикольно, мне понравилось
|
Эмуляция Солнечной системы
Пасхалка: если кликнуть на Солнце, оно взорвётся (станет красным гигантом), а планеты сойдут с орбит. |
[][$=({}+(_=__=''))[++_|++_+_]+({}+__)[--_]+([][_]+__)[_]+(!_+__)[_-~_]+(!!_+'')[--_]+(!_+__)[++_]+(!!_+__)[++_]+({}+__)[_+ ++_]+(!!_+__)[+__]+({}+__)[_/_]+(!!_+__)[+!__]][$]((!--_+__)[--_]+(!++_+__)[_]+(!!++_+__)[_]+(!!--_+__)[--_]+(!!_+__)[--_]+(_[$]+__)[(++_+ ++_)*++_+ ++_+!![]+!![]]+(_[$]+__)[_*_])()
|
Я читал, когда солнце станет красным гигантом планеты не улетят, сгорят на своих орбитах, и да планет пока 8.
|
mtx.js 1.0
Пришла идея сделать jQuery-подобную библиотеку для работы с мат. объектами, начнём с матриц. Тут же возникает вопрос: смещать ли нумерацию? Т.е. должен ли matrix[1][1] находить первый элемент первого столбца, а не второй элемент второго? |
| Часовой пояс GMT +3, время: 08:31. |