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, время: 23:01. |